Protoization.
[external/binutils.git] / gdb / dbxread.c
1 /* Read dbx symbol tables and convert to internal format, for GDB.
2    Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 1998
3    Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22 /* This module provides three functions: dbx_symfile_init,
23    which initializes to read a symbol file; dbx_new_init, which 
24    discards existing cached information when all symbols are being
25    discarded; and dbx_symfile_read, which reads a symbol table
26    from a file.
27
28    dbx_symfile_read only does the minimum work necessary for letting the
29    user "name" things symbolically; it does not read the entire symtab.
30    Instead, it reads the external and static symbols and puts them in partial
31    symbol tables.  When more extensive information is requested of a
32    file, the corresponding partial symbol table is mutated into a full
33    fledged symbol table by going back and reading the symbols
34    for real.  dbx_psymtab_to_symtab() is the function that does this */
35
36 #include "defs.h"
37 #include "gdb_string.h"
38
39 #if defined(USG) || defined(__CYGNUSCLIB__)
40 #include <sys/types.h>
41 #include <fcntl.h>
42 #endif
43
44 #include "obstack.h"
45 #include "gdb_stat.h"
46 #include <ctype.h>
47 #include "symtab.h"
48 #include "breakpoint.h"
49 #include "command.h"
50 #include "target.h"
51 #include "gdbcore.h"            /* for bfd stuff */
52 #include "libaout.h"            /* FIXME Secret internal BFD stuff for a.out */
53 #include "symfile.h"
54 #include "objfiles.h"
55 #include "buildsym.h"
56 #include "stabsread.h"
57 #include "gdb-stabs.h"
58 #include "demangle.h"
59 #include "language.h"           /* Needed inside partial-stab.h */
60 #include "complaints.h"
61
62 #include "aout/aout64.h"
63 #include "aout/stab_gnu.h"      /* We always use GNU stabs, not native, now */
64 \f
65
66 /* This macro returns the size field of a minimal symbol, which is normally
67    stored in the "info" field.  The macro can be overridden for specific
68    targets (e.g. MIPS16) that use the info field for other purposes.  */
69 #ifndef MSYMBOL_SIZE
70 #define MSYMBOL_SIZE(msym) ((long) MSYMBOL_INFO (msym))
71 #endif
72
73
74 /* We put a pointer to this structure in the read_symtab_private field
75    of the psymtab.  */
76
77 struct symloc
78   {
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 /* Nonzero means give verbose info on gdb action.  From main.c.  */
119
120 extern int info_verbose;
121
122 /* The BFD for this file -- implicit parameter to next_symbol_text.  */
123
124 static bfd *symfile_bfd;
125
126 /* The size of each symbol in the symbol file (in external form).
127    This is set by dbx_symfile_read when building psymtabs, and by
128    dbx_psymtab_to_symtab when building symtabs.  */
129
130 static unsigned symbol_size;
131
132 /* This is the offset of the symbol table in the executable file. */
133
134 static unsigned symbol_table_offset;
135
136 /* This is the offset of the string table in the executable file. */
137
138 static unsigned string_table_offset;
139
140 /* For elf+stab executables, the n_strx field is not a simple index
141    into the string table.  Instead, each .o file has a base offset in
142    the string table, and the associated symbols contain offsets from
143    this base.  The following two variables contain the base offset for
144    the current and next .o files. */
145
146 static unsigned int file_string_table_offset;
147 static unsigned int next_file_string_table_offset;
148
149 /* .o and NLM files contain unrelocated addresses which are based at
150    0.  When non-zero, this flag disables some of the special cases for
151    Solaris elf+stab text addresses at location 0. */
152
153 static int symfile_relocatable = 0;
154
155 /* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are
156    relative to the function start address.  */
157
158 static int block_address_function_relative = 0;
159 \f
160 /* The lowest text address we have yet encountered.  This is needed
161    because in an a.out file, there is no header field which tells us
162    what address the program is actually going to be loaded at, so we
163    need to make guesses based on the symbols (which *are* relocated to
164    reflect the address it will be loaded at).  */
165
166 static CORE_ADDR lowest_text_address;
167
168 /* Non-zero if there is any line number info in the objfile.  Prevents
169    end_psymtab from discarding an otherwise empty psymtab.  */
170
171 static int has_line_numbers;
172
173 /* Complaints about the symbols we have encountered.  */
174
175 struct complaint lbrac_complaint =
176 {"bad block start address patched", 0, 0};
177
178 struct complaint string_table_offset_complaint =
179 {"bad string table offset in symbol %d", 0, 0};
180
181 struct complaint unknown_symtype_complaint =
182 {"unknown symbol type %s", 0, 0};
183
184 struct complaint unknown_symchar_complaint =
185 {"unknown symbol descriptor `%c'", 0, 0};
186
187 struct complaint lbrac_rbrac_complaint =
188 {"block start larger than block end", 0, 0};
189
190 struct complaint lbrac_unmatched_complaint =
191 {"unmatched N_LBRAC before symtab pos %d", 0, 0};
192
193 struct complaint lbrac_mismatch_complaint =
194 {"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
195
196 struct complaint repeated_header_complaint =
197 {"\"repeated\" header file %s not previously seen, at symtab pos %d", 0, 0};
198
199 struct complaint unclaimed_bincl_complaint =
200 {"N_BINCL %s not in entries for any file, at symtab pos %d", 0, 0};
201 \f
202 /* find_text_range --- find start and end of loadable code sections
203
204    The find_text_range function finds the shortest address range that
205    encloses all sections containing executable code, and stores it in
206    objfile's text_addr and text_size members.
207
208    dbx_symfile_read will use this to finish off the partial symbol
209    table, in some cases.  */
210
211 static void
212 find_text_range (bfd * sym_bfd, struct objfile *objfile)
213 {
214   asection *sec;
215   int found_any = 0;
216   CORE_ADDR start, end;
217
218   for (sec = sym_bfd->sections; sec; sec = sec->next)
219     if (bfd_get_section_flags (sym_bfd, sec) & SEC_CODE)
220       {
221         CORE_ADDR sec_start = bfd_section_vma (sym_bfd, sec);
222         CORE_ADDR sec_end = sec_start + bfd_section_size (sym_bfd, sec);
223
224         if (found_any)
225           {
226             if (sec_start < start)
227               start = sec_start;
228             if (sec_end > end)
229               end = sec_end;
230           }
231         else
232           {
233             start = sec_start;
234             end = sec_end;
235           }
236
237         found_any = 1;
238       }
239
240   if (!found_any)
241     error ("Can't find any code sections in symbol file");
242
243   DBX_TEXT_ADDR (objfile) = start;
244   DBX_TEXT_SIZE (objfile) = end - start;
245 }
246 \f
247
248
249 /* During initial symbol readin, we need to have a structure to keep
250    track of which psymtabs have which bincls in them.  This structure
251    is used during readin to setup the list of dependencies within each
252    partial symbol table. */
253
254 struct header_file_location
255 {
256   char *name;                   /* Name of header file */
257   int instance;                 /* See above */
258   struct partial_symtab *pst;   /* Partial symtab that has the
259                                    BINCL/EINCL defs for this file */
260 };
261
262 /* The actual list and controling variables */
263 static struct header_file_location *bincl_list, *next_bincl;
264 static int bincls_allocated;
265
266 /* Local function prototypes */
267
268 extern void _initialize_dbxread (void);
269
270 static void process_now (struct objfile *);
271
272 static void free_header_files (void);
273
274 static void init_header_files (void);
275
276 static void read_ofile_symtab (struct partial_symtab *);
277
278 static void dbx_psymtab_to_symtab (struct partial_symtab *);
279
280 static void dbx_psymtab_to_symtab_1 (struct partial_symtab *);
281
282 static void read_dbx_dynamic_symtab (struct objfile *objfile);
283
284 static void read_dbx_symtab (struct objfile *);
285
286 static void free_bincl_list (struct objfile *);
287
288 static struct partial_symtab *find_corresponding_bincl_psymtab (char *, int);
289
290 static void add_bincl_to_list (struct partial_symtab *, char *, int);
291
292 static void init_bincl_list (int, struct objfile *);
293
294 static char *dbx_next_symbol_text (struct objfile *);
295
296 static void fill_symbuf (bfd *);
297
298 static void dbx_symfile_init (struct objfile *);
299
300 static void dbx_new_init (struct objfile *);
301
302 static void dbx_symfile_read (struct objfile *, int);
303
304 static void dbx_symfile_finish (struct objfile *);
305
306 static void record_minimal_symbol (char *, CORE_ADDR, int, struct objfile *);
307
308 static void add_new_header_file (char *, int);
309
310 static void add_old_header_file (char *, int);
311
312 static void add_this_object_header_file (int);
313
314 static struct partial_symtab *start_psymtab (struct objfile *, char *,
315                                              CORE_ADDR, int,
316                                              struct partial_symbol **,
317                                              struct partial_symbol **);
318
319 /* Free up old header file tables */
320
321 static void
322 free_header_files (void)
323 {
324   if (this_object_header_files)
325     {
326       free ((PTR) this_object_header_files);
327       this_object_header_files = NULL;
328     }
329   n_allocated_this_object_header_files = 0;
330 }
331
332 /* Allocate new header file tables */
333
334 static void
335 init_header_files (void)
336 {
337   n_allocated_this_object_header_files = 10;
338   this_object_header_files = (int *) xmalloc (10 * sizeof (int));
339 }
340
341 /* Add header file number I for this object file
342    at the next successive FILENUM.  */
343
344 static void
345 add_this_object_header_file (int i)
346 {
347   if (n_this_object_header_files == n_allocated_this_object_header_files)
348     {
349       n_allocated_this_object_header_files *= 2;
350       this_object_header_files
351         = (int *) xrealloc ((char *) this_object_header_files,
352                        n_allocated_this_object_header_files * sizeof (int));
353     }
354
355   this_object_header_files[n_this_object_header_files++] = i;
356 }
357
358 /* Add to this file an "old" header file, one already seen in
359    a previous object file.  NAME is the header file's name.
360    INSTANCE is its instance code, to select among multiple
361    symbol tables for the same header file.  */
362
363 static void
364 add_old_header_file (char *name, int instance)
365 {
366   register struct header_file *p = HEADER_FILES (current_objfile);
367   register int i;
368
369   for (i = 0; i < N_HEADER_FILES (current_objfile); i++)
370     if (STREQ (p[i].name, name) && instance == p[i].instance)
371       {
372         add_this_object_header_file (i);
373         return;
374       }
375   complain (&repeated_header_complaint, name, symnum);
376 }
377
378 /* Add to this file a "new" header file: definitions for its types follow.
379    NAME is the header file's name.
380    Most often this happens only once for each distinct header file,
381    but not necessarily.  If it happens more than once, INSTANCE has
382    a different value each time, and references to the header file
383    use INSTANCE values to select among them.
384
385    dbx output contains "begin" and "end" markers for each new header file,
386    but at this level we just need to know which files there have been;
387    so we record the file when its "begin" is seen and ignore the "end".  */
388
389 static void
390 add_new_header_file (char *name, int instance)
391 {
392   register int i;
393   register struct header_file *hfile;
394
395   /* Make sure there is room for one more header file.  */
396
397   i = N_ALLOCATED_HEADER_FILES (current_objfile);
398
399   if (N_HEADER_FILES (current_objfile) == i)
400     {
401       if (i == 0)
402         {
403           N_ALLOCATED_HEADER_FILES (current_objfile) = 10;
404           HEADER_FILES (current_objfile) = (struct header_file *)
405             xmalloc (10 * sizeof (struct header_file));
406         }
407       else
408         {
409           i *= 2;
410           N_ALLOCATED_HEADER_FILES (current_objfile) = i;
411           HEADER_FILES (current_objfile) = (struct header_file *)
412             xrealloc ((char *) HEADER_FILES (current_objfile),
413                       (i * sizeof (struct header_file)));
414         }
415     }
416
417   /* Create an entry for this header file.  */
418
419   i = N_HEADER_FILES (current_objfile)++;
420   hfile = HEADER_FILES (current_objfile) + i;
421   hfile->name = savestring (name, strlen (name));
422   hfile->instance = instance;
423   hfile->length = 10;
424   hfile->vector
425     = (struct type **) xmalloc (10 * sizeof (struct type *));
426   memset (hfile->vector, 0, 10 * sizeof (struct type *));
427
428   add_this_object_header_file (i);
429 }
430
431 #if 0
432 static struct type **
433 explicit_lookup_type (int real_filenum, int index)
434 {
435   register struct header_file *f = &HEADER_FILES (current_objfile)[real_filenum];
436
437   if (index >= f->length)
438     {
439       f->length *= 2;
440       f->vector = (struct type **)
441         xrealloc (f->vector, f->length * sizeof (struct type *));
442       memset (&f->vector[f->length / 2],
443               '\0', f->length * sizeof (struct type *) / 2);
444     }
445   return &f->vector[index];
446 }
447 #endif
448 \f
449 static void
450 record_minimal_symbol (char *name, CORE_ADDR address, int type,
451                        struct objfile *objfile)
452 {
453   enum minimal_symbol_type ms_type;
454   int section;
455   asection *bfd_section;
456
457   switch (type)
458     {
459     case N_TEXT | N_EXT:
460       ms_type = mst_text;
461       section = SECT_OFF_TEXT (objfile);
462       bfd_section = DBX_TEXT_SECTION (objfile);
463       break;
464     case N_DATA | N_EXT:
465       ms_type = mst_data;
466       section = SECT_OFF_DATA (objfile);
467       bfd_section = DBX_DATA_SECTION (objfile);
468       break;
469     case N_BSS | N_EXT:
470       ms_type = mst_bss;
471       section = SECT_OFF_BSS (objfile);
472       bfd_section = DBX_BSS_SECTION (objfile);
473       break;
474     case N_ABS | N_EXT:
475       ms_type = mst_abs;
476       section = -1;
477       bfd_section = NULL;
478       break;
479 #ifdef N_SETV
480     case N_SETV | N_EXT:
481       ms_type = mst_data;
482       section = SECT_OFF_DATA (objfile);
483       bfd_section = DBX_DATA_SECTION (objfile);
484       break;
485     case N_SETV:
486       /* I don't think this type actually exists; since a N_SETV is the result
487          of going over many .o files, it doesn't make sense to have one
488          file local.  */
489       ms_type = mst_file_data;
490       section = SECT_OFF_DATA (objfile);
491       bfd_section = DBX_DATA_SECTION (objfile);
492       break;
493 #endif
494     case N_TEXT:
495     case N_NBTEXT:
496     case N_FN:
497     case N_FN_SEQ:
498       ms_type = mst_file_text;
499       section = SECT_OFF_TEXT (objfile);
500       bfd_section = DBX_TEXT_SECTION (objfile);
501       break;
502     case N_DATA:
503       ms_type = mst_file_data;
504
505       /* Check for __DYNAMIC, which is used by Sun shared libraries. 
506          Record it as global even if it's local, not global, so
507          lookup_minimal_symbol can find it.  We don't check symbol_leading_char
508          because for SunOS4 it always is '_'.  */
509       if (name[8] == 'C' && STREQ ("__DYNAMIC", name))
510         ms_type = mst_data;
511
512       /* Same with virtual function tables, both global and static.  */
513       {
514         char *tempstring = name;
515         if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
516           ++tempstring;
517         if (VTBL_PREFIX_P ((tempstring)))
518           ms_type = mst_data;
519       }
520       section = SECT_OFF_DATA (objfile);
521       bfd_section = DBX_DATA_SECTION (objfile);
522       break;
523     case N_BSS:
524       ms_type = mst_file_bss;
525       section = SECT_OFF_BSS (objfile);
526       bfd_section = DBX_BSS_SECTION (objfile);
527       break;
528     default:
529       ms_type = mst_unknown;
530       section = -1;
531       bfd_section = NULL;
532       break;
533     }
534
535   if ((ms_type == mst_file_text || ms_type == mst_text)
536       && address < lowest_text_address)
537     lowest_text_address = address;
538
539   prim_record_minimal_symbol_and_info
540     (name, address, ms_type, NULL, section, bfd_section, objfile);
541 }
542 \f
543 /* Scan and build partial symbols for a symbol file.
544    We have been initialized by a call to dbx_symfile_init, which 
545    put all the relevant info into a "struct dbx_symfile_info",
546    hung off the objfile structure.
547
548    MAINLINE is true if we are reading the main symbol
549    table (as opposed to a shared lib or dynamically loaded file).  */
550
551 static void
552 dbx_symfile_read (objfile, mainline)
553      struct objfile *objfile;
554      int mainline;              /* FIXME comments above */
555 {
556   bfd *sym_bfd;
557   int val;
558   struct cleanup *back_to;
559
560   sym_bfd = objfile->obfd;
561
562   /* .o and .nlm files are relocatables with text, data and bss segs based at
563      0.  This flag disables special (Solaris stabs-in-elf only) fixups for
564      symbols with a value of 0.  */
565
566   symfile_relocatable = bfd_get_file_flags (sym_bfd) & HAS_RELOC;
567
568   /* This is true for Solaris (and all other systems which put stabs
569      in sections, hopefully, since it would be silly to do things
570      differently from Solaris), and false for SunOS4 and other a.out
571      file formats.  */
572   block_address_function_relative =
573     ((0 == strncmp (bfd_get_target (sym_bfd), "elf", 3))
574      || (0 == strncmp (bfd_get_target (sym_bfd), "som", 3))
575      || (0 == strncmp (bfd_get_target (sym_bfd), "coff", 4))
576      || (0 == strncmp (bfd_get_target (sym_bfd), "pe", 2))
577      || (0 == strncmp (bfd_get_target (sym_bfd), "epoc-pe", 7))
578      || (0 == strncmp (bfd_get_target (sym_bfd), "nlm", 3)));
579
580   val = bfd_seek (sym_bfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
581   if (val < 0)
582     perror_with_name (objfile->name);
583
584   /* If we are reinitializing, or if we have never loaded syms yet, init */
585   if (mainline
586       || objfile->global_psymbols.size == 0
587       || objfile->static_psymbols.size == 0)
588     init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
589
590   symbol_size = DBX_SYMBOL_SIZE (objfile);
591   symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
592
593   free_pending_blocks ();
594   back_to = make_cleanup (really_free_pendings, 0);
595
596   init_minimal_symbol_collection ();
597   make_cleanup_discard_minimal_symbols ();
598
599   /* Read stabs data from executable file and define symbols. */
600
601   read_dbx_symtab (objfile);
602
603   /* Add the dynamic symbols.  */
604
605   read_dbx_dynamic_symtab (objfile);
606
607   /* Install any minimal symbols that have been collected as the current
608      minimal symbols for this objfile. */
609
610   install_minimal_symbols (objfile);
611
612   do_cleanups (back_to);
613 }
614
615 /* Initialize anything that needs initializing when a completely new
616    symbol file is specified (not just adding some symbols from another
617    file, e.g. a shared library).  */
618
619 static void
620 dbx_new_init (struct objfile *ignore)
621 {
622   stabsread_new_init ();
623   buildsym_new_init ();
624   init_header_files ();
625 }
626
627
628 /* dbx_symfile_init ()
629    is the dbx-specific initialization routine for reading symbols.
630    It is passed a struct objfile which contains, among other things,
631    the BFD for the file whose symbols are being read, and a slot for a pointer
632    to "private data" which we fill with goodies.
633
634    We read the string table into malloc'd space and stash a pointer to it.
635
636    Since BFD doesn't know how to read debug symbols in a format-independent
637    way (and may never do so...), we have to do it ourselves.  We will never
638    be called unless this is an a.out (or very similar) file. 
639    FIXME, there should be a cleaner peephole into the BFD environment here.  */
640
641 #define DBX_STRINGTAB_SIZE_SIZE sizeof(long)    /* FIXME */
642
643 static void
644 dbx_symfile_init (struct objfile *objfile)
645 {
646   int val;
647   bfd *sym_bfd = objfile->obfd;
648   char *name = bfd_get_filename (sym_bfd);
649   asection *text_sect;
650   unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
651
652   /* Allocate struct to keep track of the symfile */
653   objfile->sym_stab_info = (struct dbx_symfile_info *)
654     xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
655   memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
656
657   DBX_TEXT_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
658   DBX_DATA_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".data");
659   DBX_BSS_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".bss");
660
661   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
662 #define STRING_TABLE_OFFSET     (sym_bfd->origin + obj_str_filepos (sym_bfd))
663 #define SYMBOL_TABLE_OFFSET     (sym_bfd->origin + obj_sym_filepos (sym_bfd))
664
665   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
666
667   DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
668
669   text_sect = bfd_get_section_by_name (sym_bfd, ".text");
670   if (!text_sect)
671     error ("Can't find .text section in symbol file");
672   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
673   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
674
675   DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
676   DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
677   DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
678
679   /* Read the string table and stash it away in the psymbol_obstack.  It is
680      only needed as long as we need to expand psymbols into full symbols,
681      so when we blow away the psymbol the string table goes away as well.
682      Note that gdb used to use the results of attempting to malloc the
683      string table, based on the size it read, as a form of sanity check
684      for botched byte swapping, on the theory that a byte swapped string
685      table size would be so totally bogus that the malloc would fail.  Now
686      that we put in on the psymbol_obstack, we can't do this since gdb gets
687      a fatal error (out of virtual memory) if the size is bogus.  We can
688      however at least check to see if the size is less than the size of
689      the size field itself, or larger than the size of the entire file.
690      Note that all valid string tables have a size greater than zero, since
691      the bytes used to hold the size are included in the count. */
692
693   if (STRING_TABLE_OFFSET == 0)
694     {
695       /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
696          will never be zero, even when there is no string table.  This
697          would appear to be a bug in bfd. */
698       DBX_STRINGTAB_SIZE (objfile) = 0;
699       DBX_STRINGTAB (objfile) = NULL;
700     }
701   else
702     {
703       val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
704       if (val < 0)
705         perror_with_name (name);
706
707       memset ((PTR) size_temp, 0, sizeof (size_temp));
708       val = bfd_read ((PTR) size_temp, sizeof (size_temp), 1, sym_bfd);
709       if (val < 0)
710         {
711           perror_with_name (name);
712         }
713       else if (val == 0)
714         {
715           /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
716              EOF if there is no string table, and attempting to read the size
717              from EOF will read zero bytes. */
718           DBX_STRINGTAB_SIZE (objfile) = 0;
719           DBX_STRINGTAB (objfile) = NULL;
720         }
721       else
722         {
723           /* Read some data that would appear to be the string table size.
724              If there really is a string table, then it is probably the right
725              size.  Byteswap if necessary and validate the size.  Note that
726              the minimum is DBX_STRINGTAB_SIZE_SIZE.  If we just read some
727              random data that happened to be at STRING_TABLE_OFFSET, because
728              bfd can't tell us there is no string table, the sanity checks may
729              or may not catch this. */
730           DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
731
732           if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
733               || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
734             error ("ridiculous string table size (%d bytes).",
735                    DBX_STRINGTAB_SIZE (objfile));
736
737           DBX_STRINGTAB (objfile) =
738             (char *) obstack_alloc (&objfile->psymbol_obstack,
739                                     DBX_STRINGTAB_SIZE (objfile));
740           OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile));
741
742           /* Now read in the string table in one big gulp.  */
743
744           val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
745           if (val < 0)
746             perror_with_name (name);
747           val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
748                           sym_bfd);
749           if (val != DBX_STRINGTAB_SIZE (objfile))
750             perror_with_name (name);
751         }
752     }
753 }
754
755 /* Perform any local cleanups required when we are done with a particular
756    objfile.  I.E, we are in the process of discarding all symbol information
757    for an objfile, freeing up all memory held for it, and unlinking the
758    objfile struct from the global list of known objfiles. */
759
760 static void
761 dbx_symfile_finish (struct objfile *objfile)
762 {
763   if (objfile->sym_stab_info != NULL)
764     {
765       if (HEADER_FILES (objfile) != NULL)
766         {
767           register int i = N_HEADER_FILES (objfile);
768           register struct header_file *hfiles = HEADER_FILES (objfile);
769
770           while (--i >= 0)
771             {
772               free (hfiles[i].name);
773               free (hfiles[i].vector);
774             }
775           free ((PTR) hfiles);
776         }
777       mfree (objfile->md, objfile->sym_stab_info);
778     }
779   free_header_files ();
780 }
781 \f
782
783 /* Buffer for reading the symbol table entries.  */
784 static struct external_nlist symbuf[4096];
785 static int symbuf_idx;
786 static int symbuf_end;
787
788 /* cont_elem is used for continuing information in cfront.
789    It saves information about which types need to be fixed up and 
790    completed after all the stabs are read.  */
791 struct cont_elem
792   {
793     /* sym and stabsstring for continuing information in cfront */
794     struct symbol *sym;
795     char *stabs;
796     /* state dependancies (statics that must be preserved) */
797     int sym_idx;
798     int sym_end;
799     int symnum;
800     int (*func) (struct objfile *, struct symbol *, char *);
801     /* other state dependancies include:
802        (assumption is that these will not change since process_now FIXME!!)
803        stringtab_global
804        n_stabs
805        objfile
806        symfile_bfd */
807   };
808
809 static struct cont_elem *cont_list = 0;
810 static int cont_limit = 0;
811 static int cont_count = 0;
812
813 /* Arrange for function F to be called with arguments SYM and P later
814    in the stabs reading process.  */
815 void
816 process_later (sym, p, f)
817      struct symbol *sym;
818      char *p;
819      int (*f) (struct objfile *, struct symbol *, char *);
820 {
821
822   /* Allocate more space for the deferred list.  */
823   if (cont_count >= cont_limit - 1)
824     {
825       cont_limit += 32;         /* chunk size */
826
827       cont_list
828         = (struct cont_elem *) xrealloc (cont_list,
829                                          (cont_limit
830                                           * sizeof (struct cont_elem)));
831       if (!cont_list)
832         error ("Virtual memory exhausted\n");
833     }
834
835   /* Save state variables so we can process these stabs later.  */
836   cont_list[cont_count].sym_idx = symbuf_idx;
837   cont_list[cont_count].sym_end = symbuf_end;
838   cont_list[cont_count].symnum = symnum;
839   cont_list[cont_count].sym = sym;
840   cont_list[cont_count].stabs = p;
841   cont_list[cont_count].func = f;
842   cont_count++;
843 }
844
845 /* Call deferred funtions in CONT_LIST.  */
846
847 static void
848 process_now (struct objfile *objfile)
849 {
850   int i;
851   int save_symbuf_idx;
852   int save_symbuf_end;
853   int save_symnum;
854   struct symbol *sym;
855   char *stabs;
856   int err;
857   int (*func) (struct objfile *, struct symbol *, char *);
858
859   /* Save the state of our caller, we'll want to restore it before
860      returning.  */
861   save_symbuf_idx = symbuf_idx;
862   save_symbuf_end = symbuf_end;
863   save_symnum = symnum;
864
865   /* Iterate over all the deferred stabs.  */
866   for (i = 0; i < cont_count; i++)
867     {
868       /* Restore the state for this deferred stab.  */
869       symbuf_idx = cont_list[i].sym_idx;
870       symbuf_end = cont_list[i].sym_end;
871       symnum = cont_list[i].symnum;
872       sym = cont_list[i].sym;
873       stabs = cont_list[i].stabs;
874       func = cont_list[i].func;
875
876       /* Call the function to handle this deferrd stab.  */
877       err = (*func) (objfile, sym, stabs);
878       if (err)
879         error ("Internal error: unable to resolve stab.\n");
880     }
881
882   /* Restore our caller's state.  */
883   symbuf_idx = save_symbuf_idx;
884   symbuf_end = save_symbuf_end;
885   symnum = save_symnum;
886   cont_count = 0;
887 }
888
889
890 /* Name of last function encountered.  Used in Solaris to approximate
891    object file boundaries.  */
892 static char *last_function_name;
893
894 /* The address in memory of the string table of the object file we are
895    reading (which might not be the "main" object file, but might be a
896    shared library or some other dynamically loaded thing).  This is
897    set by read_dbx_symtab when building psymtabs, and by
898    read_ofile_symtab when building symtabs, and is used only by
899    next_symbol_text.  FIXME: If that is true, we don't need it when
900    building psymtabs, right?  */
901 static char *stringtab_global;
902
903 /* These variables are used to control fill_symbuf when the stabs
904    symbols are not contiguous (as may be the case when a COFF file is
905    linked using --split-by-reloc).  */
906 static struct stab_section_list *symbuf_sections;
907 static unsigned int symbuf_left;
908 static unsigned int symbuf_read;
909
910 /* Refill the symbol table input buffer
911    and set the variables that control fetching entries from it.
912    Reports an error if no data available.
913    This function can read past the end of the symbol table
914    (into the string table) but this does no harm.  */
915
916 static void
917 fill_symbuf (bfd *sym_bfd)
918 {
919   unsigned int count;
920   int nbytes;
921
922   if (symbuf_sections == NULL)
923     count = sizeof (symbuf);
924   else
925     {
926       if (symbuf_left <= 0)
927         {
928           file_ptr filepos = symbuf_sections->section->filepos;
929           if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0)
930             perror_with_name (bfd_get_filename (sym_bfd));
931           symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section);
932           symbol_table_offset = filepos - symbuf_read;
933           symbuf_sections = symbuf_sections->next;
934         }
935
936       count = symbuf_left;
937       if (count > sizeof (symbuf))
938         count = sizeof (symbuf);
939     }
940
941   nbytes = bfd_read ((PTR) symbuf, count, 1, sym_bfd);
942   if (nbytes < 0)
943     perror_with_name (bfd_get_filename (sym_bfd));
944   else if (nbytes == 0)
945     error ("Premature end of file reading symbol table");
946   symbuf_end = nbytes / symbol_size;
947   symbuf_idx = 0;
948   symbuf_left -= nbytes;
949   symbuf_read += nbytes;
950 }
951
952 #define SWAP_SYMBOL(symp, abfd) \
953   { \
954     (symp)->n_strx = bfd_h_get_32(abfd,                 \
955                                 (unsigned char *)&(symp)->n_strx);      \
956     (symp)->n_desc = bfd_h_get_16 (abfd,                        \
957                                 (unsigned char *)&(symp)->n_desc);      \
958     (symp)->n_value = bfd_h_get_32 (abfd,                       \
959                                 (unsigned char *)&(symp)->n_value);     \
960   }
961
962 #define INTERNALIZE_SYMBOL(intern, extern, abfd)                        \
963   {                                                                     \
964     (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);             \
965     (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);            \
966     (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);            \
967     (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);          \
968   }
969
970 /* Invariant: The symbol pointed to by symbuf_idx is the first one
971    that hasn't been swapped.  Swap the symbol at the same time
972    that symbuf_idx is incremented.  */
973
974 /* dbx allows the text of a symbol name to be continued into the
975    next symbol name!  When such a continuation is encountered
976    (a \ at the end of the text of a name)
977    call this function to get the continuation.  */
978
979 static char *
980 dbx_next_symbol_text (struct objfile *objfile)
981 {
982   struct internal_nlist nlist;
983
984   if (symbuf_idx == symbuf_end)
985     fill_symbuf (symfile_bfd);
986
987   symnum++;
988   INTERNALIZE_SYMBOL (nlist, &symbuf[symbuf_idx], symfile_bfd);
989   OBJSTAT (objfile, n_stabs++);
990
991   symbuf_idx++;
992
993   return nlist.n_strx + stringtab_global + file_string_table_offset;
994 }
995 \f
996 /* Initialize the list of bincls to contain none and have some
997    allocated.  */
998
999 static void
1000 init_bincl_list (int number, struct objfile *objfile)
1001 {
1002   bincls_allocated = number;
1003   next_bincl = bincl_list = (struct header_file_location *)
1004     xmmalloc (objfile->md, bincls_allocated * sizeof (struct header_file_location));
1005 }
1006
1007 /* Add a bincl to the list.  */
1008
1009 static void
1010 add_bincl_to_list (struct partial_symtab *pst, char *name, int instance)
1011 {
1012   if (next_bincl >= bincl_list + bincls_allocated)
1013     {
1014       int offset = next_bincl - bincl_list;
1015       bincls_allocated *= 2;
1016       bincl_list = (struct header_file_location *)
1017         xmrealloc (pst->objfile->md, (char *) bincl_list,
1018                    bincls_allocated * sizeof (struct header_file_location));
1019       next_bincl = bincl_list + offset;
1020     }
1021   next_bincl->pst = pst;
1022   next_bincl->instance = instance;
1023   next_bincl++->name = name;
1024 }
1025
1026 /* Given a name, value pair, find the corresponding
1027    bincl in the list.  Return the partial symtab associated
1028    with that header_file_location.  */
1029
1030 static struct partial_symtab *
1031 find_corresponding_bincl_psymtab (char *name, int instance)
1032 {
1033   struct header_file_location *bincl;
1034
1035   for (bincl = bincl_list; bincl < next_bincl; bincl++)
1036     if (bincl->instance == instance
1037         && STREQ (name, bincl->name))
1038       return bincl->pst;
1039
1040   complain (&repeated_header_complaint, name, symnum);
1041   return (struct partial_symtab *) 0;
1042 }
1043
1044 /* Free the storage allocated for the bincl list.  */
1045
1046 static void
1047 free_bincl_list (struct objfile *objfile)
1048 {
1049   mfree (objfile->md, (PTR) bincl_list);
1050   bincls_allocated = 0;
1051 }
1052
1053 static void
1054 do_free_bincl_list_cleanup (void *objfile)
1055 {
1056   free_bincl_list (objfile);
1057 }
1058
1059 static struct cleanup *
1060 make_cleanup_free_bincl_list (struct objfile *objfile)
1061 {
1062   return make_cleanup (do_free_bincl_list_cleanup, objfile);
1063 }
1064
1065 /* Scan a SunOs dynamic symbol table for symbols of interest and
1066    add them to the minimal symbol table.  */
1067
1068 static void
1069 read_dbx_dynamic_symtab (struct objfile *objfile)
1070 {
1071   bfd *abfd = objfile->obfd;
1072   struct cleanup *back_to;
1073   int counter;
1074   long dynsym_size;
1075   long dynsym_count;
1076   asymbol **dynsyms;
1077   asymbol **symptr;
1078   arelent **relptr;
1079   long dynrel_size;
1080   long dynrel_count;
1081   arelent **dynrels;
1082   CORE_ADDR sym_value;
1083   char *name;
1084
1085   /* Check that the symbol file has dynamic symbols that we know about.
1086      bfd_arch_unknown can happen if we are reading a sun3 symbol file
1087      on a sun4 host (and vice versa) and bfd is not configured
1088      --with-target=all.  This would trigger an assertion in bfd/sunos.c,
1089      so we ignore the dynamic symbols in this case.  */
1090   if (bfd_get_flavour (abfd) != bfd_target_aout_flavour
1091       || (bfd_get_file_flags (abfd) & DYNAMIC) == 0
1092       || bfd_get_arch (abfd) == bfd_arch_unknown)
1093     return;
1094
1095   dynsym_size = bfd_get_dynamic_symtab_upper_bound (abfd);
1096   if (dynsym_size < 0)
1097     return;
1098
1099   dynsyms = (asymbol **) xmalloc (dynsym_size);
1100   back_to = make_cleanup (free, dynsyms);
1101
1102   dynsym_count = bfd_canonicalize_dynamic_symtab (abfd, dynsyms);
1103   if (dynsym_count < 0)
1104     {
1105       do_cleanups (back_to);
1106       return;
1107     }
1108
1109   /* Enter dynamic symbols into the minimal symbol table
1110      if this is a stripped executable.  */
1111   if (bfd_get_symcount (abfd) <= 0)
1112     {
1113       symptr = dynsyms;
1114       for (counter = 0; counter < dynsym_count; counter++, symptr++)
1115         {
1116           asymbol *sym = *symptr;
1117           asection *sec;
1118           int type;
1119
1120           sec = bfd_get_section (sym);
1121
1122           /* BFD symbols are section relative.  */
1123           sym_value = sym->value + sec->vma;
1124
1125           if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
1126             {
1127               sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1128               type = N_TEXT;
1129             }
1130           else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
1131             {
1132               sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1133               type = N_DATA;
1134             }
1135           else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
1136             {
1137               sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
1138               type = N_BSS;
1139             }
1140           else
1141             continue;
1142
1143           if (sym->flags & BSF_GLOBAL)
1144             type |= N_EXT;
1145
1146           record_minimal_symbol ((char *) bfd_asymbol_name (sym), sym_value,
1147                                  type, objfile);
1148         }
1149     }
1150
1151   /* Symbols from shared libraries have a dynamic relocation entry
1152      that points to the associated slot in the procedure linkage table.
1153      We make a mininal symbol table entry with type mst_solib_trampoline
1154      at the address in the procedure linkage table.  */
1155   dynrel_size = bfd_get_dynamic_reloc_upper_bound (abfd);
1156   if (dynrel_size < 0)
1157     {
1158       do_cleanups (back_to);
1159       return;
1160     }
1161
1162   dynrels = (arelent **) xmalloc (dynrel_size);
1163   make_cleanup (free, dynrels);
1164
1165   dynrel_count = bfd_canonicalize_dynamic_reloc (abfd, dynrels, dynsyms);
1166   if (dynrel_count < 0)
1167     {
1168       do_cleanups (back_to);
1169       return;
1170     }
1171
1172   for (counter = 0, relptr = dynrels;
1173        counter < dynrel_count;
1174        counter++, relptr++)
1175     {
1176       arelent *rel = *relptr;
1177       CORE_ADDR address =
1178       rel->address + ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1179
1180       switch (bfd_get_arch (abfd))
1181         {
1182         case bfd_arch_sparc:
1183           if (rel->howto->type != RELOC_JMP_SLOT)
1184             continue;
1185           break;
1186         case bfd_arch_m68k:
1187           /* `16' is the type BFD produces for a jump table relocation.  */
1188           if (rel->howto->type != 16)
1189             continue;
1190
1191           /* Adjust address in the jump table to point to
1192              the start of the bsr instruction.  */
1193           address -= 2;
1194           break;
1195         default:
1196           continue;
1197         }
1198
1199       name = (char *) bfd_asymbol_name (*rel->sym_ptr_ptr);
1200       prim_record_minimal_symbol (name, address, mst_solib_trampoline,
1201                                   objfile);
1202     }
1203
1204   do_cleanups (back_to);
1205 }
1206
1207 /* Setup partial_symtab's describing each source file for which
1208    debugging information is available. */
1209
1210 static void
1211 read_dbx_symtab (struct objfile *objfile)
1212 {
1213   register struct external_nlist *bufp = 0;     /* =0 avoids gcc -Wall glitch */
1214   struct internal_nlist nlist;
1215   CORE_ADDR text_addr;
1216   int text_size;
1217
1218   register char *namestring;
1219   int nsl;
1220   int past_first_source_file = 0;
1221   CORE_ADDR last_o_file_start = 0;
1222   CORE_ADDR last_function_start = 0;
1223   struct cleanup *back_to;
1224   bfd *abfd;
1225   int textlow_not_set;
1226
1227   /* Current partial symtab */
1228   struct partial_symtab *pst;
1229
1230   /* List of current psymtab's include files */
1231   char **psymtab_include_list;
1232   int includes_allocated;
1233   int includes_used;
1234
1235   /* Index within current psymtab dependency list */
1236   struct partial_symtab **dependency_list;
1237   int dependencies_used, dependencies_allocated;
1238
1239   text_addr = DBX_TEXT_ADDR (objfile);
1240   text_size = DBX_TEXT_SIZE (objfile);
1241
1242   /* FIXME.  We probably want to change stringtab_global rather than add this
1243      while processing every symbol entry.  FIXME.  */
1244   file_string_table_offset = 0;
1245   next_file_string_table_offset = 0;
1246
1247   stringtab_global = DBX_STRINGTAB (objfile);
1248
1249   pst = (struct partial_symtab *) 0;
1250
1251   includes_allocated = 30;
1252   includes_used = 0;
1253   psymtab_include_list = (char **) alloca (includes_allocated *
1254                                            sizeof (char *));
1255
1256   dependencies_allocated = 30;
1257   dependencies_used = 0;
1258   dependency_list =
1259     (struct partial_symtab **) alloca (dependencies_allocated *
1260                                        sizeof (struct partial_symtab *));
1261
1262   /* Init bincl list */
1263   init_bincl_list (20, objfile);
1264   back_to = make_cleanup_free_bincl_list (objfile);
1265
1266   last_source_file = NULL;
1267
1268   lowest_text_address = (CORE_ADDR) -1;
1269
1270   symfile_bfd = objfile->obfd;  /* For next_text_symbol */
1271   abfd = objfile->obfd;
1272   symbuf_end = symbuf_idx = 0;
1273   next_symbol_text_func = dbx_next_symbol_text;
1274   textlow_not_set = 1;
1275   has_line_numbers = 0;
1276
1277   for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
1278     {
1279       /* Get the symbol for this run and pull out some info */
1280       QUIT;                     /* allow this to be interruptable */
1281       if (symbuf_idx == symbuf_end)
1282         fill_symbuf (abfd);
1283       bufp = &symbuf[symbuf_idx++];
1284
1285       /*
1286        * Special case to speed up readin.
1287        */
1288       if (bfd_h_get_8 (abfd, bufp->e_type) == N_SLINE)
1289         {
1290           has_line_numbers = 1;
1291           continue;
1292         }
1293
1294       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1295       OBJSTAT (objfile, n_stabs++);
1296
1297       /* Ok.  There is a lot of code duplicated in the rest of this
1298          switch statement (for efficiency reasons).  Since I don't
1299          like duplicating code, I will do my penance here, and
1300          describe the code which is duplicated:
1301
1302          *) The assignment to namestring.
1303          *) The call to strchr.
1304          *) The addition of a partial symbol the the two partial
1305          symbol lists.  This last is a large section of code, so
1306          I've imbedded it in the following macro.
1307        */
1308
1309 /* Set namestring based on nlist.  If the string table index is invalid, 
1310    give a fake name, and print a single error message per symbol file read,
1311    rather than abort the symbol reading or flood the user with messages.  */
1312
1313 /*FIXME: Too many adds and indirections in here for the inner loop.  */
1314 #define SET_NAMESTRING()\
1315   if (((unsigned)CUR_SYMBOL_STRX + file_string_table_offset) >=         \
1316       DBX_STRINGTAB_SIZE (objfile)) {                                   \
1317     complain (&string_table_offset_complaint, symnum);                  \
1318     namestring = "<bad string table offset>";                           \
1319   } else                                                                \
1320     namestring = CUR_SYMBOL_STRX + file_string_table_offset +           \
1321                  DBX_STRINGTAB (objfile)
1322
1323 #define CUR_SYMBOL_TYPE nlist.n_type
1324 #define CUR_SYMBOL_VALUE nlist.n_value
1325 #define CUR_SYMBOL_STRX nlist.n_strx
1326 #define DBXREAD_ONLY
1327 #define START_PSYMTAB(ofile,fname,low,symoff,global_syms,static_syms)\
1328   start_psymtab(ofile, fname, low, symoff, global_syms, static_syms)
1329 #define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)\
1330   end_psymtab(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)
1331
1332 #include "partial-stab.h"
1333     }
1334
1335   /* If there's stuff to be cleaned up, clean it up.  */
1336   if (DBX_SYMCOUNT (objfile) > 0        /* We have some syms */
1337 /*FIXME, does this have a bug at start address 0? */
1338       && last_o_file_start
1339       && objfile->ei.entry_point < nlist.n_value
1340       && objfile->ei.entry_point >= last_o_file_start)
1341     {
1342       objfile->ei.entry_file_lowpc = last_o_file_start;
1343       objfile->ei.entry_file_highpc = nlist.n_value;
1344     }
1345
1346   if (pst)
1347     {
1348       /* Don't set pst->texthigh lower than it already is.  */
1349       CORE_ADDR text_end =
1350       (lowest_text_address == (CORE_ADDR) -1
1351        ? (text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))
1352        : lowest_text_address)
1353       + text_size;
1354
1355       end_psymtab (pst, psymtab_include_list, includes_used,
1356                    symnum * symbol_size,
1357                    text_end > pst->texthigh ? text_end : pst->texthigh,
1358                    dependency_list, dependencies_used, textlow_not_set);
1359     }
1360
1361   do_cleanups (back_to);
1362 }
1363
1364 /* Allocate and partially fill a partial symtab.  It will be
1365    completely filled at the end of the symbol list.
1366
1367    SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
1368    is the address relative to which its symbols are (incremental) or 0
1369    (normal). */
1370
1371
1372 static struct partial_symtab *
1373 start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
1374                int ldsymoff, struct partial_symbol **global_syms,
1375                struct partial_symbol **static_syms)
1376 {
1377   struct partial_symtab *result =
1378   start_psymtab_common (objfile, objfile->section_offsets,
1379                         filename, textlow, global_syms, static_syms);
1380
1381   result->read_symtab_private = (char *)
1382     obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
1383   LDSYMOFF (result) = ldsymoff;
1384   result->read_symtab = dbx_psymtab_to_symtab;
1385   SYMBOL_SIZE (result) = symbol_size;
1386   SYMBOL_OFFSET (result) = symbol_table_offset;
1387   STRING_OFFSET (result) = string_table_offset;
1388   FILE_STRING_OFFSET (result) = file_string_table_offset;
1389
1390   /* If we're handling an ELF file, drag some section-relocation info
1391      for this source file out of the ELF symbol table, to compensate for
1392      Sun brain death.  This replaces the section_offsets in this psymtab,
1393      if successful.  */
1394   elfstab_offset_sections (objfile, result);
1395
1396   /* Deduce the source language from the filename for this psymtab. */
1397   psymtab_language = deduce_language_from_filename (filename);
1398
1399   return result;
1400 }
1401
1402 /* Close off the current usage of PST.  
1403    Returns PST or NULL if the partial symtab was empty and thrown away.
1404
1405    FIXME:  List variables and peculiarities of same.  */
1406
1407 struct partial_symtab *
1408 end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
1409              int capping_symbol_offset, CORE_ADDR capping_text,
1410              struct partial_symtab **dependency_list, int number_dependencies,
1411              int textlow_not_set)
1412 {
1413   int i;
1414   struct objfile *objfile = pst->objfile;
1415
1416   if (capping_symbol_offset != -1)
1417     LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
1418   pst->texthigh = capping_text;
1419
1420 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
1421   /* Under Solaris, the N_SO symbols always have a value of 0,
1422      instead of the usual address of the .o file.  Therefore,
1423      we have to do some tricks to fill in texthigh and textlow.
1424      The first trick is in partial-stab.h: if we see a static
1425      or global function, and the textlow for the current pst
1426      is not set (ie: textlow_not_set), then we use that function's
1427      address for the textlow of the pst.  */
1428
1429   /* Now, to fill in texthigh, we remember the last function seen
1430      in the .o file (also in partial-stab.h).  Also, there's a hack in
1431      bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
1432      to here via the misc_info field.  Therefore, we can fill in
1433      a reliable texthigh by taking the address plus size of the
1434      last function in the file.  */
1435
1436   if (pst->texthigh == 0 && last_function_name)
1437     {
1438       char *p;
1439       int n;
1440       struct minimal_symbol *minsym;
1441
1442       p = strchr (last_function_name, ':');
1443       if (p == NULL)
1444         p = last_function_name;
1445       n = p - last_function_name;
1446       p = alloca (n + 2);
1447       strncpy (p, last_function_name, n);
1448       p[n] = 0;
1449
1450       minsym = lookup_minimal_symbol (p, pst->filename, objfile);
1451       if (minsym == NULL)
1452         {
1453           /* Sun Fortran appends an underscore to the minimal symbol name,
1454              try again with an appended underscore if the minimal symbol
1455              was not found.  */
1456           p[n] = '_';
1457           p[n + 1] = 0;
1458           minsym = lookup_minimal_symbol (p, pst->filename, objfile);
1459         }
1460
1461       if (minsym)
1462         pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
1463
1464       last_function_name = NULL;
1465     }
1466
1467   /* this test will be true if the last .o file is only data */
1468   if (textlow_not_set)
1469     pst->textlow = pst->texthigh;
1470   else
1471     {
1472       struct partial_symtab *p1;
1473
1474       /* If we know our own starting text address, then walk through all other
1475          psymtabs for this objfile, and if any didn't know their ending text
1476          address, set it to our starting address.  Take care to not set our
1477          own ending address to our starting address, nor to set addresses on
1478          `dependency' files that have both textlow and texthigh zero.  */
1479
1480       ALL_OBJFILE_PSYMTABS (objfile, p1)
1481       {
1482         if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
1483           {
1484             p1->texthigh = pst->textlow;
1485             /* if this file has only data, then make textlow match texthigh */
1486             if (p1->textlow == 0)
1487               p1->textlow = p1->texthigh;
1488           }
1489       }
1490     }
1491
1492   /* End of kludge for patching Solaris textlow and texthigh.  */
1493 #endif /* SOFUN_ADDRESS_MAYBE_MISSING.  */
1494
1495   pst->n_global_syms =
1496     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1497   pst->n_static_syms =
1498     objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1499
1500   pst->number_of_dependencies = number_dependencies;
1501   if (number_dependencies)
1502     {
1503       pst->dependencies = (struct partial_symtab **)
1504         obstack_alloc (&objfile->psymbol_obstack,
1505                     number_dependencies * sizeof (struct partial_symtab *));
1506       memcpy (pst->dependencies, dependency_list,
1507               number_dependencies * sizeof (struct partial_symtab *));
1508     }
1509   else
1510     pst->dependencies = 0;
1511
1512   for (i = 0; i < num_includes; i++)
1513     {
1514       struct partial_symtab *subpst =
1515       allocate_psymtab (include_list[i], objfile);
1516
1517       /* Copy the sesction_offsets array from the main psymtab. */
1518       subpst->section_offsets = pst->section_offsets;
1519       subpst->read_symtab_private =
1520         (char *) obstack_alloc (&objfile->psymbol_obstack,
1521                                 sizeof (struct symloc));
1522       LDSYMOFF (subpst) =
1523         LDSYMLEN (subpst) =
1524         subpst->textlow =
1525         subpst->texthigh = 0;
1526
1527       /* We could save slight bits of space by only making one of these,
1528          shared by the entire set of include files.  FIXME-someday.  */
1529       subpst->dependencies = (struct partial_symtab **)
1530         obstack_alloc (&objfile->psymbol_obstack,
1531                        sizeof (struct partial_symtab *));
1532       subpst->dependencies[0] = pst;
1533       subpst->number_of_dependencies = 1;
1534
1535       subpst->globals_offset =
1536         subpst->n_global_syms =
1537         subpst->statics_offset =
1538         subpst->n_static_syms = 0;
1539
1540       subpst->readin = 0;
1541       subpst->symtab = 0;
1542       subpst->read_symtab = pst->read_symtab;
1543     }
1544
1545   sort_pst_symbols (pst);
1546
1547   /* If there is already a psymtab or symtab for a file of this name, remove it.
1548      (If there is a symtab, more drastic things also happen.)
1549      This happens in VxWorks.  */
1550   free_named_symtabs (pst->filename);
1551
1552   if (num_includes == 0
1553       && number_dependencies == 0
1554       && pst->n_global_syms == 0
1555       && pst->n_static_syms == 0
1556       && has_line_numbers == 0)
1557     {
1558       /* Throw away this psymtab, it's empty.  We can't deallocate it, since
1559          it is on the obstack, but we can forget to chain it on the list.  */
1560       /* Empty psymtabs happen as a result of header files which don't have
1561          any symbols in them.  There can be a lot of them.  But this check
1562          is wrong, in that a psymtab with N_SLINE entries but nothing else
1563          is not empty, but we don't realize that.  Fixing that without slowing
1564          things down might be tricky.  */
1565
1566       discard_psymtab (pst);
1567
1568       /* Indicate that psymtab was thrown away.  */
1569       pst = (struct partial_symtab *) NULL;
1570     }
1571   return pst;
1572 }
1573 \f
1574 static void
1575 dbx_psymtab_to_symtab_1 (struct partial_symtab *pst)
1576 {
1577   struct cleanup *old_chain;
1578   int i;
1579
1580   if (!pst)
1581     return;
1582
1583   if (pst->readin)
1584     {
1585       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1586                           pst->filename);
1587       return;
1588     }
1589
1590   /* Read in all partial symtabs on which this one is dependent */
1591   for (i = 0; i < pst->number_of_dependencies; i++)
1592     if (!pst->dependencies[i]->readin)
1593       {
1594         /* Inform about additional files that need to be read in.  */
1595         if (info_verbose)
1596           {
1597             fputs_filtered (" ", gdb_stdout);
1598             wrap_here ("");
1599             fputs_filtered ("and ", gdb_stdout);
1600             wrap_here ("");
1601             printf_filtered ("%s...", pst->dependencies[i]->filename);
1602             wrap_here ("");     /* Flush output */
1603             gdb_flush (gdb_stdout);
1604           }
1605         dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
1606       }
1607
1608   if (LDSYMLEN (pst))           /* Otherwise it's a dummy */
1609     {
1610       /* Init stuff necessary for reading in symbols */
1611       stabsread_init ();
1612       buildsym_init ();
1613       old_chain = make_cleanup (really_free_pendings, 0);
1614       file_string_table_offset = FILE_STRING_OFFSET (pst);
1615       symbol_size = SYMBOL_SIZE (pst);
1616
1617       /* Read in this file's symbols */
1618       bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
1619       read_ofile_symtab (pst);
1620       sort_symtab_syms (pst->symtab);
1621
1622       do_cleanups (old_chain);
1623     }
1624
1625   pst->readin = 1;
1626 }
1627
1628 /* Read in all of the symbols for a given psymtab for real.
1629    Be verbose about it if the user wants that.  */
1630
1631 static void
1632 dbx_psymtab_to_symtab (struct partial_symtab *pst)
1633 {
1634   bfd *sym_bfd;
1635
1636   if (!pst)
1637     return;
1638
1639   if (pst->readin)
1640     {
1641       fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1642                           pst->filename);
1643       return;
1644     }
1645
1646   if (LDSYMLEN (pst) || pst->number_of_dependencies)
1647     {
1648       /* Print the message now, before reading the string table,
1649          to avoid disconcerting pauses.  */
1650       if (info_verbose)
1651         {
1652           printf_filtered ("Reading in symbols for %s...", pst->filename);
1653           gdb_flush (gdb_stdout);
1654         }
1655
1656       sym_bfd = pst->objfile->obfd;
1657
1658       next_symbol_text_func = dbx_next_symbol_text;
1659
1660       dbx_psymtab_to_symtab_1 (pst);
1661
1662       /* Match with global symbols.  This only needs to be done once,
1663          after all of the symtabs and dependencies have been read in.   */
1664       scan_file_globals (pst->objfile);
1665
1666       /* Finish up the debug error message.  */
1667       if (info_verbose)
1668         printf_filtered ("done.\n");
1669     }
1670 }
1671
1672 /* Read in a defined section of a specific object file's symbols. */
1673
1674 static void
1675 read_ofile_symtab (struct partial_symtab *pst)
1676 {
1677   register char *namestring;
1678   register struct external_nlist *bufp;
1679   struct internal_nlist nlist;
1680   unsigned char type;
1681   unsigned max_symnum;
1682   register bfd *abfd;
1683   struct objfile *objfile;
1684   int sym_offset;               /* Offset to start of symbols to read */
1685   int sym_size;                 /* Size of symbols to read */
1686   CORE_ADDR text_offset;        /* Start of text segment for symbols */
1687   int text_size;                /* Size of text segment for symbols */
1688   struct section_offsets *section_offsets;
1689
1690   objfile = pst->objfile;
1691   sym_offset = LDSYMOFF (pst);
1692   sym_size = LDSYMLEN (pst);
1693   text_offset = pst->textlow;
1694   text_size = pst->texthigh - pst->textlow;
1695   /* This cannot be simply objfile->section_offsets because of
1696      elfstab_offset_sections() which initializes the psymtab section
1697      offsets information in a special way, and that is different from
1698      objfile->section_offsets. */ 
1699   section_offsets = pst->section_offsets;
1700
1701   current_objfile = objfile;
1702   subfile_stack = NULL;
1703
1704   stringtab_global = DBX_STRINGTAB (objfile);
1705   last_source_file = NULL;
1706
1707   abfd = objfile->obfd;
1708   symfile_bfd = objfile->obfd;  /* Implicit param to next_text_symbol */
1709   symbuf_end = symbuf_idx = 0;
1710
1711   /* It is necessary to actually read one symbol *before* the start
1712      of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
1713      occurs before the N_SO symbol.
1714
1715      Detecting this in read_dbx_symtab
1716      would slow down initial readin, so we look for it here instead.  */
1717   if (!processing_acc_compilation && sym_offset >= (int) symbol_size)
1718     {
1719       bfd_seek (symfile_bfd, sym_offset - symbol_size, SEEK_CUR);
1720       fill_symbuf (abfd);
1721       bufp = &symbuf[symbuf_idx++];
1722       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1723       OBJSTAT (objfile, n_stabs++);
1724
1725       SET_NAMESTRING ();
1726
1727       processing_gcc_compilation = 0;
1728       if (nlist.n_type == N_TEXT)
1729         {
1730           const char *tempstring = namestring;
1731
1732           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1733             processing_gcc_compilation = 1;
1734           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1735             processing_gcc_compilation = 2;
1736           if (tempstring[0] == bfd_get_symbol_leading_char (symfile_bfd))
1737             ++tempstring;
1738           if (STREQN (tempstring, "__gnu_compiled", 14))
1739             processing_gcc_compilation = 2;
1740         }
1741
1742       /* Try to select a C++ demangling based on the compilation unit
1743          producer. */
1744
1745       if (processing_gcc_compilation)
1746         {
1747           if (AUTO_DEMANGLING)
1748             {
1749               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1750             }
1751         }
1752     }
1753   else
1754     {
1755       /* The N_SO starting this symtab is the first symbol, so we
1756          better not check the symbol before it.  I'm not this can
1757          happen, but it doesn't hurt to check for it.  */
1758       bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
1759       processing_gcc_compilation = 0;
1760     }
1761
1762   if (symbuf_idx == symbuf_end)
1763     fill_symbuf (abfd);
1764   bufp = &symbuf[symbuf_idx];
1765   if (bfd_h_get_8 (abfd, bufp->e_type) != N_SO)
1766     error ("First symbol in segment of executable not a source symbol");
1767
1768   max_symnum = sym_size / symbol_size;
1769
1770   for (symnum = 0;
1771        symnum < max_symnum;
1772        symnum++)
1773     {
1774       QUIT;                     /* Allow this to be interruptable */
1775       if (symbuf_idx == symbuf_end)
1776         fill_symbuf (abfd);
1777       bufp = &symbuf[symbuf_idx++];
1778       INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1779       OBJSTAT (objfile, n_stabs++);
1780
1781       type = bfd_h_get_8 (abfd, bufp->e_type);
1782
1783       SET_NAMESTRING ();
1784
1785       if (type & N_STAB)
1786         {
1787           process_one_symbol (type, nlist.n_desc, nlist.n_value,
1788                               namestring, section_offsets, objfile);
1789         }
1790       /* We skip checking for a new .o or -l file; that should never
1791          happen in this routine. */
1792       else if (type == N_TEXT)
1793         {
1794           /* I don't think this code will ever be executed, because
1795              the GCC_COMPILED_FLAG_SYMBOL usually is right before
1796              the N_SO symbol which starts this source file.
1797              However, there is no reason not to accept
1798              the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
1799
1800           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1801             processing_gcc_compilation = 1;
1802           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1803             processing_gcc_compilation = 2;
1804
1805           if (AUTO_DEMANGLING)
1806             {
1807               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1808             }
1809         }
1810       else if (type & N_EXT || type == (unsigned char) N_TEXT
1811                || type == (unsigned char) N_NBTEXT
1812         )
1813         {
1814           /* Global symbol: see if we came across a dbx defintion for
1815              a corresponding symbol.  If so, store the value.  Remove
1816              syms from the chain when their values are stored, but
1817              search the whole chain, as there may be several syms from
1818              different files with the same name. */
1819           /* This is probably not true.  Since the files will be read
1820              in one at a time, each reference to a global symbol will
1821              be satisfied in each file as it appears. So we skip this
1822              section. */
1823           ;
1824         }
1825     }
1826
1827   current_objfile = NULL;
1828
1829   /* In a Solaris elf file, this variable, which comes from the
1830      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
1831      which comes from pst->textlow is correct. */
1832   if (last_source_start_addr == 0)
1833     last_source_start_addr = text_offset;
1834
1835   /* In reordered executables last_source_start_addr may not be the
1836      lower bound for this symtab, instead use text_offset which comes
1837      from pst->textlow which is correct.  */
1838   if (last_source_start_addr > text_offset)
1839     last_source_start_addr = text_offset;
1840
1841   pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
1842
1843   /* Process items which we had to "process_later" due to dependancies 
1844      on other stabs.  */
1845   process_now (objfile);
1846
1847   end_stabs ();
1848 }
1849 \f
1850
1851 /* This handles a single symbol from the symbol-file, building symbols
1852    into a GDB symtab.  It takes these arguments and an implicit argument.
1853
1854    TYPE is the type field of the ".stab" symbol entry.
1855    DESC is the desc field of the ".stab" entry.
1856    VALU is the value field of the ".stab" entry.
1857    NAME is the symbol name, in our address space.
1858    SECTION_OFFSETS is a set of amounts by which the sections of this object
1859    file were relocated when it was loaded into memory.
1860    Note that these section_offsets are not the 
1861    objfile->section_offsets but the pst->section_offsets.
1862    All symbols that refer
1863    to memory locations need to be offset by these amounts.
1864    OBJFILE is the object file from which we are reading symbols.
1865    It is used in end_symtab.  */
1866
1867 void
1868 process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
1869                     struct section_offsets *section_offsets,
1870                     struct objfile *objfile)
1871 {
1872 #ifdef SUN_FIXED_LBRAC_BUG
1873   /* If SUN_FIXED_LBRAC_BUG is defined, then it tells us whether we need
1874      to correct the address of N_LBRAC's.  If it is not defined, then
1875      we never need to correct the addresses.  */
1876
1877   /* This records the last pc address we've seen.  We depend on there being
1878      an SLINE or FUN or SO before the first LBRAC, since the variable does
1879      not get reset in between reads of different symbol files.  */
1880   static CORE_ADDR last_pc_address;
1881 #endif
1882
1883   register struct context_stack *new;
1884   /* This remembers the address of the start of a function.  It is used
1885      because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
1886      relative to the current function's start address.  On systems
1887      other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
1888      used to relocate these symbol types rather than SECTION_OFFSETS.  */
1889   static CORE_ADDR function_start_offset;
1890
1891   /* If this is nonzero, we've seen a non-gcc N_OPT symbol for this source
1892      file.  Used to detect the SunPRO solaris compiler.  */
1893   static int n_opt_found;
1894
1895   /* The stab type used for the definition of the last function.
1896      N_STSYM or N_GSYM for SunOS4 acc; N_FUN for other compilers.  */
1897   static int function_stab_type = 0;
1898
1899   if (!block_address_function_relative)
1900     /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
1901        function start address, so just use the text offset.  */
1902     function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1903
1904   /* Something is wrong if we see real data before
1905      seeing a source file name.  */
1906
1907   if (last_source_file == NULL && type != (unsigned char) N_SO)
1908     {
1909       /* Ignore any symbols which appear before an N_SO symbol.
1910          Currently no one puts symbols there, but we should deal
1911          gracefully with the case.  A complain()t might be in order,
1912          but this should not be an error ().  */
1913       return;
1914     }
1915
1916   switch (type)
1917     {
1918     case N_FUN:
1919     case N_FNAME:
1920
1921       if (*name == '\000')
1922         {
1923           /* This N_FUN marks the end of a function.  This closes off the
1924              current block.  */
1925           within_function = 0;
1926           new = pop_context ();
1927
1928           /* Make a block for the local symbols within.  */
1929           finish_block (new->name, &local_symbols, new->old_blocks,
1930                         new->start_addr, new->start_addr + valu,
1931                         objfile);
1932
1933           /* May be switching to an assembler file which may not be using
1934              block relative stabs, so reset the offset.  */
1935           if (block_address_function_relative)
1936             function_start_offset = 0;
1937
1938           break;
1939         }
1940
1941       /* Relocate for dynamic loading */
1942       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1943 #ifdef SMASH_TEXT_ADDRESS
1944       SMASH_TEXT_ADDRESS (valu);
1945 #endif
1946       goto define_a_symbol;
1947
1948     case N_LBRAC:
1949       /* This "symbol" just indicates the start of an inner lexical
1950          context within a function.  */
1951
1952       /* Ignore extra outermost context from SunPRO cc and acc.  */
1953       if (n_opt_found && desc == 1)
1954         break;
1955
1956       if (block_address_function_relative)
1957         /* Relocate for Sun ELF acc fn-relative syms.  */
1958         valu += function_start_offset;
1959       else
1960         /* On most machines, the block addresses are relative to the
1961            N_SO, the linker did not relocate them (sigh).  */
1962         valu += last_source_start_addr;
1963
1964 #ifdef SUN_FIXED_LBRAC_BUG
1965       if (!SUN_FIXED_LBRAC_BUG && valu < last_pc_address)
1966         {
1967           /* Patch current LBRAC pc value to match last handy pc value */
1968           complain (&lbrac_complaint);
1969           valu = last_pc_address;
1970         }
1971 #endif
1972       new = push_context (desc, valu);
1973       break;
1974
1975     case N_RBRAC:
1976       /* This "symbol" just indicates the end of an inner lexical
1977          context that was started with N_LBRAC.  */
1978
1979       /* Ignore extra outermost context from SunPRO cc and acc.  */
1980       if (n_opt_found && desc == 1)
1981         break;
1982
1983       if (block_address_function_relative)
1984         /* Relocate for Sun ELF acc fn-relative syms.  */
1985         valu += function_start_offset;
1986       else
1987         /* On most machines, the block addresses are relative to the
1988            N_SO, the linker did not relocate them (sigh).  */
1989         valu += last_source_start_addr;
1990
1991       new = pop_context ();
1992       if (desc != new->depth)
1993         complain (&lbrac_mismatch_complaint, symnum);
1994
1995       /* Some compilers put the variable decls inside of an
1996          LBRAC/RBRAC block.  This macro should be nonzero if this
1997          is true.  DESC is N_DESC from the N_RBRAC symbol.
1998          GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
1999          or the GCC2_COMPILED_SYMBOL.  */
2000 #if !defined (VARIABLES_INSIDE_BLOCK)
2001 #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
2002 #endif
2003
2004       /* Can only use new->locals as local symbols here if we're in
2005          gcc or on a machine that puts them before the lbrack.  */
2006       if (!VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2007         local_symbols = new->locals;
2008
2009       if (context_stack_depth
2010           > !VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2011         {
2012           /* This is not the outermost LBRAC...RBRAC pair in the function,
2013              its local symbols preceded it, and are the ones just recovered
2014              from the context stack.  Define the block for them (but don't
2015              bother if the block contains no symbols.  Should we complain
2016              on blocks without symbols?  I can't think of any useful purpose
2017              for them).  */
2018           if (local_symbols != NULL)
2019             {
2020               /* Muzzle a compiler bug that makes end < start.  (which
2021                  compilers?  Is this ever harmful?).  */
2022               if (new->start_addr > valu)
2023                 {
2024                   complain (&lbrac_rbrac_complaint);
2025                   new->start_addr = valu;
2026                 }
2027               /* Make a block for the local symbols within.  */
2028               finish_block (0, &local_symbols, new->old_blocks,
2029                             new->start_addr, valu, objfile);
2030             }
2031         }
2032       else
2033         {
2034           /* This is the outermost LBRAC...RBRAC pair.  There is no
2035              need to do anything; leave the symbols that preceded it
2036              to be attached to the function's own block.  We need to
2037              indicate that we just moved outside of the function.  */
2038           within_function = 0;
2039         }
2040
2041       if (VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2042         /* Now pop locals of block just finished.  */
2043         local_symbols = new->locals;
2044       break;
2045
2046     case N_FN:
2047     case N_FN_SEQ:
2048       /* This kind of symbol indicates the start of an object file.  */
2049       /* Relocate for dynamic loading */
2050       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2051       break;
2052
2053     case N_SO:
2054       /* This type of symbol indicates the start of data
2055          for one source file.
2056          Finish the symbol table of the previous source file
2057          (if any) and start accumulating a new symbol table.  */
2058       /* Relocate for dynamic loading */
2059       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2060
2061       n_opt_found = 0;
2062
2063 #ifdef SUN_FIXED_LBRAC_BUG
2064       last_pc_address = valu;   /* Save for SunOS bug circumcision */
2065 #endif
2066
2067 #ifdef PCC_SOL_BROKEN
2068       /* pcc bug, occasionally puts out SO for SOL.  */
2069       if (context_stack_depth > 0)
2070         {
2071           start_subfile (name, NULL);
2072           break;
2073         }
2074 #endif
2075       if (last_source_file)
2076         {
2077           /* Check if previous symbol was also an N_SO (with some
2078              sanity checks).  If so, that one was actually the directory
2079              name, and the current one is the real file name.
2080              Patch things up. */
2081           if (previous_stab_code == (unsigned char) N_SO)
2082             {
2083               patch_subfile_names (current_subfile, name);
2084               break;            /* Ignore repeated SOs */
2085             }
2086           end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
2087           end_stabs ();
2088         }
2089
2090       /* Null name means this just marks the end of text for this .o file.
2091          Don't start a new symtab in this case.  */
2092       if (*name == '\000')
2093         break;
2094
2095       if (block_address_function_relative)
2096         function_start_offset = 0;
2097
2098       start_stabs ();
2099       start_symtab (name, NULL, valu);
2100       record_debugformat ("stabs");
2101       break;
2102
2103     case N_SOL:
2104       /* This type of symbol indicates the start of data for
2105          a sub-source-file, one whose contents were copied or
2106          included in the compilation of the main source file
2107          (whose name was given in the N_SO symbol.)  */
2108       /* Relocate for dynamic loading */
2109       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2110       start_subfile (name, current_subfile->dirname);
2111       break;
2112
2113     case N_BINCL:
2114       push_subfile ();
2115       add_new_header_file (name, valu);
2116       start_subfile (name, current_subfile->dirname);
2117       break;
2118
2119     case N_EINCL:
2120       start_subfile (pop_subfile (), current_subfile->dirname);
2121       break;
2122
2123     case N_EXCL:
2124       add_old_header_file (name, valu);
2125       break;
2126
2127     case N_SLINE:
2128       /* This type of "symbol" really just records
2129          one line-number -- core-address correspondence.
2130          Enter it in the line list for this symbol table.  */
2131
2132       /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
2133       valu += function_start_offset;
2134
2135 #ifdef SUN_FIXED_LBRAC_BUG
2136       last_pc_address = valu;   /* Save for SunOS bug circumcision */
2137 #endif
2138       record_line (current_subfile, desc, valu);
2139       break;
2140
2141     case N_BCOMM:
2142       common_block_start (name, objfile);
2143       break;
2144
2145     case N_ECOMM:
2146       common_block_end (objfile);
2147       break;
2148
2149       /* The following symbol types need to have the appropriate offset added
2150          to their value; then we process symbol definitions in the name.  */
2151
2152     case N_STSYM:               /* Static symbol in data seg */
2153     case N_LCSYM:               /* Static symbol in BSS seg */
2154     case N_ROSYM:               /* Static symbol in Read-only data seg */
2155       /* HORRID HACK DEPT.  However, it's Sun's furgin' fault.
2156          Solaris2's stabs-in-elf makes *most* symbols relative
2157          but leaves a few absolute (at least for Solaris 2.1 and version
2158          2.0.1 of the SunPRO compiler).  N_STSYM and friends sit on the fence.
2159          .stab "foo:S...",N_STSYM        is absolute (ld relocates it)
2160          .stab "foo:V...",N_STSYM        is relative (section base subtracted).
2161          This leaves us no choice but to search for the 'S' or 'V'...
2162          (or pass the whole section_offsets stuff down ONE MORE function
2163          call level, which we really don't want to do).  */
2164       {
2165         char *p;
2166
2167         /* .o files and NLMs have non-zero text seg offsets, but don't need
2168            their static syms offset in this fashion.  XXX - This is really a
2169            crock that should be fixed in the solib handling code so that I
2170            don't have to work around it here. */
2171
2172         if (!symfile_relocatable)
2173           {
2174             p = strchr (name, ':');
2175             if (p != 0 && p[1] == 'S')
2176               {
2177                 /* The linker relocated it.  We don't want to add an
2178                    elfstab_offset_sections-type offset, but we *do* want
2179                    to add whatever solib.c passed to symbol_file_add as
2180                    addr (this is known to affect SunOS4, and I suspect ELF
2181                    too).  Since elfstab_offset_sections currently does not
2182                    muck with the text offset (there is no Ttext.text
2183                    symbol), we can get addr from the text offset.  If
2184                    elfstab_offset_sections ever starts dealing with the
2185                    text offset, and we still need to do this, we need to
2186                    invent a SECT_OFF_ADDR_KLUDGE or something.  */
2187                 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2188                 goto define_a_symbol;
2189               }
2190           }
2191         /* Since it's not the kludge case, re-dispatch to the right handler. */
2192         switch (type)
2193           {
2194           case N_STSYM:
2195             goto case_N_STSYM;
2196           case N_LCSYM:
2197             goto case_N_LCSYM;
2198           case N_ROSYM:
2199             goto case_N_ROSYM;
2200           default:
2201             abort ();
2202           }
2203       }
2204
2205     case_N_STSYM:               /* Static symbol in data seg */
2206     case N_DSLINE:              /* Source line number, data seg */
2207       valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
2208       goto define_a_symbol;
2209
2210     case_N_LCSYM:               /* Static symbol in BSS seg */
2211     case N_BSLINE:              /* Source line number, bss seg */
2212       /*   N_BROWS:       overlaps with N_BSLINE */
2213       valu += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
2214       goto define_a_symbol;
2215
2216     case_N_ROSYM:               /* Static symbol in Read-only data seg */
2217       valu += ANOFFSET (section_offsets, SECT_OFF_RODATA (objfile));
2218       goto define_a_symbol;
2219
2220     case N_ENTRY:               /* Alternate entry point */
2221       /* Relocate for dynamic loading */
2222       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2223       goto define_a_symbol;
2224
2225       /* The following symbol types we don't know how to process.  Handle
2226          them in a "default" way, but complain to people who care.  */
2227     default:
2228     case N_CATCH:               /* Exception handler catcher */
2229     case N_EHDECL:              /* Exception handler name */
2230     case N_PC:                  /* Global symbol in Pascal */
2231     case N_M2C:         /* Modula-2 compilation unit */
2232       /*   N_MOD2:        overlaps with N_EHDECL */
2233     case N_SCOPE:               /* Modula-2 scope information */
2234     case N_ECOML:               /* End common (local name) */
2235     case N_NBTEXT:              /* Gould Non-Base-Register symbols??? */
2236     case N_NBDATA:
2237     case N_NBBSS:
2238     case N_NBSTS:
2239     case N_NBLCS:
2240       complain (&unknown_symtype_complaint, local_hex_string (type));
2241       /* FALLTHROUGH */
2242
2243       /* The following symbol types don't need the address field relocated,
2244          since it is either unused, or is absolute.  */
2245     define_a_symbol:
2246     case N_GSYM:                /* Global variable */
2247     case N_NSYMS:               /* Number of symbols (ultrix) */
2248     case N_NOMAP:               /* No map?  (ultrix) */
2249     case N_RSYM:                /* Register variable */
2250     case N_DEFD:                /* Modula-2 GNU module dependency */
2251     case N_SSYM:                /* Struct or union element */
2252     case N_LSYM:                /* Local symbol in stack */
2253     case N_PSYM:                /* Parameter variable */
2254     case N_LENG:                /* Length of preceding symbol type */
2255       if (name)
2256         {
2257           int deftype;
2258           char *colon_pos = strchr (name, ':');
2259           if (colon_pos == NULL)
2260             deftype = '\0';
2261           else
2262             deftype = colon_pos[1];
2263
2264           switch (deftype)
2265             {
2266             case 'f':
2267             case 'F':
2268               function_stab_type = type;
2269
2270 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
2271               /* Deal with the SunPRO 3.0 compiler which omits the address
2272                  from N_FUN symbols.  */
2273               if (type == N_FUN
2274                   && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile)))
2275                 valu = 
2276                   find_stab_function_addr (name, last_source_file, objfile);
2277 #endif
2278
2279 #ifdef SUN_FIXED_LBRAC_BUG
2280               /* The Sun acc compiler, under SunOS4, puts out
2281                  functions with N_GSYM or N_STSYM.  The problem is
2282                  that the address of the symbol is no good (for N_GSYM
2283                  it doesn't even attept an address; for N_STSYM it
2284                  puts out an address but then it gets relocated
2285                  relative to the data segment, not the text segment).
2286                  Currently we can't fix this up later as we do for
2287                  some types of symbol in scan_file_globals.
2288                  Fortunately we do have a way of finding the address -
2289                  we know that the value in last_pc_address is either
2290                  the one we want (if we're dealing with the first
2291                  function in an object file), or somewhere in the
2292                  previous function. This means that we can use the
2293                  minimal symbol table to get the address.  */
2294
2295               /* Starting with release 3.0, the Sun acc compiler,
2296                  under SunOS4, puts out functions with N_FUN and a value
2297                  of zero. This gets relocated to the start of the text
2298                  segment of the module, which is no good either.
2299                  Under SunOS4 we can deal with this as N_SLINE and N_SO
2300                  entries contain valid absolute addresses.
2301                  Release 3.0 acc also puts out N_OPT entries, which makes
2302                  it possible to discern acc from cc or gcc.  */
2303
2304               if (type == N_GSYM || type == N_STSYM
2305                   || (type == N_FUN
2306                       && n_opt_found && !block_address_function_relative))
2307                 {
2308                   struct minimal_symbol *m;
2309                   int l = colon_pos - name;
2310
2311                   m = lookup_minimal_symbol_by_pc (last_pc_address);
2312                   if (m && STREQN (SYMBOL_NAME (m), name, l)
2313                       && SYMBOL_NAME (m)[l] == '\0')
2314                     /* last_pc_address was in this function */
2315                     valu = SYMBOL_VALUE (m);
2316                   else if (m && SYMBOL_NAME (m + 1)
2317                            && STREQN (SYMBOL_NAME (m + 1), name, l)
2318                            && SYMBOL_NAME (m + 1)[l] == '\0')
2319                     /* last_pc_address was in last function */
2320                     valu = SYMBOL_VALUE (m + 1);
2321                   else
2322                     /* Not found - use last_pc_address (for finish_block) */
2323                     valu = last_pc_address;
2324                 }
2325
2326               last_pc_address = valu;   /* Save for SunOS bug circumcision */
2327 #endif
2328
2329               if (block_address_function_relative)
2330                 /* For Solaris 2.0 compilers, the block addresses and
2331                    N_SLINE's are relative to the start of the
2332                    function.  On normal systems, and when using gcc on
2333                    Solaris 2.0, these addresses are just absolute, or
2334                    relative to the N_SO, depending on
2335                    BLOCK_ADDRESS_ABSOLUTE.  */
2336                 function_start_offset = valu;
2337
2338               within_function = 1;
2339
2340               if (context_stack_depth > 1)
2341                 {
2342                   complain (&lbrac_unmatched_complaint, symnum);
2343                   break;
2344                 }
2345
2346               if (context_stack_depth > 0)
2347                 {
2348                   new = pop_context ();
2349                   /* Make a block for the local symbols within.  */
2350                   finish_block (new->name, &local_symbols, new->old_blocks,
2351                                 new->start_addr, valu, objfile);
2352                 }
2353
2354               new = push_context (0, valu);
2355               new->name = define_symbol (valu, name, desc, type, objfile);
2356               break;
2357
2358             default:
2359               define_symbol (valu, name, desc, type, objfile);
2360               break;
2361             }
2362         }
2363       break;
2364
2365       /* We use N_OPT to carry the gcc2_compiled flag.  Sun uses it
2366          for a bunch of other flags, too.  Someday we may parse their
2367          flags; for now we ignore theirs and hope they'll ignore ours.  */
2368     case N_OPT:         /* Solaris 2:  Compiler options */
2369       if (name)
2370         {
2371           if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
2372             {
2373               processing_gcc_compilation = 2;
2374 #if 1                           /* Works, but is experimental.  -fnf */
2375               if (AUTO_DEMANGLING)
2376                 {
2377                   set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
2378                 }
2379 #endif
2380             }
2381           else
2382             n_opt_found = 1;
2383         }
2384       break;
2385
2386       /* The following symbol types can be ignored.  */
2387     case N_OBJ:         /* Solaris 2:  Object file dir and name */
2388       /*   N_UNDF:                   Solaris 2:  file separator mark */
2389       /*   N_UNDF: -- we will never encounter it, since we only process one
2390          file's symbols at once.  */
2391     case N_ENDM:                /* Solaris 2:  End of module */
2392     case N_MAIN:                /* Name of main routine.  */
2393     case N_ALIAS:               /* SunPro F77: alias name, ignore for now.  */
2394       break;
2395     }
2396
2397   /* '#' is a GNU C extension to allow one symbol to refer to another
2398      related symbol.
2399
2400      Generally this is used so that an alias can refer to its main
2401      symbol.  */
2402   if (name[0] == '#')
2403     {
2404       /* Initialize symbol reference names and determine if this is 
2405          a definition.  If symbol reference is being defined, go 
2406          ahead and add it.  Otherwise, just return sym. */
2407
2408       char *s = name;
2409       int refnum;
2410
2411       /* If this stab defines a new reference ID that is not on the
2412          reference list, then put it on the reference list.
2413
2414          We go ahead and advance NAME past the reference, even though
2415          it is not strictly necessary at this time.  */
2416       refnum = symbol_reference_defined (&s);
2417       if (refnum >= 0)
2418         if (!ref_search (refnum))
2419           ref_add (refnum, 0, name, valu);
2420       name = s;
2421     }
2422
2423
2424   previous_stab_code = type;
2425 }
2426 \f
2427 /* FIXME: The only difference between this and elfstab_build_psymtabs
2428    is the call to install_minimal_symbols for elf, and the support for
2429    split sections.  If the differences are really that small, the code
2430    should be shared.  */
2431
2432 /* Scan and build partial symbols for an coff symbol file.
2433    The coff file has already been processed to get its minimal symbols.
2434
2435    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2436    rolled into one.
2437
2438    OBJFILE is the object file we are reading symbols from.
2439    ADDR is the address relative to which the symbols are (e.g.
2440    the base address of the text segment).
2441    MAINLINE is true if we are reading the main symbol
2442    table (as opposed to a shared lib or dynamically loaded file).
2443    TEXTADDR is the address of the text section.
2444    TEXTSIZE is the size of the text section.
2445    STABSECTS is the list of .stab sections in OBJFILE.
2446    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2447    .stabstr section exists.
2448
2449    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2450    adjusted for coff details. */
2451
2452 void
2453 coffstab_build_psymtabs (struct objfile *objfile, int mainline,
2454                          CORE_ADDR textaddr, unsigned int textsize,
2455                          struct stab_section_list *stabsects,
2456                          file_ptr stabstroffset, unsigned int stabstrsize)
2457 {
2458   int val;
2459   bfd *sym_bfd = objfile->obfd;
2460   char *name = bfd_get_filename (sym_bfd);
2461   struct dbx_symfile_info *info;
2462   unsigned int stabsize;
2463
2464   /* There is already a dbx_symfile_info allocated by our caller.
2465      It might even contain some info from the coff symtab to help us.  */
2466   info = objfile->sym_stab_info;
2467
2468   DBX_TEXT_ADDR (objfile) = textaddr;
2469   DBX_TEXT_SIZE (objfile) = textsize;
2470
2471 #define COFF_STABS_SYMBOL_SIZE  12      /* XXX FIXME XXX */
2472   DBX_SYMBOL_SIZE (objfile) = COFF_STABS_SYMBOL_SIZE;
2473   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2474
2475   if (stabstrsize > bfd_get_size (sym_bfd))
2476     error ("ridiculous string table size: %d bytes", stabstrsize);
2477   DBX_STRINGTAB (objfile) = (char *)
2478     obstack_alloc (&objfile->psymbol_obstack, stabstrsize + 1);
2479   OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
2480
2481   /* Now read in the string table in one big gulp.  */
2482
2483   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
2484   if (val < 0)
2485     perror_with_name (name);
2486   val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2487   if (val != stabstrsize)
2488     perror_with_name (name);
2489
2490   stabsread_new_init ();
2491   buildsym_new_init ();
2492   free_header_files ();
2493   init_header_files ();
2494
2495   processing_acc_compilation = 1;
2496
2497   /* In a coff file, we've already installed the minimal symbols that came
2498      from the coff (non-stab) symbol table, so always act like an
2499      incremental load here. */
2500   if (stabsects->next == NULL)
2501     {
2502       stabsize = bfd_section_size (sym_bfd, stabsects->section);
2503       DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2504       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
2505     }
2506   else
2507     {
2508       struct stab_section_list *stabsect;
2509
2510       DBX_SYMCOUNT (objfile) = 0;
2511       for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next)
2512         {
2513           stabsize = bfd_section_size (sym_bfd, stabsect->section);
2514           DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile);
2515         }
2516
2517       DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
2518
2519       symbuf_sections = stabsects->next;
2520       symbuf_left = bfd_section_size (sym_bfd, stabsects->section);
2521       symbuf_read = 0;
2522     }
2523
2524   dbx_symfile_read (objfile, 0);
2525 }
2526 \f
2527 /* Scan and build partial symbols for an ELF symbol file.
2528    This ELF file has already been processed to get its minimal symbols,
2529    and any DWARF symbols that were in it.
2530
2531    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2532    rolled into one.
2533
2534    OBJFILE is the object file we are reading symbols from.
2535    ADDR is the address relative to which the symbols are (e.g.
2536    the base address of the text segment).
2537    MAINLINE is true if we are reading the main symbol
2538    table (as opposed to a shared lib or dynamically loaded file).
2539    STABOFFSET and STABSIZE define the location in OBJFILE where the .stab
2540    section exists.
2541    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2542    .stabstr section exists.
2543
2544    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2545    adjusted for elf details. */
2546
2547 void
2548 elfstab_build_psymtabs (struct objfile *objfile, int mainline,
2549                         file_ptr staboffset, unsigned int stabsize,
2550                         file_ptr stabstroffset, unsigned int stabstrsize)
2551 {
2552   int val;
2553   bfd *sym_bfd = objfile->obfd;
2554   char *name = bfd_get_filename (sym_bfd);
2555   struct dbx_symfile_info *info;
2556
2557   /* There is already a dbx_symfile_info allocated by our caller.
2558      It might even contain some info from the ELF symtab to help us.  */
2559   info = objfile->sym_stab_info;
2560
2561   /* Find the first and last text address.  dbx_symfile_read seems to
2562      want this.  */
2563   find_text_range (sym_bfd, objfile);
2564
2565 #define ELF_STABS_SYMBOL_SIZE   12      /* XXX FIXME XXX */
2566   DBX_SYMBOL_SIZE (objfile) = ELF_STABS_SYMBOL_SIZE;
2567   DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2568   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2569   DBX_SYMTAB_OFFSET (objfile) = staboffset;
2570
2571   if (stabstrsize > bfd_get_size (sym_bfd))
2572     error ("ridiculous string table size: %d bytes", stabstrsize);
2573   DBX_STRINGTAB (objfile) = (char *)
2574     obstack_alloc (&objfile->psymbol_obstack, stabstrsize + 1);
2575   OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
2576
2577   /* Now read in the string table in one big gulp.  */
2578
2579   val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
2580   if (val < 0)
2581     perror_with_name (name);
2582   val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2583   if (val != stabstrsize)
2584     perror_with_name (name);
2585
2586   stabsread_new_init ();
2587   buildsym_new_init ();
2588   free_header_files ();
2589   init_header_files ();
2590   install_minimal_symbols (objfile);
2591
2592   processing_acc_compilation = 1;
2593
2594   /* In an elf file, we've already installed the minimal symbols that came
2595      from the elf (non-stab) symbol table, so always act like an
2596      incremental load here. */
2597   dbx_symfile_read (objfile, 0);
2598 }
2599 \f
2600 /* Scan and build partial symbols for a file with special sections for stabs
2601    and stabstrings.  The file has already been processed to get its minimal
2602    symbols, and any other symbols that might be necessary to resolve GSYMs.
2603
2604    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2605    rolled into one.
2606
2607    OBJFILE is the object file we are reading symbols from.
2608    ADDR is the address relative to which the symbols are (e.g. the base address
2609    of the text segment).
2610    MAINLINE is true if we are reading the main symbol table (as opposed to a
2611    shared lib or dynamically loaded file).
2612    STAB_NAME is the name of the section that contains the stabs.
2613    STABSTR_NAME is the name of the section that contains the stab strings.
2614
2615    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
2616
2617 void
2618 stabsect_build_psymtabs (struct objfile *objfile, int mainline, char *stab_name,
2619                          char *stabstr_name, char *text_name)
2620 {
2621   int val;
2622   bfd *sym_bfd = objfile->obfd;
2623   char *name = bfd_get_filename (sym_bfd);
2624   asection *stabsect;
2625   asection *stabstrsect;
2626   asection *text_sect;
2627
2628   stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
2629   stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
2630
2631   if (!stabsect)
2632     return;
2633
2634   if (!stabstrsect)
2635     error ("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)",
2636            stab_name, stabstr_name);
2637
2638   objfile->sym_stab_info = (struct dbx_symfile_info *)
2639     xmalloc (sizeof (struct dbx_symfile_info));
2640   memset (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
2641
2642   text_sect = bfd_get_section_by_name (sym_bfd, text_name);
2643   if (!text_sect)
2644     error ("Can't find %s section in symbol file", text_name);
2645   DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
2646   DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
2647
2648   DBX_SYMBOL_SIZE (objfile) = sizeof (struct external_nlist);
2649   DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
2650     / DBX_SYMBOL_SIZE (objfile);
2651   DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect);
2652   DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos;      /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
2653
2654   if (DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
2655     error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
2656   DBX_STRINGTAB (objfile) = (char *)
2657     obstack_alloc (&objfile->psymbol_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
2658   OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile) + 1);
2659
2660   /* Now read in the string table in one big gulp.  */
2661
2662   val = bfd_get_section_contents (sym_bfd,      /* bfd */
2663                                   stabstrsect,  /* bfd section */
2664                                   DBX_STRINGTAB (objfile),      /* input buffer */
2665                                   0,    /* offset into section */
2666                                   DBX_STRINGTAB_SIZE (objfile));        /* amount to read */
2667
2668   if (!val)
2669     perror_with_name (name);
2670
2671   stabsread_new_init ();
2672   buildsym_new_init ();
2673   free_header_files ();
2674   init_header_files ();
2675   install_minimal_symbols (objfile);
2676
2677   /* Now, do an incremental load */
2678
2679   processing_acc_compilation = 1;
2680   dbx_symfile_read (objfile, 0);
2681 }
2682 \f
2683 static struct sym_fns aout_sym_fns =
2684 {
2685   bfd_target_aout_flavour,
2686   dbx_new_init,                 /* sym_new_init: init anything gbl to entire symtab */
2687   dbx_symfile_init,             /* sym_init: read initial info, setup for sym_read() */
2688   dbx_symfile_read,             /* sym_read: read a symbol file into symtab */
2689   dbx_symfile_finish,           /* sym_finish: finished with file, cleanup */
2690   default_symfile_offsets,      /* sym_offsets: parse user's offsets to internal form */
2691   NULL                          /* next: pointer to next struct sym_fns */
2692 };
2693
2694 void
2695 _initialize_dbxread (void)
2696 {
2697   add_symtab_fns (&aout_sym_fns);
2698 }