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