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