2003-10-06 Andrew Cagney <cagney@redhat.com>
[external/binutils.git] / gdb / dbxread.c
1 /* Read dbx symbol tables and convert to internal format, for GDB.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003.
4    Free Software Foundation, Inc.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22
23 /* This module provides three functions: dbx_symfile_init,
24    which initializes to read a symbol file; dbx_new_init, which 
25    discards existing cached information when all symbols are being
26    discarded; and dbx_symfile_read, which reads a symbol table
27    from a file.
28
29    dbx_symfile_read only does the minimum work necessary for letting the
30    user "name" things symbolically; it does not read the entire symtab.
31    Instead, it reads the external and static symbols and puts them in partial
32    symbol tables.  When more extensive information is requested of a
33    file, the corresponding partial symbol table is mutated into a full
34    fledged symbol table by going back and reading the symbols
35    for real.  dbx_psymtab_to_symtab() is the function that does this */
36
37 #include "defs.h"
38 #include "gdb_string.h"
39
40 #if defined(USG) || defined(__CYGNUSCLIB__)
41 #include <sys/types.h>
42 #include <fcntl.h>
43 #endif
44
45 #include "gdb_obstack.h"
46 #include "gdb_stat.h"
47 #include "symtab.h"
48 #include "breakpoint.h"
49 #include "target.h"
50 #include "gdbcore.h"            /* for bfd stuff */
51 #include "libaout.h"            /* FIXME Secret internal BFD stuff for a.out */
52 #include "symfile.h"
53 #include "objfiles.h"
54 #include "buildsym.h"
55 #include "stabsread.h"
56 #include "gdb-stabs.h"
57 #include "demangle.h"
58 #include "language.h"           /* Needed for local_hex_string */
59 #include "complaints.h"
60 #include "cp-abi.h"
61 #include "gdb_assert.h"
62
63 #include "aout/aout64.h"
64 #include "aout/stab_gnu.h"      /* We always use GNU stabs, not native, now */
65 \f
66
67 /* This macro returns the size field of a minimal symbol, which is normally
68    stored in the "info" field.  The macro can be overridden for specific
69    targets (e.g. MIPS16) that use the info field for other purposes.  */
70 #ifndef MSYMBOL_SIZE
71 #define MSYMBOL_SIZE(msym) ((long) MSYMBOL_INFO (msym))
72 #endif
73
74
75 /* We put a pointer to this structure in the read_symtab_private field
76    of the psymtab.  */
77
78 struct symloc
79   {
80     /* Offset within the file symbol table of first local symbol for this
81        file.  */
82
83     int ldsymoff;
84
85     /* Length (in bytes) of the section of the symbol table devoted to
86        this file's symbols (actually, the section bracketed may contain
87        more than just this file's symbols).  If ldsymlen is 0, the only
88        reason for this thing's existence is the dependency list.  Nothing
89        else will happen when it is read in.  */
90
91     int ldsymlen;
92
93     /* The size of each symbol in the symbol file (in external form).  */
94
95     int symbol_size;
96
97     /* Further information needed to locate the symbols if they are in
98        an ELF file.  */
99
100     int symbol_offset;
101     int string_offset;
102     int file_string_offset;
103   };
104
105 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
106 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
107 #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
108 #define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
109 #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
110 #define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
111 #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset)
112 \f
113
114 /* Remember what we deduced to be the source language of this psymtab. */
115
116 static enum language psymtab_language = language_unknown;
117
118 /* The BFD for this file -- implicit parameter to next_symbol_text.  */
119
120 static bfd *symfile_bfd;
121
122 /* The size of each symbol in the symbol file (in external form).
123    This is set by dbx_symfile_read when building psymtabs, and by
124    dbx_psymtab_to_symtab when building symtabs.  */
125
126 static unsigned symbol_size;
127
128 /* This is the offset of the symbol table in the executable file. */
129
130 static unsigned symbol_table_offset;
131
132 /* This is the offset of the string table in the executable file. */
133
134 static unsigned string_table_offset;
135
136 /* For elf+stab executables, the n_strx field is not a simple index
137    into the string table.  Instead, each .o file has a base offset in
138    the string table, and the associated symbols contain offsets from
139    this base.  The following two variables contain the base offset for
140    the current and next .o files. */
141
142 static unsigned int file_string_table_offset;
143 static unsigned int next_file_string_table_offset;
144
145 /* .o and NLM files contain unrelocated addresses which are based at
146    0.  When non-zero, this flag disables some of the special cases for
147    Solaris elf+stab text addresses at location 0. */
148
149 static int symfile_relocatable = 0;
150
151 /* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are
152    relative to the function start address.  */
153
154 static int block_address_function_relative = 0;
155 \f
156 /* The lowest text address we have yet encountered.  This is needed
157    because in an a.out file, there is no header field which tells us
158    what address the program is actually going to be loaded at, so we
159    need to make guesses based on the symbols (which *are* relocated to
160    reflect the address it will be loaded at).  */
161
162 static CORE_ADDR lowest_text_address;
163
164 /* Non-zero if there is any line number info in the objfile.  Prevents
165    end_psymtab from discarding an otherwise empty psymtab.  */
166
167 static int has_line_numbers;
168
169 /* Complaints about the symbols we have encountered.  */
170
171 static void
172 unknown_symtype_complaint (const char *arg1)
173 {
174   complaint (&symfile_complaints, "unknown symbol type %s", arg1);
175 }
176
177 static void
178 lbrac_mismatch_complaint (int arg1)
179 {
180   complaint (&symfile_complaints,
181              "N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", arg1);
182 }
183
184 static void
185 repeated_header_complaint (const char *arg1, int arg2)
186 {
187   complaint (&symfile_complaints,
188              "\"repeated\" header file %s not previously seen, at symtab pos %d",
189              arg1, arg2);
190 }
191
192 /* find_text_range --- find start and end of loadable code sections
193
194    The find_text_range function finds the shortest address range that
195    encloses all sections containing executable code, and stores it in
196    objfile's text_addr and text_size members.
197
198    dbx_symfile_read will use this to finish off the partial symbol
199    table, in some cases.  */
200
201 static void
202 find_text_range (bfd * sym_bfd, struct objfile *objfile)
203 {
204   asection *sec;
205   int found_any = 0;
206   CORE_ADDR start = 0;
207   CORE_ADDR end = 0;
208
209   for (sec = sym_bfd->sections; sec; sec = sec->next)
210     if (bfd_get_section_flags (sym_bfd, sec) & SEC_CODE)
211       {
212         CORE_ADDR sec_start = bfd_section_vma (sym_bfd, sec);
213         CORE_ADDR sec_end = sec_start + bfd_section_size (sym_bfd, sec);
214
215         if (found_any)
216           {
217             if (sec_start < start)
218               start = sec_start;
219             if (sec_end > end)
220               end = sec_end;
221           }
222         else
223           {
224             start = sec_start;
225             end = sec_end;
226           }
227
228         found_any = 1;
229       }
230
231   if (!found_any)
232     error ("Can't find any code sections in symbol file");
233
234   DBX_TEXT_ADDR (objfile) = start;
235   DBX_TEXT_SIZE (objfile) = end - start;
236 }
237 \f
238
239
240 /* During initial symbol readin, we need to have a structure to keep
241    track of which psymtabs have which bincls in them.  This structure
242    is used during readin to setup the list of dependencies within each
243    partial symbol table. */
244
245 struct header_file_location
246 {
247   char *name;                   /* Name of header file */
248   int instance;                 /* See above */
249   struct partial_symtab *pst;   /* Partial symtab that has the
250                                    BINCL/EINCL defs for this file */
251 };
252
253 /* The actual list and controling variables */
254 static struct header_file_location *bincl_list, *next_bincl;
255 static int bincls_allocated;
256
257 /* Local function prototypes */
258
259 extern void _initialize_dbxread (void);
260
261 static void read_ofile_symtab (struct partial_symtab *);
262
263 static void dbx_psymtab_to_symtab (struct partial_symtab *);
264
265 static void dbx_psymtab_to_symtab_1 (struct partial_symtab *);
266
267 static void read_dbx_dynamic_symtab (struct objfile *objfile);
268
269 static void read_dbx_symtab (struct objfile *);
270
271 static void free_bincl_list (struct objfile *);
272
273 static struct partial_symtab *find_corresponding_bincl_psymtab (char *, int);
274
275 static void add_bincl_to_list (struct partial_symtab *, char *, int);
276
277 static void init_bincl_list (int, struct objfile *);
278
279 static char *dbx_next_symbol_text (struct objfile *);
280
281 static void fill_symbuf (bfd *);
282
283 static void dbx_symfile_init (struct objfile *);
284
285 static void dbx_new_init (struct objfile *);
286
287 static void dbx_symfile_read (struct objfile *, int);
288
289 static void dbx_symfile_finish (struct objfile *);
290
291 static void record_minimal_symbol (char *, CORE_ADDR, int, struct objfile *);
292
293 static void add_new_header_file (char *, int);
294
295 static void add_old_header_file (char *, int);
296
297 static void add_this_object_header_file (int);
298
299 static struct partial_symtab *start_psymtab (struct objfile *, char *,
300                                              CORE_ADDR, int,
301                                              struct partial_symbol **,
302                                              struct partial_symbol **);
303
304 /* Free up old header file tables */
305
306 void
307 free_header_files (void)
308 {
309   if (this_object_header_files)
310     {
311       xfree (this_object_header_files);
312       this_object_header_files = NULL;
313     }
314   n_allocated_this_object_header_files = 0;
315 }
316
317 /* Allocate new header file tables */
318
319 void
320 init_header_files (void)
321 {
322   n_allocated_this_object_header_files = 10;
323   this_object_header_files = (int *) xmalloc (10 * sizeof (int));
324 }
325
326 /* Add header file number I for this object file
327    at the next successive FILENUM.  */
328
329 static void
330 add_this_object_header_file (int i)
331 {
332   if (n_this_object_header_files == n_allocated_this_object_header_files)
333     {
334       n_allocated_this_object_header_files *= 2;
335       this_object_header_files
336         = (int *) xrealloc ((char *) this_object_header_files,
337                        n_allocated_this_object_header_files * sizeof (int));
338     }
339
340   this_object_header_files[n_this_object_header_files++] = i;
341 }
342
343 /* Add to this file an "old" header file, one already seen in
344    a previous object file.  NAME is the header file's name.
345    INSTANCE is its instance code, to select among multiple
346    symbol tables for the same header file.  */
347
348 static void
349 add_old_header_file (char *name, int instance)
350 {
351   struct header_file *p = HEADER_FILES (current_objfile);
352   int i;
353
354   for (i = 0; i < N_HEADER_FILES (current_objfile); i++)
355     if (STREQ (p[i].name, name) && instance == p[i].instance)
356       {
357         add_this_object_header_file (i);
358         return;
359       }
360   repeated_header_complaint (name, symnum);
361 }
362
363 /* Add to this file a "new" header file: definitions for its types follow.
364    NAME is the header file's name.
365    Most often this happens only once for each distinct header file,
366    but not necessarily.  If it happens more than once, INSTANCE has
367    a different value each time, and references to the header file
368    use INSTANCE values to select among them.
369
370    dbx output contains "begin" and "end" markers for each new header file,
371    but at this level we just need to know which files there have been;
372    so we record the file when its "begin" is seen and ignore the "end".  */
373
374 static void
375 add_new_header_file (char *name, int instance)
376 {
377   int i;
378   struct header_file *hfile;
379
380   /* Make sure there is room for one more header file.  */
381
382   i = N_ALLOCATED_HEADER_FILES (current_objfile);
383
384   if (N_HEADER_FILES (current_objfile) == i)
385     {
386       if (i == 0)
387         {
388           N_ALLOCATED_HEADER_FILES (current_objfile) = 10;
389           HEADER_FILES (current_objfile) = (struct header_file *)
390             xmalloc (10 * sizeof (struct header_file));
391         }
392       else
393         {
394           i *= 2;
395           N_ALLOCATED_HEADER_FILES (current_objfile) = i;
396           HEADER_FILES (current_objfile) = (struct header_file *)
397             xrealloc ((char *) HEADER_FILES (current_objfile),
398                       (i * sizeof (struct header_file)));
399         }
400     }
401
402   /* Create an entry for this header file.  */
403
404   i = N_HEADER_FILES (current_objfile)++;
405   hfile = HEADER_FILES (current_objfile) + i;
406   hfile->name = savestring (name, strlen (name));
407   hfile->instance = instance;
408   hfile->length = 10;
409   hfile->vector
410     = (struct type **) xmalloc (10 * sizeof (struct type *));
411   memset (hfile->vector, 0, 10 * sizeof (struct type *));
412
413   add_this_object_header_file (i);
414 }
415
416 #if 0
417 static struct type **
418 explicit_lookup_type (int real_filenum, int index)
419 {
420   struct header_file *f = &HEADER_FILES (current_objfile)[real_filenum];
421
422   if (index >= f->length)
423     {
424       f->length *= 2;
425       f->vector = (struct type **)
426         xrealloc (f->vector, f->length * sizeof (struct type *));
427       memset (&f->vector[f->length / 2],
428               '\0', f->length * sizeof (struct type *) / 2);
429     }
430   return &f->vector[index];
431 }
432 #endif
433 \f
434 static void
435 record_minimal_symbol (char *name, CORE_ADDR address, int type,
436                        struct objfile *objfile)
437 {
438   enum minimal_symbol_type ms_type;
439   int section;
440   asection *bfd_section;
441
442   switch (type)
443     {
444     case N_TEXT | N_EXT:
445       ms_type = mst_text;
446       section = SECT_OFF_TEXT (objfile);
447       bfd_section = DBX_TEXT_SECTION (objfile);
448       break;
449     case N_DATA | N_EXT:
450       ms_type = mst_data;
451       section = SECT_OFF_DATA (objfile);
452       bfd_section = DBX_DATA_SECTION (objfile);
453       break;
454     case N_BSS | N_EXT:
455       ms_type = mst_bss;
456       section = SECT_OFF_BSS (objfile);
457       bfd_section = DBX_BSS_SECTION (objfile);
458       break;
459     case N_ABS | N_EXT:
460       ms_type = mst_abs;
461       section = -1;
462       bfd_section = NULL;
463       break;
464 #ifdef N_SETV
465     case N_SETV | N_EXT:
466       ms_type = mst_data;
467       section = SECT_OFF_DATA (objfile);
468       bfd_section = DBX_DATA_SECTION (objfile);
469       break;
470     case N_SETV:
471       /* I don't think this type actually exists; since a N_SETV is the result
472          of going over many .o files, it doesn't make sense to have one
473          file local.  */
474       ms_type = mst_file_data;
475       section = SECT_OFF_DATA (objfile);
476       bfd_section = DBX_DATA_SECTION (objfile);
477       break;
478 #endif
479     case N_TEXT:
480     case N_NBTEXT:
481     case N_FN:
482     case N_FN_SEQ:
483       ms_type = mst_file_text;
484       section = SECT_OFF_TEXT (objfile);
485       bfd_section = DBX_TEXT_SECTION (objfile);
486       break;
487     case N_DATA:
488       ms_type = mst_file_data;
489
490       /* Check for __DYNAMIC, which is used by Sun shared libraries. 
491          Record it as global even if it's local, not global, so
492          lookup_minimal_symbol can find it.  We don't check symbol_leading_char
493          because for SunOS4 it always is '_'.  */
494       if (name[8] == 'C' && STREQ ("__DYNAMIC", name))
495         ms_type = mst_data;
496
497       /* Same with virtual function tables, both global and static.  */
498       {
499         char *tempstring = name;
500         if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
501           ++tempstring;
502         if (is_vtable_name (tempstring))
503           ms_type = mst_data;
504       }
505       section = SECT_OFF_DATA (objfile);
506       bfd_section = DBX_DATA_SECTION (objfile);
507       break;
508     case N_BSS:
509       ms_type = mst_file_bss;
510       section = SECT_OFF_BSS (objfile);
511       bfd_section = DBX_BSS_SECTION (objfile);
512       break;
513     default:
514       ms_type = mst_unknown;
515       section = -1;
516       bfd_section = NULL;
517       break;
518     }
519
520   if ((ms_type == mst_file_text || ms_type == mst_text)
521       && address < lowest_text_address)
522     lowest_text_address = address;
523
524   prim_record_minimal_symbol_and_info
525     (name, address, ms_type, NULL, section, bfd_section, objfile);
526 }
527 \f
528 /* Scan and build partial symbols for a symbol file.
529    We have been initialized by a call to dbx_symfile_init, which 
530    put all the relevant info into a "struct dbx_symfile_info",
531    hung off the objfile structure.
532
533    MAINLINE is true if we are reading the main symbol
534    table (as opposed to a shared lib or dynamically loaded file).  */
535
536 static void
537 dbx_symfile_read (struct objfile *objfile, int mainline)
538 {
539   bfd *sym_bfd;
540   int val;
541   struct cleanup *back_to;
542
543   sym_bfd = objfile->obfd;
544
545   /* .o and .nlm files are relocatables with text, data and bss segs based at
546      0.  This flag disables special (Solaris stabs-in-elf only) fixups for
547      symbols with a value of 0.  */
548
549   symfile_relocatable = bfd_get_file_flags (sym_bfd) & HAS_RELOC;
550
551   /* This is true for Solaris (and all other systems which put stabs
552      in sections, hopefully, since it would be silly to do things
553      differently from Solaris), and false for SunOS4 and other a.out
554      file formats.  */
555   block_address_function_relative =
556     ((0 == strncmp (bfd_get_target (sym_bfd), "elf", 3))
557      || (0 == strncmp (bfd_get_target (sym_bfd), "som", 3))
558      || (0 == strncmp (bfd_get_target (sym_bfd), "coff", 4))
559      || (0 == strncmp (bfd_get_target (sym_bfd), "pe", 2))
560      || (0 == strncmp (bfd_get_target (sym_bfd), "epoc-pe", 7))
561      || (0 == strncmp (bfd_get_target (sym_bfd), "nlm", 3)));
562
563   val = bfd_seek (sym_bfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
564   if (val < 0)
565     perror_with_name (objfile->name);
566
567   /* If we are reinitializing, or if we have never loaded syms yet, init */
568   if (mainline
569       || (objfile->global_psymbols.size == 0
570           &&  objfile->static_psymbols.size == 0))
571     init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
572
573   symbol_size = DBX_SYMBOL_SIZE (objfile);
574   symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
575
576   free_pending_blocks ();
577   back_to = make_cleanup (really_free_pendings, 0);
578
579   init_minimal_symbol_collection ();
580   make_cleanup_discard_minimal_symbols ();
581
582   /* Read stabs data from executable file and define symbols. */
583
584   read_dbx_symtab (objfile);
585
586   /* Add the dynamic symbols.  */
587
588   read_dbx_dynamic_symtab (objfile);
589
590   /* Install any minimal symbols that have been collected as the current
591      minimal symbols for this objfile. */
592
593   install_minimal_symbols (objfile);
594
595   do_cleanups (back_to);
596 }
597
598 /* Initialize anything that needs initializing when a completely new
599    symbol file is specified (not just adding some symbols from another
600    file, e.g. a shared library).  */
601
602 static void
603 dbx_new_init (struct objfile *ignore)
604 {
605   stabsread_new_init ();
606   buildsym_new_init ();
607   init_header_files ();
608 }
609
610
611 /* dbx_symfile_init ()
612    is the dbx-specific initialization routine for reading symbols.
613    It is passed a struct objfile which contains, among other things,
614    the BFD for the file whose symbols are being read, and a slot for a pointer
615    to "private data" which we fill with goodies.
616
617    We read the string table into malloc'd space and stash a pointer to it.
618
619    Since BFD doesn't know how to read debug symbols in a format-independent
620    way (and may never do so...), we have to do it ourselves.  We will never
621    be called unless this is an a.out (or very similar) file. 
622    FIXME, there should be a cleaner peephole into the BFD environment here.  */
623
624 #define DBX_STRINGTAB_SIZE_SIZE sizeof(long)    /* FIXME */
625
626 static void
627 dbx_symfile_init (struct objfile *objfile)
628 {
629   int val;
630   bfd *sym_bfd = objfile->obfd;
631   char *name = bfd_get_filename (sym_bfd);
632   asection *text_sect;
633   unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
634
635   /* Allocate struct to keep track of the symfile */
636   objfile->sym_stab_info = (struct dbx_symfile_info *)
637     xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
638   memset (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
639
640   DBX_TEXT_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
641   DBX_DATA_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".data");
642   DBX_BSS_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".bss");
643
644   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
645 #define STRING_TABLE_OFFSET     (sym_bfd->origin + obj_str_filepos (sym_bfd))
646 #define SYMBOL_TABLE_OFFSET     (sym_bfd->origin + obj_sym_filepos (sym_bfd))
647
648   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
649
650   DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
651
652   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
653   if (!text_sect)
654     error ("Can't find .text section in symbol file");
655   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
656   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
657
658   DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
659   DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
660   DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
661
662   /* Read the string table and stash it away in the psymbol_obstack.  It is
663      only needed as long as we need to expand psymbols into full symbols,
664      so when we blow away the psymbol the string table goes away as well.
665      Note that gdb used to use the results of attempting to malloc the
666      string table, based on the size it read, as a form of sanity check
667      for botched byte swapping, on the theory that a byte swapped string
668      table size would be so totally bogus that the malloc would fail.  Now
669      that we put in on the psymbol_obstack, we can't do this since gdb gets
670      a fatal error (out of virtual memory) if the size is bogus.  We can
671      however at least check to see if the size is less than the size of
672      the size field itself, or larger than the size of the entire file.
673      Note that all valid string tables have a size greater than zero, since
674      the bytes used to hold the size are included in the count. */
675
676   if (STRING_TABLE_OFFSET == 0)
677     {
678       /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
679          will never be zero, even when there is no string table.  This
680          would appear to be a bug in bfd. */
681       DBX_STRINGTAB_SIZE (objfile) = 0;
682       DBX_STRINGTAB (objfile) = NULL;
683     }
684   else
685     {
686       val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
687       if (val < 0)
688         perror_with_name (name);
689
690       memset (size_temp, 0, sizeof (size_temp));
691       val = bfd_bread (size_temp, sizeof (size_temp), sym_bfd);
692       if (val < 0)
693         {
694           perror_with_name (name);
695         }
696       else if (val == 0)
697         {
698           /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
699              EOF if there is no string table, and attempting to read the size
700              from EOF will read zero bytes. */
701           DBX_STRINGTAB_SIZE (objfile) = 0;
702           DBX_STRINGTAB (objfile) = NULL;
703         }
704       else
705         {
706           /* Read some data that would appear to be the string table size.
707              If there really is a string table, then it is probably the right
708              size.  Byteswap if necessary and validate the size.  Note that
709              the minimum is DBX_STRINGTAB_SIZE_SIZE.  If we just read some
710              random data that happened to be at STRING_TABLE_OFFSET, because
711              bfd can't tell us there is no string table, the sanity checks may
712              or may not catch this. */
713           DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
714
715           if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
716               || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
717             error ("ridiculous string table size (%d bytes).",
718                    DBX_STRINGTAB_SIZE (objfile));
719
720           DBX_STRINGTAB (objfile) =
721             (char *) obstack_alloc (&objfile->psymbol_obstack,
722                                     DBX_STRINGTAB_SIZE (objfile));
723           OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile));
724
725           /* Now read in the string table in one big gulp.  */
726
727           val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
728           if (val < 0)
729             perror_with_name (name);
730           val = bfd_bread (DBX_STRINGTAB (objfile),
731                            DBX_STRINGTAB_SIZE (objfile),
732                            sym_bfd);
733           if (val != DBX_STRINGTAB_SIZE (objfile))
734             perror_with_name (name);
735         }
736     }
737 }
738
739 /* Perform any local cleanups required when we are done with a particular
740    objfile.  I.E, we are in the process of discarding all symbol information
741    for an objfile, freeing up all memory held for it, and unlinking the
742    objfile struct from the global list of known objfiles. */
743
744 static void
745 dbx_symfile_finish (struct objfile *objfile)
746 {
747   if (objfile->sym_stab_info != NULL)
748     {
749       if (HEADER_FILES (objfile) != NULL)
750         {
751           int i = N_HEADER_FILES (objfile);
752           struct header_file *hfiles = HEADER_FILES (objfile);
753
754           while (--i >= 0)
755             {
756               xfree (hfiles[i].name);
757               xfree (hfiles[i].vector);
758             }
759           xfree (hfiles);
760         }
761       xmfree (objfile->md, objfile->sym_stab_info);
762     }
763   free_header_files ();
764 }
765 \f
766
767 /* Buffer for reading the symbol table entries.  */
768 static struct external_nlist symbuf[4096];
769 static int symbuf_idx;
770 static int symbuf_end;
771
772 /* Name of last function encountered.  Used in Solaris to approximate
773    object file boundaries.  */
774 static char *last_function_name;
775
776 /* The address in memory of the string table of the object file we are
777    reading (which might not be the "main" object file, but might be a
778    shared library or some other dynamically loaded thing).  This is
779    set by read_dbx_symtab when building psymtabs, and by
780    read_ofile_symtab when building symtabs, and is used only by
781    next_symbol_text.  FIXME: If that is true, we don't need it when
782    building psymtabs, right?  */
783 static char *stringtab_global;
784
785 /* These variables are used to control fill_symbuf when the stabs
786    symbols are not contiguous (as may be the case when a COFF file is
787    linked using --split-by-reloc).  */
788 static struct stab_section_list *symbuf_sections;
789 static unsigned int symbuf_left;
790 static unsigned int symbuf_read;
791
792 /* This variable stores a global stabs buffer, if we read stabs into
793    memory in one chunk in order to process relocations.  */
794 static bfd_byte *stabs_data;
795
796 /* Refill the symbol table input buffer
797    and set the variables that control fetching entries from it.
798    Reports an error if no data available.
799    This function can read past the end of the symbol table
800    (into the string table) but this does no harm.  */
801
802 static void
803 fill_symbuf (bfd *sym_bfd)
804 {
805   unsigned int count;
806   int nbytes;
807
808   if (stabs_data)
809     {
810       nbytes = sizeof (symbuf);
811       if (nbytes > symbuf_left)
812         nbytes = symbuf_left;
813       memcpy (symbuf, stabs_data + symbuf_read, nbytes);
814     }
815   else if (symbuf_sections == NULL)
816     {
817       count = sizeof (symbuf);
818       nbytes = bfd_bread (symbuf, count, sym_bfd);
819     }
820   else
821     {
822       if (symbuf_left <= 0)
823         {
824           file_ptr filepos = symbuf_sections->section->filepos;
825           if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0)
826             perror_with_name (bfd_get_filename (sym_bfd));
827           symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section);
828           symbol_table_offset = filepos - symbuf_read;
829           symbuf_sections = symbuf_sections->next;
830         }
831
832       count = symbuf_left;
833       if (count > sizeof (symbuf))
834         count = sizeof (symbuf);
835       nbytes = bfd_bread (symbuf, count, sym_bfd);
836     }
837
838   if (nbytes < 0)
839     perror_with_name (bfd_get_filename (sym_bfd));
840   else if (nbytes == 0)
841     error ("Premature end of file reading symbol table");
842   symbuf_end = nbytes / symbol_size;
843   symbuf_idx = 0;
844   symbuf_left -= nbytes;
845   symbuf_read += nbytes;
846 }
847
848 static void
849 stabs_seek (int sym_offset)
850 {
851   if (stabs_data)
852     {
853       symbuf_read += sym_offset;
854       symbuf_left -= sym_offset;
855     }
856   else
857     bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
858 }
859
860 #define INTERNALIZE_SYMBOL(intern, extern, abfd)                        \
861   {                                                                     \
862     (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);             \
863     (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);            \
864     (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);            \
865     if (bfd_get_sign_extend_vma (abfd))                                 \
866       (intern).n_value = bfd_h_get_signed_32 (abfd, (extern)->e_value); \
867     else                                                                \
868       (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);        \
869   }
870
871 /* Invariant: The symbol pointed to by symbuf_idx is the first one
872    that hasn't been swapped.  Swap the symbol at the same time
873    that symbuf_idx is incremented.  */
874
875 /* dbx allows the text of a symbol name to be continued into the
876    next symbol name!  When such a continuation is encountered
877    (a \ at the end of the text of a name)
878    call this function to get the continuation.  */
879
880 static char *
881 dbx_next_symbol_text (struct objfile *objfile)
882 {
883   struct internal_nlist nlist;
884
885   if (symbuf_idx == symbuf_end)
886     fill_symbuf (symfile_bfd);
887
888   symnum++;
889   INTERNALIZE_SYMBOL (nlist, &symbuf[symbuf_idx], symfile_bfd);
890   OBJSTAT (objfile, n_stabs++);
891
892   symbuf_idx++;
893
894   return nlist.n_strx + stringtab_global + file_string_table_offset;
895 }
896 \f
897 /* Initialize the list of bincls to contain none and have some
898    allocated.  */
899
900 static void
901 init_bincl_list (int number, struct objfile *objfile)
902 {
903   bincls_allocated = number;
904   next_bincl = bincl_list = (struct header_file_location *)
905     xmmalloc (objfile->md, bincls_allocated * sizeof (struct header_file_location));
906 }
907
908 /* Add a bincl to the list.  */
909
910 static void
911 add_bincl_to_list (struct partial_symtab *pst, char *name, int instance)
912 {
913   if (next_bincl >= bincl_list + bincls_allocated)
914     {
915       int offset = next_bincl - bincl_list;
916       bincls_allocated *= 2;
917       bincl_list = (struct header_file_location *)
918         xmrealloc (pst->objfile->md, (char *) bincl_list,
919                    bincls_allocated * sizeof (struct header_file_location));
920       next_bincl = bincl_list + offset;
921     }
922   next_bincl->pst = pst;
923   next_bincl->instance = instance;
924   next_bincl++->name = name;
925 }
926
927 /* Given a name, value pair, find the corresponding
928    bincl in the list.  Return the partial symtab associated
929    with that header_file_location.  */
930
931 static struct partial_symtab *
932 find_corresponding_bincl_psymtab (char *name, int instance)
933 {
934   struct header_file_location *bincl;
935
936   for (bincl = bincl_list; bincl < next_bincl; bincl++)
937     if (bincl->instance == instance
938         && STREQ (name, bincl->name))
939       return bincl->pst;
940
941   repeated_header_complaint (name, symnum);
942   return (struct partial_symtab *) 0;
943 }
944
945 /* Free the storage allocated for the bincl list.  */
946
947 static void
948 free_bincl_list (struct objfile *objfile)
949 {
950   xmfree (objfile->md, bincl_list);
951   bincls_allocated = 0;
952 }
953
954 static void
955 do_free_bincl_list_cleanup (void *objfile)
956 {
957   free_bincl_list (objfile);
958 }
959
960 static struct cleanup *
961 make_cleanup_free_bincl_list (struct objfile *objfile)
962 {
963   return make_cleanup (do_free_bincl_list_cleanup, objfile);
964 }
965
966 /* Set namestring based on nlist.  If the string table index is invalid, 
967    give a fake name, and print a single error message per symbol file read,
968    rather than abort the symbol reading or flood the user with messages.  */
969
970 static char *
971 set_namestring (struct objfile *objfile, struct internal_nlist nlist)
972 {
973   char *namestring;
974
975   if (((unsigned) nlist.n_strx + file_string_table_offset) >=
976       DBX_STRINGTAB_SIZE (objfile))
977     {
978       complaint (&symfile_complaints, "bad string table offset in symbol %d",
979                  symnum);
980       namestring = "<bad string table offset>";
981     } 
982   else
983     namestring = nlist.n_strx + file_string_table_offset +
984       DBX_STRINGTAB (objfile);
985   return namestring;
986 }
987
988 /* Scan a SunOs dynamic symbol table for symbols of interest and
989    add them to the minimal symbol table.  */
990
991 static void
992 read_dbx_dynamic_symtab (struct objfile *objfile)
993 {
994   bfd *abfd = objfile->obfd;
995   struct cleanup *back_to;
996   int counter;
997   long dynsym_size;
998   long dynsym_count;
999   asymbol **dynsyms;
1000   asymbol **symptr;
1001   arelent **relptr;
1002   long dynrel_size;
1003   long dynrel_count;
1004   arelent **dynrels;
1005   CORE_ADDR sym_value;
1006   char *name;
1007
1008   /* Check that the symbol file has dynamic symbols that we know about.
1009      bfd_arch_unknown can happen if we are reading a sun3 symbol file
1010      on a sun4 host (and vice versa) and bfd is not configured
1011      --with-target=all.  This would trigger an assertion in bfd/sunos.c,
1012      so we ignore the dynamic symbols in this case.  */
1013   if (bfd_get_flavour (abfd) != bfd_target_aout_flavour
1014       || (bfd_get_file_flags (abfd) & DYNAMIC) == 0
1015       || bfd_get_arch (abfd) == bfd_arch_unknown)
1016     return;
1017
1018   dynsym_size = bfd_get_dynamic_symtab_upper_bound (abfd);
1019   if (dynsym_size < 0)
1020     return;
1021
1022   dynsyms = (asymbol **) xmalloc (dynsym_size);
1023   back_to = make_cleanup (xfree, dynsyms);
1024
1025   dynsym_count = bfd_canonicalize_dynamic_symtab (abfd, dynsyms);
1026   if (dynsym_count < 0)
1027     {
1028       do_cleanups (back_to);
1029       return;
1030     }
1031
1032   /* Enter dynamic symbols into the minimal symbol table
1033      if this is a stripped executable.  */
1034   if (bfd_get_symcount (abfd) <= 0)
1035     {
1036       symptr = dynsyms;
1037       for (counter = 0; counter < dynsym_count; counter++, symptr++)
1038         {
1039           asymbol *sym = *symptr;
1040           asection *sec;
1041           int type;
1042
1043           sec = bfd_get_section (sym);
1044
1045           /* BFD symbols are section relative.  */
1046           sym_value = sym->value + sec->vma;
1047
1048           if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
1049             {
1050               sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1051               type = N_TEXT;
1052             }
1053           else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
1054             {
1055               sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1056               type = N_DATA;
1057             }
1058           else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
1059             {
1060               sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
1061               type = N_BSS;
1062             }
1063           else
1064             continue;
1065
1066           if (sym->flags & BSF_GLOBAL)
1067             type |= N_EXT;
1068
1069           record_minimal_symbol ((char *) bfd_asymbol_name (sym), sym_value,
1070                                  type, objfile);
1071         }
1072     }
1073
1074   /* Symbols from shared libraries have a dynamic relocation entry
1075      that points to the associated slot in the procedure linkage table.
1076      We make a mininal symbol table entry with type mst_solib_trampoline
1077      at the address in the procedure linkage table.  */
1078   dynrel_size = bfd_get_dynamic_reloc_upper_bound (abfd);
1079   if (dynrel_size < 0)
1080     {
1081       do_cleanups (back_to);
1082       return;
1083     }
1084
1085   dynrels = (arelent **) xmalloc (dynrel_size);
1086   make_cleanup (xfree, dynrels);
1087
1088   dynrel_count = bfd_canonicalize_dynamic_reloc (abfd, dynrels, dynsyms);
1089   if (dynrel_count < 0)
1090     {
1091       do_cleanups (back_to);
1092       return;
1093     }
1094
1095   for (counter = 0, relptr = dynrels;
1096        counter < dynrel_count;
1097        counter++, relptr++)
1098     {
1099       arelent *rel = *relptr;
1100       CORE_ADDR address =
1101       rel->address + ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1102
1103       switch (bfd_get_arch (abfd))
1104         {
1105         case bfd_arch_sparc:
1106           if (rel->howto->type != RELOC_JMP_SLOT)
1107             continue;
1108           break;
1109         case bfd_arch_m68k:
1110           /* `16' is the type BFD produces for a jump table relocation.  */
1111           if (rel->howto->type != 16)
1112             continue;
1113
1114           /* Adjust address in the jump table to point to
1115              the start of the bsr instruction.  */
1116           address -= 2;
1117           break;
1118         default:
1119           continue;
1120         }
1121
1122       name = (char *) bfd_asymbol_name (*rel->sym_ptr_ptr);
1123       prim_record_minimal_symbol (name, address, mst_solib_trampoline,
1124                                   objfile);
1125     }
1126
1127   do_cleanups (back_to);
1128 }
1129
1130 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1131 static CORE_ADDR
1132 find_stab_function_addr (char *namestring, char *filename,
1133                          struct objfile *objfile)
1134 {
1135   struct minimal_symbol *msym;
1136   char *p;
1137   int n;
1138
1139   p = strchr (namestring, ':');
1140   if (p == NULL)
1141     p = namestring;
1142   n = p - namestring;
1143   p = alloca (n + 2);
1144   strncpy (p, namestring, n);
1145   p[n] = 0;
1146
1147   msym = lookup_minimal_symbol (p, filename, objfile);
1148   if (msym == NULL)
1149     {
1150       /* Sun Fortran appends an underscore to the minimal symbol name,
1151          try again with an appended underscore if the minimal symbol
1152          was not found.  */
1153       p[n] = '_';
1154       p[n + 1] = 0;
1155       msym = lookup_minimal_symbol (p, filename, objfile);
1156     }
1157
1158   if (msym == NULL && filename != NULL)
1159     {
1160       /* Try again without the filename. */
1161       p[n] = 0;
1162       msym = lookup_minimal_symbol (p, NULL, objfile);
1163     }
1164   if (msym == NULL && filename != NULL)
1165     {
1166       /* And try again for Sun Fortran, but without the filename. */
1167       p[n] = '_';
1168       p[n + 1] = 0;
1169       msym = lookup_minimal_symbol (p, NULL, objfile);
1170     }
1171
1172   return msym == NULL ? 0 : SYMBOL_VALUE_ADDRESS (msym);
1173 }
1174 #endif /* SOFUN_ADDRESS_MAYBE_MISSING */
1175
1176 static void
1177 function_outside_compilation_unit_complaint (const char *arg1)
1178 {
1179   complaint (&symfile_complaints,
1180              "function `%s' appears to be defined outside of all compilation units",
1181              arg1);
1182 }
1183
1184 /* Setup partial_symtab's describing each source file for which
1185    debugging information is available. */
1186
1187 static void
1188 read_dbx_symtab (struct objfile *objfile)
1189 {
1190   struct external_nlist *bufp = 0;      /* =0 avoids gcc -Wall glitch */
1191   struct internal_nlist nlist;
1192   CORE_ADDR text_addr;
1193   int text_size;
1194
1195   char *namestring;
1196   int nsl;
1197   int past_first_source_file = 0;
1198   CORE_ADDR last_o_file_start = 0;
1199   CORE_ADDR last_function_start = 0;
1200   struct cleanup *back_to;
1201   bfd *abfd;
1202   int textlow_not_set;
1203   int data_sect_index;
1204
1205   /* Current partial symtab */
1206   struct partial_symtab *pst;
1207
1208   /* List of current psymtab's include files */
1209   char **psymtab_include_list;
1210   int includes_allocated;
1211   int includes_used;
1212
1213   /* Index within current psymtab dependency list */
1214   struct partial_symtab **dependency_list;
1215   int dependencies_used, dependencies_allocated;
1216
1217   text_addr = DBX_TEXT_ADDR (objfile);
1218   text_size = DBX_TEXT_SIZE (objfile);
1219
1220   /* FIXME.  We probably want to change stringtab_global rather than add this
1221      while processing every symbol entry.  FIXME.  */
1222   file_string_table_offset = 0;
1223   next_file_string_table_offset = 0;
1224
1225   stringtab_global = DBX_STRINGTAB (objfile);
1226
1227   pst = (struct partial_symtab *) 0;
1228
1229   includes_allocated = 30;
1230   includes_used = 0;
1231   psymtab_include_list = (char **) alloca (includes_allocated *
1232                                            sizeof (char *));
1233
1234   dependencies_allocated = 30;
1235   dependencies_used = 0;
1236   dependency_list =
1237     (struct partial_symtab **) alloca (dependencies_allocated *
1238                                        sizeof (struct partial_symtab *));
1239
1240   /* Init bincl list */
1241   init_bincl_list (20, objfile);
1242   back_to = make_cleanup_free_bincl_list (objfile);
1243
1244   last_source_file = NULL;
1245
1246   lowest_text_address = (CORE_ADDR) -1;
1247
1248   symfile_bfd = objfile->obfd;  /* For next_text_symbol */
1249   abfd = objfile->obfd;
1250   symbuf_end = symbuf_idx = 0;
1251   next_symbol_text_func = dbx_next_symbol_text;
1252   textlow_not_set = 1;
1253   has_line_numbers = 0;
1254
1255   /* FIXME: jimb/2003-09-12: We don't apply the right section's offset
1256      to global and static variables.  The stab for a global or static
1257      variable doesn't give us any indication of which section it's in,
1258      so we can't tell immediately which offset in
1259      objfile->section_offsets we should apply to the variable's
1260      address.
1261
1262      We could certainly find out which section contains the variable
1263      by looking up the variable's unrelocated address with
1264      find_pc_section, but that would be expensive; this is the
1265      function that constructs the partial symbol tables by examining
1266      every symbol in the entire executable, and it's
1267      performance-critical.  So that expense would not be welcome.  I'm
1268      not sure what to do about this at the moment.
1269
1270      What we have done for years is to simply assume that the .data
1271      section's offset is appropriate for all global and static
1272      variables.  Recently, this was expanded to fall back to the .bss
1273      section's offset if there is no .data section, and then to the
1274      .rodata section's offset.  */
1275   data_sect_index = objfile->sect_index_data;
1276   if (data_sect_index == -1)
1277     data_sect_index = SECT_OFF_BSS (objfile);
1278   if (data_sect_index == -1)
1279     data_sect_index = SECT_OFF_RODATA (objfile);
1280
1281   /* If data_sect_index is still -1, that's okay.  It's perfectly fine
1282      for the file to have no .data, no .bss, and no .text at all, if
1283      it also has no global or static variables.  If it does, we will
1284      get an internal error from an ANOFFSET macro below when we try to
1285      use data_sect_index.  */
1286
1287   for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
1288     {
1289       /* Get the symbol for this run and pull out some info */
1290       QUIT;                     /* allow this to be interruptable */
1291       if (symbuf_idx == symbuf_end)
1292         fill_symbuf (abfd);
1293       bufp = &symbuf[symbuf_idx++];
1294
1295       /*
1296        * Special case to speed up readin.
1297        */
1298       if (bfd_h_get_8 (abfd, bufp->e_type) == N_SLINE)
1299         {
1300           has_line_numbers = 1;
1301           continue;
1302         }
1303
1304       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1305       OBJSTAT (objfile, n_stabs++);
1306
1307       /* Ok.  There is a lot of code duplicated in the rest of this
1308          switch statement (for efficiency reasons).  Since I don't
1309          like duplicating code, I will do my penance here, and
1310          describe the code which is duplicated:
1311
1312          *) The assignment to namestring.
1313          *) The call to strchr.
1314          *) The addition of a partial symbol the the two partial
1315          symbol lists.  This last is a large section of code, so
1316          I've imbedded it in the following macro.
1317       */
1318
1319       switch (nlist.n_type)
1320         {
1321           char *p;
1322           /*
1323            * Standard, external, non-debugger, symbols
1324            */
1325
1326           case N_TEXT | N_EXT:
1327           case N_NBTEXT | N_EXT:
1328           nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1329           goto record_it;
1330
1331           case N_DATA | N_EXT:
1332           case N_NBDATA | N_EXT:
1333           nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1334           goto record_it;
1335
1336           case N_BSS:
1337           case N_BSS | N_EXT:
1338           case N_NBBSS | N_EXT:
1339           case N_SETV | N_EXT:          /* FIXME, is this in BSS? */
1340           nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
1341           goto record_it;
1342
1343           case N_ABS | N_EXT:
1344           record_it:
1345           namestring = set_namestring (objfile, nlist);
1346
1347           bss_ext_symbol:
1348           record_minimal_symbol (namestring, nlist.n_value,
1349                                  nlist.n_type, objfile);        /* Always */
1350           continue;
1351
1352           /* Standard, local, non-debugger, symbols */
1353
1354           case N_NBTEXT:
1355
1356           /* We need to be able to deal with both N_FN or N_TEXT,
1357              because we have no way of knowing whether the sys-supplied ld
1358              or GNU ld was used to make the executable.  Sequents throw
1359              in another wrinkle -- they renumbered N_FN.  */
1360
1361           case N_FN:
1362           case N_FN_SEQ:
1363           case N_TEXT:
1364           nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1365           namestring = set_namestring (objfile, nlist);
1366
1367           if ((namestring[0] == '-' && namestring[1] == 'l')
1368               || (namestring[(nsl = strlen (namestring)) - 1] == 'o'
1369                   && namestring[nsl - 2] == '.'))
1370           {
1371             if (objfile->ei.entry_point < nlist.n_value &&
1372                 objfile->ei.entry_point >= last_o_file_start)
1373               {
1374                 objfile->ei.deprecated_entry_file_lowpc = last_o_file_start;
1375                 objfile->ei.deprecated_entry_file_highpc = nlist.n_value;
1376               }
1377             if (past_first_source_file && pst
1378                 /* The gould NP1 uses low values for .o and -l symbols
1379                    which are not the address.  */
1380                 && nlist.n_value >= pst->textlow)
1381               {
1382                 end_psymtab (pst, psymtab_include_list, includes_used,
1383                              symnum * symbol_size,
1384                              nlist.n_value > pst->texthigh
1385                              ? nlist.n_value : pst->texthigh,
1386                              dependency_list, dependencies_used, textlow_not_set);
1387                 pst = (struct partial_symtab *) 0;
1388                 includes_used = 0;
1389                 dependencies_used = 0;
1390               }
1391             else
1392               past_first_source_file = 1;
1393             last_o_file_start = nlist.n_value;
1394           }
1395           else
1396           goto record_it;
1397           continue;
1398
1399           case N_DATA:
1400           nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1401           goto record_it;
1402
1403           case N_UNDF | N_EXT:
1404           if (nlist.n_value != 0)
1405           {
1406             /* This is a "Fortran COMMON" symbol.  See if the target
1407                environment knows where it has been relocated to.  */
1408
1409             CORE_ADDR reladdr;
1410
1411             namestring = set_namestring (objfile, nlist);
1412             if (target_lookup_symbol (namestring, &reladdr))
1413               {
1414                 continue;               /* Error in lookup; ignore symbol for now.  */
1415               }
1416             nlist.n_type ^= (N_BSS ^ N_UNDF);   /* Define it as a bss-symbol */
1417             nlist.n_value = reladdr;
1418             goto bss_ext_symbol;
1419           }
1420           continue;                     /* Just undefined, not COMMON */
1421
1422           case N_UNDF:
1423           if (processing_acc_compilation && nlist.n_strx == 1)
1424           {
1425             /* Deal with relative offsets in the string table
1426                used in ELF+STAB under Solaris.  If we want to use the
1427                n_strx field, which contains the name of the file,
1428                we must adjust file_string_table_offset *before* calling
1429                set_namestring().  */
1430             past_first_source_file = 1;
1431             file_string_table_offset = next_file_string_table_offset;
1432             next_file_string_table_offset =
1433               file_string_table_offset + nlist.n_value;
1434             if (next_file_string_table_offset < file_string_table_offset)
1435               error ("string table offset backs up at %d", symnum);
1436             /* FIXME -- replace error() with complaint.  */
1437             continue;
1438           }
1439           continue;
1440
1441           /* Lots of symbol types we can just ignore.  */
1442
1443           case N_ABS:
1444           case N_NBDATA:
1445           case N_NBBSS:
1446           continue;
1447
1448           /* Keep going . . . */
1449
1450           /*
1451            * Special symbol types for GNU
1452            */
1453           case N_INDR:
1454           case N_INDR | N_EXT:
1455           case N_SETA:
1456           case N_SETA | N_EXT:
1457           case N_SETT:
1458           case N_SETT | N_EXT:
1459           case N_SETD:
1460           case N_SETD | N_EXT:
1461           case N_SETB:
1462           case N_SETB | N_EXT:
1463           case N_SETV:
1464           continue;
1465
1466           /*
1467            * Debugger symbols
1468            */
1469
1470           case N_SO:
1471           {
1472             CORE_ADDR valu;
1473             static int prev_so_symnum = -10;
1474             static int first_so_symnum;
1475             char *p;
1476             int prev_textlow_not_set;
1477
1478             valu = nlist.n_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1479
1480             prev_textlow_not_set = textlow_not_set;
1481
1482 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1483             /* A zero value is probably an indication for the SunPRO 3.0
1484                compiler. end_psymtab explicitly tests for zero, so
1485                don't relocate it.  */
1486
1487             if (nlist.n_value == 0)
1488               {
1489                 textlow_not_set = 1;
1490                 valu = 0;
1491               }
1492             else
1493               textlow_not_set = 0;
1494 #else
1495             textlow_not_set = 0;
1496 #endif
1497             past_first_source_file = 1;
1498
1499             if (prev_so_symnum != symnum - 1)
1500               {                 /* Here if prev stab wasn't N_SO */
1501                 first_so_symnum = symnum;
1502
1503                 if (pst)
1504                   {
1505                     end_psymtab (pst, psymtab_include_list, includes_used,
1506                                  symnum * symbol_size,
1507                                  valu > pst->texthigh ? valu : pst->texthigh,
1508                                  dependency_list, dependencies_used,
1509                                  prev_textlow_not_set);
1510                     pst = (struct partial_symtab *) 0;
1511                     includes_used = 0;
1512                     dependencies_used = 0;
1513                   }
1514               }
1515
1516             prev_so_symnum = symnum;
1517
1518             /* End the current partial symtab and start a new one */
1519
1520             namestring = set_namestring (objfile, nlist);
1521
1522             /* Null name means end of .o file.  Don't start a new one. */
1523             if (*namestring == '\000')
1524               continue;
1525
1526             /* Some compilers (including gcc) emit a pair of initial N_SOs.
1527                The first one is a directory name; the second the file name.
1528                If pst exists, is empty, and has a filename ending in '/',
1529                we assume the previous N_SO was a directory name. */
1530
1531             p = strrchr (namestring, '/');
1532             if (p && *(p + 1) == '\000')
1533               continue;         /* Simply ignore directory name SOs */
1534
1535             /* Some other compilers (C++ ones in particular) emit useless
1536                SOs for non-existant .c files.  We ignore all subsequent SOs that
1537                immediately follow the first.  */
1538
1539             if (!pst)
1540               pst = start_psymtab (objfile,
1541                                    namestring, valu,
1542                                    first_so_symnum * symbol_size,
1543                                    objfile->global_psymbols.next,
1544                                    objfile->static_psymbols.next);
1545             continue;
1546           }
1547
1548           case N_BINCL:
1549           {
1550             enum language tmp_language;
1551             /* Add this bincl to the bincl_list for future EXCLs.  No
1552                need to save the string; it'll be around until
1553                read_dbx_symtab function returns */
1554
1555             namestring = set_namestring (objfile, nlist);
1556             tmp_language = deduce_language_from_filename (namestring);
1557
1558             /* Only change the psymtab's language if we've learned
1559                something useful (eg. tmp_language is not language_unknown).
1560                In addition, to match what start_subfile does, never change
1561                from C++ to C.  */
1562             if (tmp_language != language_unknown
1563                 && (tmp_language != language_c
1564                     || psymtab_language != language_cplus))
1565             psymtab_language = tmp_language;
1566
1567             if (pst == NULL)
1568             {
1569               /* FIXME: we should not get here without a PST to work on.
1570                  Attempt to recover.  */
1571               complaint (&symfile_complaints,
1572                          "N_BINCL %s not in entries for any file, at symtab pos %d",
1573                          namestring, symnum);
1574               continue;
1575             }
1576             add_bincl_to_list (pst, namestring, nlist.n_value);
1577
1578             /* Mark down an include file in the current psymtab */
1579
1580             goto record_include_file;
1581           }
1582
1583           case N_SOL:
1584           {
1585             enum language tmp_language;
1586             /* Mark down an include file in the current psymtab */
1587
1588             namestring = set_namestring (objfile, nlist);
1589             tmp_language = deduce_language_from_filename (namestring);
1590
1591             /* Only change the psymtab's language if we've learned
1592                something useful (eg. tmp_language is not language_unknown).
1593                In addition, to match what start_subfile does, never change
1594                from C++ to C.  */
1595             if (tmp_language != language_unknown
1596                 && (tmp_language != language_c
1597                     || psymtab_language != language_cplus))
1598             psymtab_language = tmp_language;
1599
1600             /* In C++, one may expect the same filename to come round many
1601                times, when code is coming alternately from the main file
1602                and from inline functions in other files. So I check to see
1603                if this is a file we've seen before -- either the main
1604                source file, or a previously included file.
1605
1606                This seems to be a lot of time to be spending on N_SOL, but
1607                things like "break c-exp.y:435" need to work (I
1608                suppose the psymtab_include_list could be hashed or put
1609                in a binary tree, if profiling shows this is a major hog).  */
1610             if (pst && STREQ (namestring, pst->filename))
1611             continue;
1612             {
1613               int i;
1614               for (i = 0; i < includes_used; i++)
1615                 if (STREQ (namestring, psymtab_include_list[i]))
1616                   {
1617                     i = -1;
1618                     break;
1619                   }
1620               if (i == -1)
1621                 continue;
1622             }
1623
1624             record_include_file:
1625
1626             psymtab_include_list[includes_used++] = namestring;
1627             if (includes_used >= includes_allocated)
1628             {
1629               char **orig = psymtab_include_list;
1630
1631               psymtab_include_list = (char **)
1632                 alloca ((includes_allocated *= 2) *
1633                         sizeof (char *));
1634               memcpy (psymtab_include_list, orig,
1635                       includes_used * sizeof (char *));
1636             }
1637             continue;
1638           }
1639           case N_LSYM:                  /* Typedef or automatic variable. */
1640           case N_STSYM:         /* Data seg var -- static  */
1641           case N_LCSYM:         /* BSS      "  */
1642           case N_ROSYM:         /* Read-only data seg var -- static.  */
1643           case N_NBSTS:         /* Gould nobase.  */
1644           case N_NBLCS:         /* symbols.  */
1645           case N_FUN:
1646           case N_GSYM:                  /* Global (extern) variable; can be
1647                                            data or bss (sigh FIXME).  */
1648
1649           /* Following may probably be ignored; I'll leave them here
1650              for now (until I do Pascal and Modula 2 extensions).  */
1651
1652           case N_PC:                    /* I may or may not need this; I
1653                                            suspect not.  */
1654           case N_M2C:                   /* I suspect that I can ignore this here. */
1655           case N_SCOPE:         /* Same.   */
1656
1657           namestring = set_namestring (objfile, nlist);
1658
1659           /* See if this is an end of function stab.  */
1660           if (pst && nlist.n_type == N_FUN && *namestring == '\000')
1661           {
1662             CORE_ADDR valu;
1663
1664             /* It's value is the size (in bytes) of the function for
1665                function relative stabs, or the address of the function's
1666                end for old style stabs.  */
1667             valu = nlist.n_value + last_function_start;
1668             if (pst->texthigh == 0 || valu > pst->texthigh)
1669               pst->texthigh = valu;
1670             break;
1671           }
1672
1673           p = (char *) strchr (namestring, ':');
1674           if (!p)
1675           continue;                     /* Not a debugging symbol.   */
1676
1677
1678
1679           /* Main processing section for debugging symbols which
1680              the initial read through the symbol tables needs to worry
1681              about.  If we reach this point, the symbol which we are
1682              considering is definitely one we are interested in.
1683              p must also contain the (valid) index into the namestring
1684              which indicates the debugging type symbol.  */
1685
1686           switch (p[1])
1687           {
1688           case 'S':
1689             nlist.n_value += ANOFFSET (objfile->section_offsets, data_sect_index);
1690 #ifdef STATIC_TRANSFORM_NAME
1691             namestring = STATIC_TRANSFORM_NAME (namestring);
1692 #endif
1693             add_psymbol_to_list (namestring, p - namestring,
1694                                  VAR_DOMAIN, LOC_STATIC,
1695                                  &objfile->static_psymbols,
1696                                  0, nlist.n_value,
1697                                  psymtab_language, objfile);
1698             continue;
1699           case 'G':
1700             nlist.n_value += ANOFFSET (objfile->section_offsets, data_sect_index);
1701             /* The addresses in these entries are reported to be
1702                wrong.  See the code that reads 'G's for symtabs. */
1703             add_psymbol_to_list (namestring, p - namestring,
1704                                  VAR_DOMAIN, LOC_STATIC,
1705                                  &objfile->global_psymbols,
1706                                  0, nlist.n_value,
1707                                  psymtab_language, objfile);
1708             continue;
1709
1710           case 'T':
1711             /* When a 'T' entry is defining an anonymous enum, it
1712                may have a name which is the empty string, or a
1713                single space.  Since they're not really defining a
1714                symbol, those shouldn't go in the partial symbol
1715                table.  We do pick up the elements of such enums at
1716                'check_enum:', below.  */
1717             if (p >= namestring + 2
1718                 || (p == namestring + 1
1719                     && namestring[0] != ' '))
1720               {
1721                 add_psymbol_to_list (namestring, p - namestring,
1722                                      STRUCT_DOMAIN, LOC_TYPEDEF,
1723                                      &objfile->static_psymbols,
1724                                      nlist.n_value, 0,
1725                                      psymtab_language, objfile);
1726                 if (p[2] == 't')
1727                   {
1728                     /* Also a typedef with the same name.  */
1729                     add_psymbol_to_list (namestring, p - namestring,
1730                                          VAR_DOMAIN, LOC_TYPEDEF,
1731                                          &objfile->static_psymbols,
1732                                          nlist.n_value, 0,
1733                                          psymtab_language, objfile);
1734                     p += 1;
1735                   }
1736               }
1737             goto check_enum;
1738           case 't':
1739             if (p != namestring)        /* a name is there, not just :T... */
1740               {
1741                 add_psymbol_to_list (namestring, p - namestring,
1742                                      VAR_DOMAIN, LOC_TYPEDEF,
1743                                      &objfile->static_psymbols,
1744                                      nlist.n_value, 0,
1745                                      psymtab_language, objfile);
1746               }
1747           check_enum:
1748             /* If this is an enumerated type, we need to
1749                add all the enum constants to the partial symbol
1750                table.  This does not cover enums without names, e.g.
1751                "enum {a, b} c;" in C, but fortunately those are
1752                rare.  There is no way for GDB to find those from the
1753                enum type without spending too much time on it.  Thus
1754                to solve this problem, the compiler needs to put out the
1755                enum in a nameless type.  GCC2 does this.  */
1756
1757             /* We are looking for something of the form
1758                <name> ":" ("t" | "T") [<number> "="] "e"
1759                {<constant> ":" <value> ","} ";".  */
1760
1761             /* Skip over the colon and the 't' or 'T'.  */
1762             p += 2;
1763             /* This type may be given a number.  Also, numbers can come
1764                in pairs like (0,26).  Skip over it.  */
1765             while ((*p >= '0' && *p <= '9')
1766                    || *p == '(' || *p == ',' || *p == ')'
1767                    || *p == '=')
1768               p++;
1769
1770             if (*p++ == 'e')
1771               {
1772                 /* The aix4 compiler emits extra crud before the members.  */
1773                 if (*p == '-')
1774                   {
1775                     /* Skip over the type (?).  */
1776                     while (*p != ':')
1777                       p++;
1778
1779                     /* Skip over the colon.  */
1780                     p++;
1781                   }
1782
1783                 /* We have found an enumerated type.  */
1784                 /* According to comments in read_enum_type
1785                    a comma could end it instead of a semicolon.
1786                    I don't know where that happens.
1787                    Accept either.  */
1788                 while (*p && *p != ';' && *p != ',')
1789                   {
1790                     char *q;
1791
1792                     /* Check for and handle cretinous dbx symbol name
1793                        continuation!  */
1794                     if (*p == '\\' || (*p == '?' && p[1] == '\0'))
1795                       p = next_symbol_text (objfile);
1796
1797                     /* Point to the character after the name
1798                        of the enum constant.  */
1799                     for (q = p; *q && *q != ':'; q++)
1800                       ;
1801                     /* Note that the value doesn't matter for
1802                        enum constants in psymtabs, just in symtabs.  */
1803                     add_psymbol_to_list (p, q - p,
1804                                          VAR_DOMAIN, LOC_CONST,
1805                                          &objfile->static_psymbols, 0,
1806                                          0, psymtab_language, objfile);
1807                     /* Point past the name.  */
1808                     p = q;
1809                     /* Skip over the value.  */
1810                     while (*p && *p != ',')
1811                       p++;
1812                     /* Advance past the comma.  */
1813                     if (*p)
1814                       p++;
1815                   }
1816               }
1817             continue;
1818           case 'c':
1819             /* Constant, e.g. from "const" in Pascal.  */
1820             add_psymbol_to_list (namestring, p - namestring,
1821                                  VAR_DOMAIN, LOC_CONST,
1822                                  &objfile->static_psymbols, nlist.n_value,
1823                                  0, psymtab_language, objfile);
1824             continue;
1825
1826           case 'f':
1827             if (! pst)
1828               {
1829                 int name_len = p - namestring;
1830                 char *name = xmalloc (name_len + 1);
1831                 memcpy (name, namestring, name_len);
1832                 name[name_len] = '\0';
1833                 function_outside_compilation_unit_complaint (name);
1834                 xfree (name);
1835               }
1836             nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1837             /* Kludges for ELF/STABS with Sun ACC */
1838             last_function_name = namestring;
1839 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1840             /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
1841                value for the bottom of the text seg in those cases. */
1842             if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
1843                                            SECT_OFF_TEXT (objfile)))
1844               {
1845                 CORE_ADDR minsym_valu = 
1846                   find_stab_function_addr (namestring, pst->filename, objfile);
1847                 /* find_stab_function_addr will return 0 if the minimal
1848                    symbol wasn't found.  (Unfortunately, this might also
1849                    be a valid address.)  Anyway, if it *does* return 0,
1850                    it is likely that the value was set correctly to begin
1851                    with... */
1852                 if (minsym_valu != 0)
1853                   nlist.n_value = minsym_valu;
1854               }
1855             if (pst && textlow_not_set)
1856               {
1857                 pst->textlow = nlist.n_value;
1858                 textlow_not_set = 0;
1859               }
1860 #endif
1861             /* End kludge.  */
1862
1863             /* Keep track of the start of the last function so we
1864                can handle end of function symbols.  */
1865             last_function_start = nlist.n_value;
1866
1867             /* In reordered executables this function may lie outside
1868                the bounds created by N_SO symbols.  If that's the case
1869                use the address of this function as the low bound for
1870                the partial symbol table.  */
1871             if (pst
1872                 && (textlow_not_set
1873                     || (nlist.n_value < pst->textlow
1874                         && (nlist.n_value
1875                             != ANOFFSET (objfile->section_offsets,
1876                                          SECT_OFF_TEXT (objfile))))))
1877               {
1878                 pst->textlow = nlist.n_value;
1879                 textlow_not_set = 0;
1880               }
1881             add_psymbol_to_list (namestring, p - namestring,
1882                                  VAR_DOMAIN, LOC_BLOCK,
1883                                  &objfile->static_psymbols,
1884                                  0, nlist.n_value,
1885                                  psymtab_language, objfile);
1886             continue;
1887
1888             /* Global functions were ignored here, but now they
1889                are put into the global psymtab like one would expect.
1890                They're also in the minimal symbol table.  */
1891           case 'F':
1892             if (! pst)
1893               {
1894                 int name_len = p - namestring;
1895                 char *name = xmalloc (name_len + 1);
1896                 memcpy (name, namestring, name_len);
1897                 name[name_len] = '\0';
1898                 function_outside_compilation_unit_complaint (name);
1899                 xfree (name);
1900               }
1901             nlist.n_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1902             /* Kludges for ELF/STABS with Sun ACC */
1903             last_function_name = namestring;
1904 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1905             /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
1906                value for the bottom of the text seg in those cases. */
1907             if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
1908                                            SECT_OFF_TEXT (objfile)))
1909               {
1910                 CORE_ADDR minsym_valu = 
1911                   find_stab_function_addr (namestring, pst->filename, objfile);
1912                 /* find_stab_function_addr will return 0 if the minimal
1913                    symbol wasn't found.  (Unfortunately, this might also
1914                    be a valid address.)  Anyway, if it *does* return 0,
1915                    it is likely that the value was set correctly to begin
1916                    with... */
1917                 if (minsym_valu != 0)
1918                   nlist.n_value = minsym_valu;
1919               }
1920             if (pst && textlow_not_set)
1921               {
1922                 pst->textlow = nlist.n_value;
1923                 textlow_not_set = 0;
1924               }
1925 #endif
1926             /* End kludge.  */
1927
1928             /* Keep track of the start of the last function so we
1929                can handle end of function symbols.  */
1930             last_function_start = nlist.n_value;
1931
1932             /* In reordered executables this function may lie outside
1933                the bounds created by N_SO symbols.  If that's the case
1934                use the address of this function as the low bound for
1935                the partial symbol table.  */
1936             if (pst
1937                 && (textlow_not_set
1938                     || (nlist.n_value < pst->textlow
1939                         && (nlist.n_value
1940                             != ANOFFSET (objfile->section_offsets,
1941                                          SECT_OFF_TEXT (objfile))))))
1942               {
1943                 pst->textlow = nlist.n_value;
1944                 textlow_not_set = 0;
1945               }
1946             add_psymbol_to_list (namestring, p - namestring,
1947                                  VAR_DOMAIN, LOC_BLOCK,
1948                                  &objfile->global_psymbols,
1949                                  0, nlist.n_value,
1950                                  psymtab_language, objfile);
1951             continue;
1952
1953             /* Two things show up here (hopefully); static symbols of
1954                local scope (static used inside braces) or extensions
1955                of structure symbols.  We can ignore both.  */
1956           case 'V':
1957           case '(':
1958           case '0':
1959           case '1':
1960           case '2':
1961           case '3':
1962           case '4':
1963           case '5':
1964           case '6':
1965           case '7':
1966           case '8':
1967           case '9':
1968           case '-':
1969           case '#':             /* for symbol identification (used in live ranges) */
1970             continue;
1971
1972           case ':':
1973             /* It is a C++ nested symbol.  We don't need to record it
1974                (I don't think); if we try to look up foo::bar::baz,
1975                then symbols for the symtab containing foo should get
1976                read in, I think.  */
1977             /* Someone says sun cc puts out symbols like
1978                /foo/baz/maclib::/usr/local/bin/maclib,
1979                which would get here with a symbol type of ':'.  */
1980             continue;
1981
1982           default:
1983             /* Unexpected symbol descriptor.  The second and subsequent stabs
1984                of a continued stab can show up here.  The question is
1985                whether they ever can mimic a normal stab--it would be
1986                nice if not, since we certainly don't want to spend the
1987                time searching to the end of every string looking for
1988                a backslash.  */
1989
1990             complaint (&symfile_complaints, "unknown symbol descriptor `%c'",
1991                        p[1]);
1992
1993             /* Ignore it; perhaps it is an extension that we don't
1994                know about.  */
1995             continue;
1996           }
1997
1998           case N_EXCL:
1999
2000           namestring = set_namestring (objfile, nlist);
2001
2002           /* Find the corresponding bincl and mark that psymtab on the
2003              psymtab dependency list */
2004           {
2005             struct partial_symtab *needed_pst =
2006               find_corresponding_bincl_psymtab (namestring, nlist.n_value);
2007
2008             /* If this include file was defined earlier in this file,
2009                leave it alone.  */
2010             if (needed_pst == pst)
2011               continue;
2012
2013             if (needed_pst)
2014               {
2015                 int i;
2016                 int found = 0;
2017
2018                 for (i = 0; i < dependencies_used; i++)
2019                   if (dependency_list[i] == needed_pst)
2020                     {
2021                       found = 1;
2022                       break;
2023                     }
2024
2025                 /* If it's already in the list, skip the rest.  */
2026                 if (found)
2027                   continue;
2028
2029                 dependency_list[dependencies_used++] = needed_pst;
2030                 if (dependencies_used >= dependencies_allocated)
2031                   {
2032                     struct partial_symtab **orig = dependency_list;
2033                     dependency_list =
2034                       (struct partial_symtab **)
2035                       alloca ((dependencies_allocated *= 2)
2036                               * sizeof (struct partial_symtab *));
2037                     memcpy (dependency_list, orig,
2038                             (dependencies_used
2039                              * sizeof (struct partial_symtab *)));
2040 #ifdef DEBUG_INFO
2041                     fprintf_unfiltered (gdb_stderr, "Had to reallocate dependency list.\n");
2042                     fprintf_unfiltered (gdb_stderr, "New dependencies allocated: %d\n",
2043                                         dependencies_allocated);
2044 #endif
2045                   }
2046               }
2047           }
2048           continue;
2049
2050           case N_ENDM:
2051 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
2052           /* Solaris 2 end of module, finish current partial symbol table.
2053              end_psymtab will set pst->texthigh to the proper value, which
2054              is necessary if a module compiled without debugging info
2055              follows this module.  */
2056           if (pst)
2057           {
2058             end_psymtab (pst, psymtab_include_list, includes_used,
2059                          symnum * symbol_size,
2060                          (CORE_ADDR) 0,
2061                          dependency_list, dependencies_used, textlow_not_set);
2062             pst = (struct partial_symtab *) 0;
2063             includes_used = 0;
2064             dependencies_used = 0;
2065           }
2066 #endif
2067           continue;
2068
2069           case N_RBRAC:
2070 #ifdef HANDLE_RBRAC
2071           HANDLE_RBRAC (nlist.n_value);
2072           continue;
2073 #endif
2074           case N_EINCL:
2075           case N_DSLINE:
2076           case N_BSLINE:
2077           case N_SSYM:                  /* Claim: Structure or union element.
2078                                            Hopefully, I can ignore this.  */
2079           case N_ENTRY:         /* Alternate entry point; can ignore. */
2080           case N_MAIN:                  /* Can definitely ignore this.   */
2081           case N_CATCH:         /* These are GNU C++ extensions */
2082           case N_EHDECL:                /* that can safely be ignored here. */
2083           case N_LENG:
2084           case N_BCOMM:
2085           case N_ECOMM:
2086           case N_ECOML:
2087           case N_FNAME:
2088           case N_SLINE:
2089           case N_RSYM:
2090           case N_PSYM:
2091           case N_LBRAC:
2092           case N_NSYMS:         /* Ultrix 4.0: symbol count */
2093           case N_DEFD:                  /* GNU Modula-2 */
2094           case N_ALIAS:         /* SunPro F77: alias name, ignore for now.  */
2095
2096           case N_OBJ:                   /* useless types from Solaris */
2097           case N_OPT:
2098           /* These symbols aren't interesting; don't worry about them */
2099
2100           continue;
2101
2102           default:
2103           /* If we haven't found it yet, ignore it.  It's probably some
2104              new type we don't know about yet.  */
2105           unknown_symtype_complaint (local_hex_string (nlist.n_type));
2106           continue;
2107         }
2108     }
2109
2110   /* If there's stuff to be cleaned up, clean it up.  */
2111   if (DBX_SYMCOUNT (objfile) > 0        /* We have some syms */
2112       /*FIXME, does this have a bug at start address 0? */
2113       && last_o_file_start
2114       && objfile->ei.entry_point < nlist.n_value
2115       && objfile->ei.entry_point >= last_o_file_start)
2116     {
2117       objfile->ei.deprecated_entry_file_lowpc = last_o_file_start;
2118       objfile->ei.deprecated_entry_file_highpc = nlist.n_value;
2119     }
2120
2121   if (pst)
2122     {
2123       /* Don't set pst->texthigh lower than it already is.  */
2124       CORE_ADDR text_end =
2125         (lowest_text_address == (CORE_ADDR) -1
2126          ? (text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))
2127          : lowest_text_address)
2128         + text_size;
2129
2130       end_psymtab (pst, psymtab_include_list, includes_used,
2131                    symnum * symbol_size,
2132                    text_end > pst->texthigh ? text_end : pst->texthigh,
2133                    dependency_list, dependencies_used, textlow_not_set);
2134     }
2135
2136   do_cleanups (back_to);
2137 }
2138
2139 /* Allocate and partially fill a partial symtab.  It will be
2140    completely filled at the end of the symbol list.
2141
2142    SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
2143    is the address relative to which its symbols are (incremental) or 0
2144    (normal). */
2145
2146
2147 static struct partial_symtab *
2148 start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
2149                int ldsymoff, struct partial_symbol **global_syms,
2150                struct partial_symbol **static_syms)
2151 {
2152   struct partial_symtab *result =
2153   start_psymtab_common (objfile, objfile->section_offsets,
2154                         filename, textlow, global_syms, static_syms);
2155
2156   result->read_symtab_private = (char *)
2157     obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
2158   LDSYMOFF (result) = ldsymoff;
2159   result->read_symtab = dbx_psymtab_to_symtab;
2160   SYMBOL_SIZE (result) = symbol_size;
2161   SYMBOL_OFFSET (result) = symbol_table_offset;
2162   STRING_OFFSET (result) = string_table_offset;
2163   FILE_STRING_OFFSET (result) = file_string_table_offset;
2164
2165   /* If we're handling an ELF file, drag some section-relocation info
2166      for this source file out of the ELF symbol table, to compensate for
2167      Sun brain death.  This replaces the section_offsets in this psymtab,
2168      if successful.  */
2169   elfstab_offset_sections (objfile, result);
2170
2171   /* Deduce the source language from the filename for this psymtab. */
2172   psymtab_language = deduce_language_from_filename (filename);
2173
2174   return result;
2175 }
2176
2177 /* Close off the current usage of PST.  
2178    Returns PST or NULL if the partial symtab was empty and thrown away.
2179
2180    FIXME:  List variables and peculiarities of same.  */
2181
2182 struct partial_symtab *
2183 end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
2184              int capping_symbol_offset, CORE_ADDR capping_text,
2185              struct partial_symtab **dependency_list, int number_dependencies,
2186              int textlow_not_set)
2187 {
2188   int i;
2189   struct objfile *objfile = pst->objfile;
2190
2191   if (capping_symbol_offset != -1)
2192     LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
2193   pst->texthigh = capping_text;
2194
2195 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
2196   /* Under Solaris, the N_SO symbols always have a value of 0,
2197      instead of the usual address of the .o file.  Therefore,
2198      we have to do some tricks to fill in texthigh and textlow.
2199      The first trick is: if we see a static
2200      or global function, and the textlow for the current pst
2201      is not set (ie: textlow_not_set), then we use that function's
2202      address for the textlow of the pst.  */
2203
2204   /* Now, to fill in texthigh, we remember the last function seen
2205      in the .o file.  Also, there's a hack in
2206      bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
2207      to here via the misc_info field.  Therefore, we can fill in
2208      a reliable texthigh by taking the address plus size of the
2209      last function in the file.  */
2210
2211   if (pst->texthigh == 0 && last_function_name)
2212     {
2213       char *p;
2214       int n;
2215       struct minimal_symbol *minsym;
2216
2217       p = strchr (last_function_name, ':');
2218       if (p == NULL)
2219         p = last_function_name;
2220       n = p - last_function_name;
2221       p = alloca (n + 2);
2222       strncpy (p, last_function_name, n);
2223       p[n] = 0;
2224
2225       minsym = lookup_minimal_symbol (p, pst->filename, objfile);
2226       if (minsym == NULL)
2227         {
2228           /* Sun Fortran appends an underscore to the minimal symbol name,
2229              try again with an appended underscore if the minimal symbol
2230              was not found.  */
2231           p[n] = '_';
2232           p[n + 1] = 0;
2233           minsym = lookup_minimal_symbol (p, pst->filename, objfile);
2234         }
2235
2236       if (minsym)
2237         pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
2238
2239       last_function_name = NULL;
2240     }
2241
2242   /* this test will be true if the last .o file is only data */
2243   if (textlow_not_set)
2244     pst->textlow = pst->texthigh;
2245   else
2246     {
2247       struct partial_symtab *p1;
2248
2249       /* If we know our own starting text address, then walk through all other
2250          psymtabs for this objfile, and if any didn't know their ending text
2251          address, set it to our starting address.  Take care to not set our
2252          own ending address to our starting address, nor to set addresses on
2253          `dependency' files that have both textlow and texthigh zero.  */
2254
2255       ALL_OBJFILE_PSYMTABS (objfile, p1)
2256       {
2257         if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
2258           {
2259             p1->texthigh = pst->textlow;
2260             /* if this file has only data, then make textlow match texthigh */
2261             if (p1->textlow == 0)
2262               p1->textlow = p1->texthigh;
2263           }
2264       }
2265     }
2266
2267   /* End of kludge for patching Solaris textlow and texthigh.  */
2268 #endif /* SOFUN_ADDRESS_MAYBE_MISSING.  */
2269
2270   pst->n_global_syms =
2271     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
2272   pst->n_static_syms =
2273     objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
2274
2275   pst->number_of_dependencies = number_dependencies;
2276   if (number_dependencies)
2277     {
2278       pst->dependencies = (struct partial_symtab **)
2279         obstack_alloc (&objfile->psymbol_obstack,
2280                     number_dependencies * sizeof (struct partial_symtab *));
2281       memcpy (pst->dependencies, dependency_list,
2282               number_dependencies * sizeof (struct partial_symtab *));
2283     }
2284   else
2285     pst->dependencies = 0;
2286
2287   for (i = 0; i < num_includes; i++)
2288     {
2289       struct partial_symtab *subpst =
2290       allocate_psymtab (include_list[i], objfile);
2291
2292       /* Copy the sesction_offsets array from the main psymtab. */
2293       subpst->section_offsets = pst->section_offsets;
2294       subpst->read_symtab_private =
2295         (char *) obstack_alloc (&objfile->psymbol_obstack,
2296                                 sizeof (struct symloc));
2297       LDSYMOFF (subpst) =
2298         LDSYMLEN (subpst) =
2299         subpst->textlow =
2300         subpst->texthigh = 0;
2301
2302       /* We could save slight bits of space by only making one of these,
2303          shared by the entire set of include files.  FIXME-someday.  */
2304       subpst->dependencies = (struct partial_symtab **)
2305         obstack_alloc (&objfile->psymbol_obstack,
2306                        sizeof (struct partial_symtab *));
2307       subpst->dependencies[0] = pst;
2308       subpst->number_of_dependencies = 1;
2309
2310       subpst->globals_offset =
2311         subpst->n_global_syms =
2312         subpst->statics_offset =
2313         subpst->n_static_syms = 0;
2314
2315       subpst->readin = 0;
2316       subpst->symtab = 0;
2317       subpst->read_symtab = pst->read_symtab;
2318     }
2319
2320   sort_pst_symbols (pst);
2321
2322   /* If there is already a psymtab or symtab for a file of this name, remove it.
2323      (If there is a symtab, more drastic things also happen.)
2324      This happens in VxWorks.  */
2325   free_named_symtabs (pst->filename);
2326
2327   if (num_includes == 0
2328       && number_dependencies == 0
2329       && pst->n_global_syms == 0
2330       && pst->n_static_syms == 0
2331       && has_line_numbers == 0)
2332     {
2333       /* Throw away this psymtab, it's empty.  We can't deallocate it, since
2334          it is on the obstack, but we can forget to chain it on the list.  */
2335       /* Empty psymtabs happen as a result of header files which don't have
2336          any symbols in them.  There can be a lot of them.  But this check
2337          is wrong, in that a psymtab with N_SLINE entries but nothing else
2338          is not empty, but we don't realize that.  Fixing that without slowing
2339          things down might be tricky.  */
2340
2341       discard_psymtab (pst);
2342
2343       /* Indicate that psymtab was thrown away.  */
2344       pst = (struct partial_symtab *) NULL;
2345     }
2346   return pst;
2347 }
2348 \f
2349 static void
2350 dbx_psymtab_to_symtab_1 (struct partial_symtab *pst)
2351 {
2352   struct cleanup *old_chain;
2353   int i;
2354
2355   if (!pst)
2356     return;
2357
2358   if (pst->readin)
2359     {
2360       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
2361                           pst->filename);
2362       return;
2363     }
2364
2365   /* Read in all partial symtabs on which this one is dependent */
2366   for (i = 0; i < pst->number_of_dependencies; i++)
2367     if (!pst->dependencies[i]->readin)
2368       {
2369         /* Inform about additional files that need to be read in.  */
2370         if (info_verbose)
2371           {
2372             fputs_filtered (" ", gdb_stdout);
2373             wrap_here ("");
2374             fputs_filtered ("and ", gdb_stdout);
2375             wrap_here ("");
2376             printf_filtered ("%s...", pst->dependencies[i]->filename);
2377             wrap_here ("");     /* Flush output */
2378             gdb_flush (gdb_stdout);
2379           }
2380         dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
2381       }
2382
2383   if (LDSYMLEN (pst))           /* Otherwise it's a dummy */
2384     {
2385       /* Init stuff necessary for reading in symbols */
2386       stabsread_init ();
2387       buildsym_init ();
2388       old_chain = make_cleanup (really_free_pendings, 0);
2389       file_string_table_offset = FILE_STRING_OFFSET (pst);
2390       symbol_size = SYMBOL_SIZE (pst);
2391
2392       /* Read in this file's symbols */
2393       bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
2394       read_ofile_symtab (pst);
2395
2396       do_cleanups (old_chain);
2397     }
2398
2399   pst->readin = 1;
2400 }
2401
2402 /* Read in all of the symbols for a given psymtab for real.
2403    Be verbose about it if the user wants that.  */
2404
2405 static void
2406 dbx_psymtab_to_symtab (struct partial_symtab *pst)
2407 {
2408   bfd *sym_bfd;
2409   struct cleanup *back_to = NULL;
2410
2411   if (!pst)
2412     return;
2413
2414   if (pst->readin)
2415     {
2416       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
2417                           pst->filename);
2418       return;
2419     }
2420
2421   if (LDSYMLEN (pst) || pst->number_of_dependencies)
2422     {
2423       /* Print the message now, before reading the string table,
2424          to avoid disconcerting pauses.  */
2425       if (info_verbose)
2426         {
2427           printf_filtered ("Reading in symbols for %s...", pst->filename);
2428           gdb_flush (gdb_stdout);
2429         }
2430
2431       sym_bfd = pst->objfile->obfd;
2432
2433       next_symbol_text_func = dbx_next_symbol_text;
2434
2435       if (DBX_STAB_SECTION (pst->objfile))
2436         {
2437           stabs_data
2438             = symfile_relocate_debug_section (pst->objfile->obfd,
2439                                               DBX_STAB_SECTION (pst->objfile),
2440                                               NULL);
2441           if (stabs_data)
2442             back_to = make_cleanup (free_current_contents, (void *) &stabs_data);
2443         }
2444
2445       dbx_psymtab_to_symtab_1 (pst);
2446
2447       if (back_to)
2448         do_cleanups (back_to);
2449
2450       /* Match with global symbols.  This only needs to be done once,
2451          after all of the symtabs and dependencies have been read in.   */
2452       scan_file_globals (pst->objfile);
2453
2454       /* Finish up the debug error message.  */
2455       if (info_verbose)
2456         printf_filtered ("done.\n");
2457     }
2458 }
2459
2460 /* Read in a defined section of a specific object file's symbols. */
2461
2462 static void
2463 read_ofile_symtab (struct partial_symtab *pst)
2464 {
2465   char *namestring;
2466   struct external_nlist *bufp;
2467   struct internal_nlist nlist;
2468   unsigned char type;
2469   unsigned max_symnum;
2470   bfd *abfd;
2471   struct objfile *objfile;
2472   int sym_offset;               /* Offset to start of symbols to read */
2473   int sym_size;                 /* Size of symbols to read */
2474   CORE_ADDR text_offset;        /* Start of text segment for symbols */
2475   int text_size;                /* Size of text segment for symbols */
2476   struct section_offsets *section_offsets;
2477
2478   objfile = pst->objfile;
2479   sym_offset = LDSYMOFF (pst);
2480   sym_size = LDSYMLEN (pst);
2481   text_offset = pst->textlow;
2482   text_size = pst->texthigh - pst->textlow;
2483   /* This cannot be simply objfile->section_offsets because of
2484      elfstab_offset_sections() which initializes the psymtab section
2485      offsets information in a special way, and that is different from
2486      objfile->section_offsets. */ 
2487   section_offsets = pst->section_offsets;
2488
2489   current_objfile = objfile;
2490   subfile_stack = NULL;
2491
2492   stringtab_global = DBX_STRINGTAB (objfile);
2493   last_source_file = NULL;
2494
2495   abfd = objfile->obfd;
2496   symfile_bfd = objfile->obfd;  /* Implicit param to next_text_symbol */
2497   symbuf_end = symbuf_idx = 0;
2498   symbuf_read = 0;
2499   symbuf_left = sym_offset + sym_size;
2500
2501   /* It is necessary to actually read one symbol *before* the start
2502      of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
2503      occurs before the N_SO symbol.
2504
2505      Detecting this in read_dbx_symtab
2506      would slow down initial readin, so we look for it here instead.  */
2507   if (!processing_acc_compilation && sym_offset >= (int) symbol_size)
2508     {
2509       stabs_seek (sym_offset - symbol_size);
2510       fill_symbuf (abfd);
2511       bufp = &symbuf[symbuf_idx++];
2512       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
2513       OBJSTAT (objfile, n_stabs++);
2514
2515       namestring = set_namestring (objfile, nlist);
2516
2517       processing_gcc_compilation = 0;
2518       if (nlist.n_type == N_TEXT)
2519         {
2520           const char *tempstring = namestring;
2521
2522           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
2523             processing_gcc_compilation = 1;
2524           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
2525             processing_gcc_compilation = 2;
2526           if (tempstring[0] == bfd_get_symbol_leading_char (symfile_bfd))
2527             ++tempstring;
2528           if (STREQN (tempstring, "__gnu_compiled", 14))
2529             processing_gcc_compilation = 2;
2530         }
2531
2532       /* Try to select a C++ demangling based on the compilation unit
2533          producer. */
2534
2535 #if 0
2536       /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
2537          know whether it will use the old style or v3 mangling.  */
2538       if (processing_gcc_compilation)
2539         {
2540           if (AUTO_DEMANGLING)
2541             {
2542               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
2543             }
2544         }
2545 #endif
2546     }
2547   else
2548     {
2549       /* The N_SO starting this symtab is the first symbol, so we
2550          better not check the symbol before it.  I'm not this can
2551          happen, but it doesn't hurt to check for it.  */
2552       stabs_seek (sym_offset);
2553       processing_gcc_compilation = 0;
2554     }
2555
2556   if (symbuf_idx == symbuf_end)
2557     fill_symbuf (abfd);
2558   bufp = &symbuf[symbuf_idx];
2559   if (bfd_h_get_8 (abfd, bufp->e_type) != N_SO)
2560     error ("First symbol in segment of executable not a source symbol");
2561
2562   max_symnum = sym_size / symbol_size;
2563
2564   for (symnum = 0;
2565        symnum < max_symnum;
2566        symnum++)
2567     {
2568       QUIT;                     /* Allow this to be interruptable */
2569       if (symbuf_idx == symbuf_end)
2570         fill_symbuf (abfd);
2571       bufp = &symbuf[symbuf_idx++];
2572       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
2573       OBJSTAT (objfile, n_stabs++);
2574
2575       type = bfd_h_get_8 (abfd, bufp->e_type);
2576
2577       namestring = set_namestring (objfile, nlist);
2578
2579       if (type & N_STAB)
2580         {
2581           process_one_symbol (type, nlist.n_desc, nlist.n_value,
2582                               namestring, section_offsets, objfile);
2583         }
2584       /* We skip checking for a new .o or -l file; that should never
2585          happen in this routine. */
2586       else if (type == N_TEXT)
2587         {
2588           /* I don't think this code will ever be executed, because
2589              the GCC_COMPILED_FLAG_SYMBOL usually is right before
2590              the N_SO symbol which starts this source file.
2591              However, there is no reason not to accept
2592              the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
2593
2594           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
2595             processing_gcc_compilation = 1;
2596           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
2597             processing_gcc_compilation = 2;
2598
2599 #if 0
2600           /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
2601              know whether it will use the old style or v3 mangling.  */
2602           if (AUTO_DEMANGLING)
2603             {
2604               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
2605             }
2606 #endif
2607         }
2608       else if (type & N_EXT || type == (unsigned char) N_TEXT
2609                || type == (unsigned char) N_NBTEXT
2610         )
2611         {
2612           /* Global symbol: see if we came across a dbx defintion for
2613              a corresponding symbol.  If so, store the value.  Remove
2614              syms from the chain when their values are stored, but
2615              search the whole chain, as there may be several syms from
2616              different files with the same name. */
2617           /* This is probably not true.  Since the files will be read
2618              in one at a time, each reference to a global symbol will
2619              be satisfied in each file as it appears. So we skip this
2620              section. */
2621           ;
2622         }
2623     }
2624
2625   current_objfile = NULL;
2626
2627   /* In a Solaris elf file, this variable, which comes from the
2628      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
2629      which comes from pst->textlow is correct. */
2630   if (last_source_start_addr == 0)
2631     last_source_start_addr = text_offset;
2632
2633   /* In reordered executables last_source_start_addr may not be the
2634      lower bound for this symtab, instead use text_offset which comes
2635      from pst->textlow which is correct.  */
2636   if (last_source_start_addr > text_offset)
2637     last_source_start_addr = text_offset;
2638
2639   pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
2640
2641   end_stabs ();
2642 }
2643 \f
2644
2645 /* This handles a single symbol from the symbol-file, building symbols
2646    into a GDB symtab.  It takes these arguments and an implicit argument.
2647
2648    TYPE is the type field of the ".stab" symbol entry.
2649    DESC is the desc field of the ".stab" entry.
2650    VALU is the value field of the ".stab" entry.
2651    NAME is the symbol name, in our address space.
2652    SECTION_OFFSETS is a set of amounts by which the sections of this object
2653    file were relocated when it was loaded into memory.
2654    Note that these section_offsets are not the 
2655    objfile->section_offsets but the pst->section_offsets.
2656    All symbols that refer
2657    to memory locations need to be offset by these amounts.
2658    OBJFILE is the object file from which we are reading symbols.
2659    It is used in end_symtab.  */
2660
2661 void
2662 process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
2663                     struct section_offsets *section_offsets,
2664                     struct objfile *objfile)
2665 {
2666 #ifdef SUN_FIXED_LBRAC_BUG
2667   /* If SUN_FIXED_LBRAC_BUG is defined, then it tells us whether we need
2668      to correct the address of N_LBRAC's.  If it is not defined, then
2669      we never need to correct the addresses.  */
2670
2671   /* This records the last pc address we've seen.  We depend on there being
2672      an SLINE or FUN or SO before the first LBRAC, since the variable does
2673      not get reset in between reads of different symbol files.  */
2674   static CORE_ADDR last_pc_address;
2675 #endif
2676
2677   struct context_stack *new;
2678   /* This remembers the address of the start of a function.  It is used
2679      because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
2680      relative to the current function's start address.  On systems
2681      other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
2682      used to relocate these symbol types rather than SECTION_OFFSETS.  */
2683   static CORE_ADDR function_start_offset;
2684
2685   /* This holds the address of the start of a function, without the system
2686      peculiarities of function_start_offset.  */
2687   static CORE_ADDR last_function_start;
2688
2689   /* If this is nonzero, we've seen an N_SLINE since the start of the
2690      current function.  We use this to tell us to move the first sline
2691      to the beginning of the function regardless of what its given
2692      value is. */
2693   static int sline_found_in_function = 1;
2694
2695   /* If this is nonzero, we've seen a non-gcc N_OPT symbol for this source
2696      file.  Used to detect the SunPRO solaris compiler.  */
2697   static int n_opt_found;
2698
2699   /* The stab type used for the definition of the last function.
2700      N_STSYM or N_GSYM for SunOS4 acc; N_FUN for other compilers.  */
2701   static int function_stab_type = 0;
2702
2703   if (!block_address_function_relative)
2704     /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
2705        function start address, so just use the text offset.  */
2706     function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2707
2708   /* Something is wrong if we see real data before
2709      seeing a source file name.  */
2710
2711   if (last_source_file == NULL && type != (unsigned char) N_SO)
2712     {
2713       /* Ignore any symbols which appear before an N_SO symbol.
2714          Currently no one puts symbols there, but we should deal
2715          gracefully with the case.  A complain()t might be in order,
2716          but this should not be an error ().  */
2717       return;
2718     }
2719
2720   switch (type)
2721     {
2722     case N_FUN:
2723     case N_FNAME:
2724
2725       if (*name == '\000')
2726         {
2727           /* This N_FUN marks the end of a function.  This closes off the
2728              current block.  */
2729
2730           if (context_stack_depth <= 0)
2731             {
2732               lbrac_mismatch_complaint (symnum);
2733               break;
2734             }
2735
2736           /* The following check is added before recording line 0 at
2737              end of function so as to handle hand-generated stabs
2738              which may have an N_FUN stabs at the end of the function, but
2739              no N_SLINE stabs.  */
2740           if (sline_found_in_function)
2741             record_line (current_subfile, 0, last_function_start + valu);
2742
2743           within_function = 0;
2744           new = pop_context ();
2745
2746           /* Make a block for the local symbols within.  */
2747           finish_block (new->name, &local_symbols, new->old_blocks,
2748                         new->start_addr, new->start_addr + valu,
2749                         objfile);
2750
2751           /* May be switching to an assembler file which may not be using
2752              block relative stabs, so reset the offset.  */
2753           if (block_address_function_relative)
2754             function_start_offset = 0;
2755
2756           break;
2757         }
2758
2759       sline_found_in_function = 0;
2760
2761       /* Relocate for dynamic loading */
2762       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2763       valu = SMASH_TEXT_ADDRESS (valu);
2764       last_function_start = valu;
2765
2766       goto define_a_symbol;
2767
2768     case N_LBRAC:
2769       /* This "symbol" just indicates the start of an inner lexical
2770          context within a function.  */
2771
2772       /* Ignore extra outermost context from SunPRO cc and acc.  */
2773       if (n_opt_found && desc == 1)
2774         break;
2775
2776       if (block_address_function_relative)
2777         /* Relocate for Sun ELF acc fn-relative syms.  */
2778         valu += function_start_offset;
2779       else
2780         /* On most machines, the block addresses are relative to the
2781            N_SO, the linker did not relocate them (sigh).  */
2782         valu += last_source_start_addr;
2783
2784 #ifdef SUN_FIXED_LBRAC_BUG
2785       if (!SUN_FIXED_LBRAC_BUG && valu < last_pc_address)
2786         {
2787           /* Patch current LBRAC pc value to match last handy pc value */
2788           complaint (&symfile_complaints, "bad block start address patched");
2789           valu = last_pc_address;
2790         }
2791 #endif
2792       new = push_context (desc, valu);
2793       break;
2794
2795     case N_RBRAC:
2796       /* This "symbol" just indicates the end of an inner lexical
2797          context that was started with N_LBRAC.  */
2798
2799       /* Ignore extra outermost context from SunPRO cc and acc.  */
2800       if (n_opt_found && desc == 1)
2801         break;
2802
2803       if (block_address_function_relative)
2804         /* Relocate for Sun ELF acc fn-relative syms.  */
2805         valu += function_start_offset;
2806       else
2807         /* On most machines, the block addresses are relative to the
2808            N_SO, the linker did not relocate them (sigh).  */
2809         valu += last_source_start_addr;
2810
2811       if (context_stack_depth <= 0)
2812         {
2813           lbrac_mismatch_complaint (symnum);
2814           break;
2815         }
2816
2817       new = pop_context ();
2818       if (desc != new->depth)
2819         lbrac_mismatch_complaint (symnum);
2820
2821       /* Some compilers put the variable decls inside of an
2822          LBRAC/RBRAC block.  This macro should be nonzero if this
2823          is true.  DESC is N_DESC from the N_RBRAC symbol.
2824          GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
2825          or the GCC2_COMPILED_SYMBOL.  */
2826 #if !defined (VARIABLES_INSIDE_BLOCK)
2827 #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
2828 #endif
2829
2830       /* Can only use new->locals as local symbols here if we're in
2831          gcc or on a machine that puts them before the lbrack.  */
2832       if (!VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2833         {
2834           if (local_symbols != NULL)
2835             {
2836               /* GCC development snapshots from March to December of
2837                  2000 would output N_LSYM entries after N_LBRAC
2838                  entries.  As a consequence, these symbols are simply
2839                  discarded.  Complain if this is the case.  Note that
2840                  there are some compilers which legitimately put local
2841                  symbols within an LBRAC/RBRAC block; this complaint
2842                  might also help sort out problems in which
2843                  VARIABLES_INSIDE_BLOCK is incorrectly defined.  */
2844               complaint (&symfile_complaints,
2845                          "misplaced N_LBRAC entry; discarding local symbols which have no enclosing block");
2846             }
2847           local_symbols = new->locals;
2848         }
2849
2850       if (context_stack_depth
2851           > !VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2852         {
2853           /* This is not the outermost LBRAC...RBRAC pair in the function,
2854              its local symbols preceded it, and are the ones just recovered
2855              from the context stack.  Define the block for them (but don't
2856              bother if the block contains no symbols.  Should we complain
2857              on blocks without symbols?  I can't think of any useful purpose
2858              for them).  */
2859           if (local_symbols != NULL)
2860             {
2861               /* Muzzle a compiler bug that makes end < start.  (which
2862                  compilers?  Is this ever harmful?).  */
2863               if (new->start_addr > valu)
2864                 {
2865                   complaint (&symfile_complaints,
2866                              "block start larger than block end");
2867                   new->start_addr = valu;
2868                 }
2869               /* Make a block for the local symbols within.  */
2870               finish_block (0, &local_symbols, new->old_blocks,
2871                             new->start_addr, valu, objfile);
2872             }
2873         }
2874       else
2875         {
2876           /* This is the outermost LBRAC...RBRAC pair.  There is no
2877              need to do anything; leave the symbols that preceded it
2878              to be attached to the function's own block.  We need to
2879              indicate that we just moved outside of the function.  */
2880           within_function = 0;
2881         }
2882
2883       if (VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2884         /* Now pop locals of block just finished.  */
2885         local_symbols = new->locals;
2886       break;
2887
2888     case N_FN:
2889     case N_FN_SEQ:
2890       /* This kind of symbol indicates the start of an object file.  */
2891       /* Relocate for dynamic loading */
2892       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2893       break;
2894
2895     case N_SO:
2896       /* This type of symbol indicates the start of data
2897          for one source file.
2898          Finish the symbol table of the previous source file
2899          (if any) and start accumulating a new symbol table.  */
2900       /* Relocate for dynamic loading */
2901       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2902
2903       n_opt_found = 0;
2904
2905 #ifdef SUN_FIXED_LBRAC_BUG
2906       last_pc_address = valu;   /* Save for SunOS bug circumcision */
2907 #endif
2908
2909 #ifdef PCC_SOL_BROKEN
2910       /* pcc bug, occasionally puts out SO for SOL.  */
2911       if (context_stack_depth > 0)
2912         {
2913           start_subfile (name, NULL);
2914           break;
2915         }
2916 #endif
2917       if (last_source_file)
2918         {
2919           /* Check if previous symbol was also an N_SO (with some
2920              sanity checks).  If so, that one was actually the directory
2921              name, and the current one is the real file name.
2922              Patch things up. */
2923           if (previous_stab_code == (unsigned char) N_SO)
2924             {
2925               patch_subfile_names (current_subfile, name);
2926               break;            /* Ignore repeated SOs */
2927             }
2928           end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
2929           end_stabs ();
2930         }
2931
2932       /* Null name means this just marks the end of text for this .o file.
2933          Don't start a new symtab in this case.  */
2934       if (*name == '\000')
2935         break;
2936
2937       if (block_address_function_relative)
2938         function_start_offset = 0;
2939
2940       start_stabs ();
2941       start_symtab (name, NULL, valu);
2942       record_debugformat ("stabs");
2943       break;
2944
2945     case N_SOL:
2946       /* This type of symbol indicates the start of data for
2947          a sub-source-file, one whose contents were copied or
2948          included in the compilation of the main source file
2949          (whose name was given in the N_SO symbol.)  */
2950       /* Relocate for dynamic loading */
2951       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2952       start_subfile (name, current_subfile->dirname);
2953       break;
2954
2955     case N_BINCL:
2956       push_subfile ();
2957       add_new_header_file (name, valu);
2958       start_subfile (name, current_subfile->dirname);
2959       break;
2960
2961     case N_EINCL:
2962       start_subfile (pop_subfile (), current_subfile->dirname);
2963       break;
2964
2965     case N_EXCL:
2966       add_old_header_file (name, valu);
2967       break;
2968
2969     case N_SLINE:
2970       /* This type of "symbol" really just records
2971          one line-number -- core-address correspondence.
2972          Enter it in the line list for this symbol table.  */
2973
2974       /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
2975       valu += function_start_offset;
2976
2977 #ifdef SUN_FIXED_LBRAC_BUG
2978       last_pc_address = valu;   /* Save for SunOS bug circumcision */
2979 #endif
2980       /* If this is the first SLINE note in the function, record it at
2981          the start of the function instead of at the listed location.  */
2982       if (within_function && sline_found_in_function == 0)
2983         {
2984           record_line (current_subfile, desc, last_function_start);
2985           sline_found_in_function = 1;
2986         }
2987       else
2988         record_line (current_subfile, desc, valu);
2989       break;
2990
2991     case N_BCOMM:
2992       common_block_start (name, objfile);
2993       break;
2994
2995     case N_ECOMM:
2996       common_block_end (objfile);
2997       break;
2998
2999       /* The following symbol types need to have the appropriate offset added
3000          to their value; then we process symbol definitions in the name.  */
3001
3002     case N_STSYM:               /* Static symbol in data seg */
3003     case N_LCSYM:               /* Static symbol in BSS seg */
3004     case N_ROSYM:               /* Static symbol in Read-only data seg */
3005       /* HORRID HACK DEPT.  However, it's Sun's furgin' fault.
3006          Solaris2's stabs-in-elf makes *most* symbols relative
3007          but leaves a few absolute (at least for Solaris 2.1 and version
3008          2.0.1 of the SunPRO compiler).  N_STSYM and friends sit on the fence.
3009          .stab "foo:S...",N_STSYM        is absolute (ld relocates it)
3010          .stab "foo:V...",N_STSYM        is relative (section base subtracted).
3011          This leaves us no choice but to search for the 'S' or 'V'...
3012          (or pass the whole section_offsets stuff down ONE MORE function
3013          call level, which we really don't want to do).  */
3014       {
3015         char *p;
3016
3017         /* .o files and NLMs have non-zero text seg offsets, but don't need
3018            their static syms offset in this fashion.  XXX - This is really a
3019            crock that should be fixed in the solib handling code so that I
3020            don't have to work around it here. */
3021
3022         if (!symfile_relocatable)
3023           {
3024             p = strchr (name, ':');
3025             if (p != 0 && p[1] == 'S')
3026               {
3027                 /* The linker relocated it.  We don't want to add an
3028                    elfstab_offset_sections-type offset, but we *do* want
3029                    to add whatever solib.c passed to symbol_file_add as
3030                    addr (this is known to affect SunOS4, and I suspect ELF
3031                    too).  Since elfstab_offset_sections currently does not
3032                    muck with the text offset (there is no Ttext.text
3033                    symbol), we can get addr from the text offset.  If
3034                    elfstab_offset_sections ever starts dealing with the
3035                    text offset, and we still need to do this, we need to
3036                    invent a SECT_OFF_ADDR_KLUDGE or something.  */
3037                 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
3038                 goto define_a_symbol;
3039               }
3040           }
3041         /* Since it's not the kludge case, re-dispatch to the right handler. */
3042         switch (type)
3043           {
3044           case N_STSYM:
3045             goto case_N_STSYM;
3046           case N_LCSYM:
3047             goto case_N_LCSYM;
3048           case N_ROSYM:
3049             goto case_N_ROSYM;
3050           default:
3051             internal_error (__FILE__, __LINE__, "failed internal consistency check");
3052           }
3053       }
3054
3055     case_N_STSYM:               /* Static symbol in data seg */
3056     case N_DSLINE:              /* Source line number, data seg */
3057       valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
3058       goto define_a_symbol;
3059
3060     case_N_LCSYM:               /* Static symbol in BSS seg */
3061     case N_BSLINE:              /* Source line number, bss seg */
3062       /*   N_BROWS:       overlaps with N_BSLINE */
3063       valu += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
3064       goto define_a_symbol;
3065
3066     case_N_ROSYM:               /* Static symbol in Read-only data seg */
3067       valu += ANOFFSET (section_offsets, SECT_OFF_RODATA (objfile));
3068       goto define_a_symbol;
3069
3070     case N_ENTRY:               /* Alternate entry point */
3071       /* Relocate for dynamic loading */
3072       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
3073       goto define_a_symbol;
3074
3075       /* The following symbol types we don't know how to process.  Handle
3076          them in a "default" way, but complain to people who care.  */
3077     default:
3078     case N_CATCH:               /* Exception handler catcher */
3079     case N_EHDECL:              /* Exception handler name */
3080     case N_PC:                  /* Global symbol in Pascal */
3081     case N_M2C:         /* Modula-2 compilation unit */
3082       /*   N_MOD2:        overlaps with N_EHDECL */
3083     case N_SCOPE:               /* Modula-2 scope information */
3084     case N_ECOML:               /* End common (local name) */
3085     case N_NBTEXT:              /* Gould Non-Base-Register symbols??? */
3086     case N_NBDATA:
3087     case N_NBBSS:
3088     case N_NBSTS:
3089     case N_NBLCS:
3090       unknown_symtype_complaint (local_hex_string (type));
3091       /* FALLTHROUGH */
3092
3093       /* The following symbol types don't need the address field relocated,
3094          since it is either unused, or is absolute.  */
3095     define_a_symbol:
3096     case N_GSYM:                /* Global variable */
3097     case N_NSYMS:               /* Number of symbols (ultrix) */
3098     case N_NOMAP:               /* No map?  (ultrix) */
3099     case N_RSYM:                /* Register variable */
3100     case N_DEFD:                /* Modula-2 GNU module dependency */
3101     case N_SSYM:                /* Struct or union element */
3102     case N_LSYM:                /* Local symbol in stack */
3103     case N_PSYM:                /* Parameter variable */
3104     case N_LENG:                /* Length of preceding symbol type */
3105       if (name)
3106         {
3107           int deftype;
3108           char *colon_pos = strchr (name, ':');
3109           if (colon_pos == NULL)
3110             deftype = '\0';
3111           else
3112             deftype = colon_pos[1];
3113
3114           switch (deftype)
3115             {
3116             case 'f':
3117             case 'F':
3118               function_stab_type = type;
3119
3120 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
3121               /* Deal with the SunPRO 3.0 compiler which omits the address
3122                  from N_FUN symbols.  */
3123               if (type == N_FUN
3124                   && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile)))
3125                 {
3126                   CORE_ADDR minsym_valu = 
3127                     find_stab_function_addr (name, last_source_file, objfile);
3128
3129                   /* find_stab_function_addr will return 0 if the minimal
3130                      symbol wasn't found.  (Unfortunately, this might also
3131                      be a valid address.)  Anyway, if it *does* return 0,
3132                      it is likely that the value was set correctly to begin
3133                      with... */
3134                   if (minsym_valu != 0)
3135                     valu = minsym_valu;
3136                 }
3137 #endif
3138
3139 #ifdef SUN_FIXED_LBRAC_BUG
3140               /* The Sun acc compiler, under SunOS4, puts out
3141                  functions with N_GSYM or N_STSYM.  The problem is
3142                  that the address of the symbol is no good (for N_GSYM
3143                  it doesn't even attept an address; for N_STSYM it
3144                  puts out an address but then it gets relocated
3145                  relative to the data segment, not the text segment).
3146                  Currently we can't fix this up later as we do for
3147                  some types of symbol in scan_file_globals.
3148                  Fortunately we do have a way of finding the address -
3149                  we know that the value in last_pc_address is either
3150                  the one we want (if we're dealing with the first
3151                  function in an object file), or somewhere in the
3152                  previous function. This means that we can use the
3153                  minimal symbol table to get the address.  */
3154
3155               /* Starting with release 3.0, the Sun acc compiler,
3156                  under SunOS4, puts out functions with N_FUN and a value
3157                  of zero. This gets relocated to the start of the text
3158                  segment of the module, which is no good either.
3159                  Under SunOS4 we can deal with this as N_SLINE and N_SO
3160                  entries contain valid absolute addresses.
3161                  Release 3.0 acc also puts out N_OPT entries, which makes
3162                  it possible to discern acc from cc or gcc.  */
3163
3164               if (type == N_GSYM || type == N_STSYM
3165                   || (type == N_FUN
3166                       && n_opt_found && !block_address_function_relative))
3167                 {
3168                   struct minimal_symbol *m;
3169                   int l = colon_pos - name;
3170
3171                   m = lookup_minimal_symbol_by_pc (last_pc_address);
3172                   if (m && STREQN (DEPRECATED_SYMBOL_NAME (m), name, l)
3173                       && DEPRECATED_SYMBOL_NAME (m)[l] == '\0')
3174                     /* last_pc_address was in this function */
3175                     valu = SYMBOL_VALUE (m);
3176                   else if (m && DEPRECATED_SYMBOL_NAME (m + 1)
3177                            && STREQN (DEPRECATED_SYMBOL_NAME (m + 1), name, l)
3178                            && DEPRECATED_SYMBOL_NAME (m + 1)[l] == '\0')
3179                     /* last_pc_address was in last function */
3180                     valu = SYMBOL_VALUE (m + 1);
3181                   else
3182                     /* Not found - use last_pc_address (for finish_block) */
3183                     valu = last_pc_address;
3184                 }
3185
3186               last_pc_address = valu;   /* Save for SunOS bug circumcision */
3187 #endif
3188
3189               if (block_address_function_relative)
3190                 /* For Solaris 2.0 compilers, the block addresses and
3191                    N_SLINE's are relative to the start of the
3192                    function.  On normal systems, and when using gcc on
3193                    Solaris 2.0, these addresses are just absolute, or
3194                    relative to the N_SO, depending on
3195                    BLOCK_ADDRESS_ABSOLUTE.  */
3196                 function_start_offset = valu;
3197
3198               within_function = 1;
3199
3200               if (context_stack_depth > 1)
3201                 {
3202                   complaint (&symfile_complaints,
3203                              "unmatched N_LBRAC before symtab pos %d", symnum);
3204                   break;
3205                 }
3206
3207               if (context_stack_depth > 0)
3208                 {
3209                   new = pop_context ();
3210                   /* Make a block for the local symbols within.  */
3211                   finish_block (new->name, &local_symbols, new->old_blocks,
3212                                 new->start_addr, valu, objfile);
3213                 }
3214
3215               new = push_context (0, valu);
3216               new->name = define_symbol (valu, name, desc, type, objfile);
3217               break;
3218
3219             default:
3220               define_symbol (valu, name, desc, type, objfile);
3221               break;
3222             }
3223         }
3224       break;
3225
3226       /* We use N_OPT to carry the gcc2_compiled flag.  Sun uses it
3227          for a bunch of other flags, too.  Someday we may parse their
3228          flags; for now we ignore theirs and hope they'll ignore ours.  */
3229     case N_OPT:         /* Solaris 2:  Compiler options */
3230       if (name)
3231         {
3232           if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
3233             {
3234               processing_gcc_compilation = 2;
3235 #if 0                           /* Works, but is experimental.  -fnf */
3236               /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
3237                  know whether it will use the old style or v3 mangling.  */
3238               if (AUTO_DEMANGLING)
3239                 {
3240                   set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
3241                 }
3242 #endif
3243             }
3244           else
3245             n_opt_found = 1;
3246         }
3247       break;
3248
3249     case N_MAIN:                /* Name of main routine.  */
3250       /* FIXME: If one has a symbol file with N_MAIN and then replaces
3251          it with a symbol file with "main" and without N_MAIN.  I'm
3252          not sure exactly what rule to follow but probably something
3253          like: N_MAIN takes precedence over "main" no matter what
3254          objfile it is in; If there is more than one N_MAIN, choose
3255          the one in the symfile_objfile; If there is more than one
3256          N_MAIN within a given objfile, complain() and choose
3257          arbitrarily. (kingdon) */
3258       if (name != NULL)
3259         set_main_name (name);
3260       break;
3261
3262       /* The following symbol types can be ignored.  */
3263     case N_OBJ:         /* Solaris 2:  Object file dir and name */
3264       /*   N_UNDF:                   Solaris 2:  file separator mark */
3265       /*   N_UNDF: -- we will never encounter it, since we only process one
3266          file's symbols at once.  */
3267     case N_ENDM:                /* Solaris 2:  End of module */
3268     case N_ALIAS:               /* SunPro F77: alias name, ignore for now.  */
3269       break;
3270     }
3271
3272   /* '#' is a GNU C extension to allow one symbol to refer to another
3273      related symbol.
3274
3275      Generally this is used so that an alias can refer to its main
3276      symbol.  */
3277   if (name[0] == '#')
3278     {
3279       /* Initialize symbol reference names and determine if this is 
3280          a definition.  If symbol reference is being defined, go 
3281          ahead and add it.  Otherwise, just return sym. */
3282
3283       char *s = name;
3284       int refnum;
3285
3286       /* If this stab defines a new reference ID that is not on the
3287          reference list, then put it on the reference list.
3288
3289          We go ahead and advance NAME past the reference, even though
3290          it is not strictly necessary at this time.  */
3291       refnum = symbol_reference_defined (&s);
3292       if (refnum >= 0)
3293         if (!ref_search (refnum))
3294           ref_add (refnum, 0, name, valu);
3295       name = s;
3296     }
3297
3298
3299   previous_stab_code = type;
3300 }
3301 \f
3302 /* FIXME: The only difference between this and elfstab_build_psymtabs
3303    is the call to install_minimal_symbols for elf, and the support for
3304    split sections.  If the differences are really that small, the code
3305    should be shared.  */
3306
3307 /* Scan and build partial symbols for an coff symbol file.
3308    The coff file has already been processed to get its minimal symbols.
3309
3310    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
3311    rolled into one.
3312
3313    OBJFILE is the object file we are reading symbols from.
3314    ADDR is the address relative to which the symbols are (e.g.
3315    the base address of the text segment).
3316    MAINLINE is true if we are reading the main symbol
3317    table (as opposed to a shared lib or dynamically loaded file).
3318    TEXTADDR is the address of the text section.
3319    TEXTSIZE is the size of the text section.
3320    STABSECTS is the list of .stab sections in OBJFILE.
3321    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
3322    .stabstr section exists.
3323
3324    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
3325    adjusted for coff details. */
3326
3327 void
3328 coffstab_build_psymtabs (struct objfile *objfile, int mainline,
3329                          CORE_ADDR textaddr, unsigned int textsize,
3330                          struct stab_section_list *stabsects,
3331                          file_ptr stabstroffset, unsigned int stabstrsize)
3332 {
3333   int val;
3334   bfd *sym_bfd = objfile->obfd;
3335   char *name = bfd_get_filename (sym_bfd);
3336   struct dbx_symfile_info *info;
3337   unsigned int stabsize;
3338
3339   /* There is already a dbx_symfile_info allocated by our caller.
3340      It might even contain some info from the coff symtab to help us.  */
3341   info = objfile->sym_stab_info;
3342
3343   DBX_TEXT_ADDR (objfile) = textaddr;
3344   DBX_TEXT_SIZE (objfile) = textsize;
3345
3346 #define COFF_STABS_SYMBOL_SIZE  12      /* XXX FIXME XXX */
3347   DBX_SYMBOL_SIZE (objfile) = COFF_STABS_SYMBOL_SIZE;
3348   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
3349
3350   if (stabstrsize > bfd_get_size (sym_bfd))
3351     error ("ridiculous string table size: %d bytes", stabstrsize);
3352   DBX_STRINGTAB (objfile) = (char *)
3353     obstack_alloc (&objfile->psymbol_obstack, stabstrsize + 1);
3354   OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
3355
3356   /* Now read in the string table in one big gulp.  */
3357
3358   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
3359   if (val < 0)
3360     perror_with_name (name);
3361   val = bfd_bread (DBX_STRINGTAB (objfile), stabstrsize, sym_bfd);
3362   if (val != stabstrsize)
3363     perror_with_name (name);
3364
3365   stabsread_new_init ();
3366   buildsym_new_init ();
3367   free_header_files ();
3368   init_header_files ();
3369
3370   processing_acc_compilation = 1;
3371
3372   /* In a coff file, we've already installed the minimal symbols that came
3373      from the coff (non-stab) symbol table, so always act like an
3374      incremental load here. */
3375   if (stabsects->next == NULL)
3376     {
3377       stabsize = bfd_section_size (sym_bfd, stabsects->section);
3378       DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
3379       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
3380     }
3381   else
3382     {
3383       struct stab_section_list *stabsect;
3384
3385       DBX_SYMCOUNT (objfile) = 0;
3386       for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next)
3387         {
3388           stabsize = bfd_section_size (sym_bfd, stabsect->section);
3389           DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile);
3390         }
3391
3392       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
3393
3394       symbuf_sections = stabsects->next;
3395       symbuf_left = bfd_section_size (sym_bfd, stabsects->section);
3396       symbuf_read = 0;
3397     }
3398
3399   dbx_symfile_read (objfile, 0);
3400 }
3401 \f
3402 /* Scan and build partial symbols for an ELF symbol file.
3403    This ELF file has already been processed to get its minimal symbols,
3404    and any DWARF symbols that were in it.
3405
3406    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
3407    rolled into one.
3408
3409    OBJFILE is the object file we are reading symbols from.
3410    ADDR is the address relative to which the symbols are (e.g.
3411    the base address of the text segment).
3412    MAINLINE is true if we are reading the main symbol
3413    table (as opposed to a shared lib or dynamically loaded file).
3414    STABSECT is the BFD section information for the .stab section.
3415    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
3416    .stabstr section exists.
3417
3418    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
3419    adjusted for elf details. */
3420
3421 void
3422 elfstab_build_psymtabs (struct objfile *objfile, int mainline,
3423                         asection *stabsect,
3424                         file_ptr stabstroffset, unsigned int stabstrsize)
3425 {
3426   int val;
3427   bfd *sym_bfd = objfile->obfd;
3428   char *name = bfd_get_filename (sym_bfd);
3429   struct dbx_symfile_info *info;
3430   struct cleanup *back_to = NULL;
3431
3432   /* There is already a dbx_symfile_info allocated by our caller.
3433      It might even contain some info from the ELF symtab to help us.  */
3434   info = objfile->sym_stab_info;
3435
3436   /* Find the first and last text address.  dbx_symfile_read seems to
3437      want this.  */
3438   find_text_range (sym_bfd, objfile);
3439
3440 #define ELF_STABS_SYMBOL_SIZE   12      /* XXX FIXME XXX */
3441   DBX_SYMBOL_SIZE (objfile) = ELF_STABS_SYMBOL_SIZE;
3442   DBX_SYMCOUNT (objfile)
3443     = bfd_section_size (objfile->obfd, stabsect) / DBX_SYMBOL_SIZE (objfile);
3444   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
3445   DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos;
3446   DBX_STAB_SECTION (objfile) = stabsect;
3447
3448   if (stabstrsize > bfd_get_size (sym_bfd))
3449     error ("ridiculous string table size: %d bytes", stabstrsize);
3450   DBX_STRINGTAB (objfile) = (char *)
3451     obstack_alloc (&objfile->psymbol_obstack, stabstrsize + 1);
3452   OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
3453
3454   /* Now read in the string table in one big gulp.  */
3455
3456   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
3457   if (val < 0)
3458     perror_with_name (name);
3459   val = bfd_bread (DBX_STRINGTAB (objfile), stabstrsize, sym_bfd);
3460   if (val != stabstrsize)
3461     perror_with_name (name);
3462
3463   stabsread_new_init ();
3464   buildsym_new_init ();
3465   free_header_files ();
3466   init_header_files ();
3467
3468   processing_acc_compilation = 1;
3469
3470   symbuf_read = 0;
3471   symbuf_left = bfd_section_size (objfile->obfd, stabsect);
3472   stabs_data = symfile_relocate_debug_section (objfile->obfd, stabsect, NULL);
3473   if (stabs_data)
3474     back_to = make_cleanup (free_current_contents, (void *) &stabs_data);
3475
3476   /* In an elf file, we've already installed the minimal symbols that came
3477      from the elf (non-stab) symbol table, so always act like an
3478      incremental load here.  dbx_symfile_read should not generate any new
3479      minimal symbols, since we will have already read the ELF dynamic symbol
3480      table and normal symbol entries won't be in the ".stab" section; but in
3481      case it does, it will install them itself.  */
3482   dbx_symfile_read (objfile, 0);
3483
3484   if (back_to)
3485     do_cleanups (back_to);
3486 }
3487 \f
3488 /* Scan and build partial symbols for a file with special sections for stabs
3489    and stabstrings.  The file has already been processed to get its minimal
3490    symbols, and any other symbols that might be necessary to resolve GSYMs.
3491
3492    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
3493    rolled into one.
3494
3495    OBJFILE is the object file we are reading symbols from.
3496    ADDR is the address relative to which the symbols are (e.g. the base address
3497    of the text segment).
3498    MAINLINE is true if we are reading the main symbol table (as opposed to a
3499    shared lib or dynamically loaded file).
3500    STAB_NAME is the name of the section that contains the stabs.
3501    STABSTR_NAME is the name of the section that contains the stab strings.
3502
3503    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
3504
3505 void
3506 stabsect_build_psymtabs (struct objfile *objfile, int mainline, char *stab_name,
3507                          char *stabstr_name, char *text_name)
3508 {
3509   int val;
3510   bfd *sym_bfd = objfile->obfd;
3511   char *name = bfd_get_filename (sym_bfd);
3512   asection *stabsect;
3513   asection *stabstrsect;
3514   asection *text_sect;
3515
3516   stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
3517   stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
3518
3519   if (!stabsect)
3520     return;
3521
3522   if (!stabstrsect)
3523     error ("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)",
3524            stab_name, stabstr_name);
3525
3526   objfile->sym_stab_info = (struct dbx_symfile_info *)
3527     xmalloc (sizeof (struct dbx_symfile_info));
3528   memset (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
3529
3530   text_sect = bfd_get_section_by_name (sym_bfd, text_name);
3531   if (!text_sect)
3532     error ("Can't find %s section in symbol file", text_name);
3533   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
3534   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
3535
3536   DBX_SYMBOL_SIZE (objfile) = sizeof (struct external_nlist);
3537   DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
3538     / DBX_SYMBOL_SIZE (objfile);
3539   DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect);
3540   DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos;      /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
3541
3542   if (DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
3543     error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
3544   DBX_STRINGTAB (objfile) = (char *)
3545     obstack_alloc (&objfile->psymbol_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
3546   OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile) + 1);
3547
3548   /* Now read in the string table in one big gulp.  */
3549
3550   val = bfd_get_section_contents (sym_bfd,      /* bfd */
3551                                   stabstrsect,  /* bfd section */
3552                                   DBX_STRINGTAB (objfile),      /* input buffer */
3553                                   0,    /* offset into section */
3554                                   DBX_STRINGTAB_SIZE (objfile));        /* amount to read */
3555
3556   if (!val)
3557     perror_with_name (name);
3558
3559   stabsread_new_init ();
3560   buildsym_new_init ();
3561   free_header_files ();
3562   init_header_files ();
3563
3564   /* Now, do an incremental load */
3565
3566   processing_acc_compilation = 1;
3567   dbx_symfile_read (objfile, 0);
3568 }
3569 \f
3570 static struct sym_fns aout_sym_fns =
3571 {
3572   bfd_target_aout_flavour,
3573   dbx_new_init,                 /* sym_new_init: init anything gbl to entire symtab */
3574   dbx_symfile_init,             /* sym_init: read initial info, setup for sym_read() */
3575   dbx_symfile_read,             /* sym_read: read a symbol file into symtab */
3576   dbx_symfile_finish,           /* sym_finish: finished with file, cleanup */
3577   default_symfile_offsets,      /* sym_offsets: parse user's offsets to internal form */
3578   NULL                          /* next: pointer to next struct sym_fns */
3579 };
3580
3581 void
3582 _initialize_dbxread (void)
3583 {
3584   add_symtab_fns (&aout_sym_fns);
3585 }