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