* dbxread.c (read_ofile_symtab): Remove "#if 1" around code to
[external/binutils.git] / gdb / dbxread.c
1 /* Read dbx symbol tables and convert to internal format, for GDB.
2    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993
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., 675 Mass Ave, Cambridge, MA 02139, 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 <string.h>
37
38 #if defined(USG) || defined(__CYGNUSCLIB__)
39 #include <sys/types.h>
40 #include <fcntl.h>
41 #define L_SET 0
42 #define L_INCR 1
43 #endif
44
45 #include <obstack.h>
46 #include <sys/param.h>
47 #ifndef NO_SYS_FILE
48 #include <sys/file.h>
49 #endif
50 #include <sys/stat.h>
51 #include <ctype.h>
52 #include "symtab.h"
53 #include "breakpoint.h"
54 #include "command.h"
55 #include "target.h"
56 #include "gdbcore.h"            /* for bfd stuff */
57 #include "libbfd.h"             /* FIXME Secret internal BFD stuff (bfd_read) */
58 #include "libaout.h"            /* FIXME Secret internal BFD stuff for a.out */
59 #include "symfile.h"
60 #include "objfiles.h"
61 #include "buildsym.h"
62 #include "stabsread.h"
63 #include "gdb-stabs.h"
64 #include "demangle.h"
65 #include "language.h"           /* Needed inside partial-stab.h */
66 #include "complaints.h"
67
68 #include "aout/aout64.h"
69 #include "aout/stab_gnu.h"      /* We always use GNU stabs, not native, now */
70
71 /* Each partial symbol table entry contains a pointer to private data for the
72    read_symtab() function to use when expanding a partial symbol table entry
73    to a full symbol table entry.
74
75    For dbxread this structure contains the offset within the file symbol table
76    of first local symbol for this file, and length (in bytes) of the section
77    of the symbol table devoted to this file's symbols (actually, the section
78    bracketed may contain more than just this file's symbols).  It also contains
79    further information needed to locate the symbols if they are in an ELF file.
80
81    If ldsymlen is 0, the only reason for this thing's existence is the
82    dependency list.  Nothing else will happen when it is read in.  */
83
84 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
85 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
86 #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
87 #define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
88 #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
89 #define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
90 #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset)
91
92 struct symloc {
93   int ldsymoff;
94   int ldsymlen;
95   int symbol_size;
96   int symbol_offset;
97   int string_offset;
98   int file_string_offset;
99 };
100
101 /* Macro to determine which symbols to ignore when reading the first symbol
102    of a file.  Some machines override this definition. */
103 #ifndef IGNORE_SYMBOL
104 /* This code is used on Ultrix systems.  Ignore it */
105 #define IGNORE_SYMBOL(type)  (type == (int)N_NSYMS)
106 #endif
107
108 /* Macro for name of symbol to indicate a file compiled with gcc. */
109 #ifndef GCC_COMPILED_FLAG_SYMBOL
110 #define GCC_COMPILED_FLAG_SYMBOL "gcc_compiled."
111 #endif
112
113 /* Macro for name of symbol to indicate a file compiled with gcc2. */
114 #ifndef GCC2_COMPILED_FLAG_SYMBOL
115 #define GCC2_COMPILED_FLAG_SYMBOL "gcc2_compiled."
116 #endif
117
118 /* Define this as 1 if a pcc declaration of a char or short argument
119    gives the correct address.  Otherwise assume pcc gives the
120    address of the corresponding int, which is not the same on a
121    big-endian machine.  */
122
123 #ifndef BELIEVE_PCC_PROMOTION
124 #define BELIEVE_PCC_PROMOTION 0
125 #endif
126
127 /* Remember what we deduced to be the source language of this psymtab. */
128
129 static enum language psymtab_language = language_unknown;
130
131 /* Nonzero means give verbose info on gdb action.  From main.c.  */
132 extern int info_verbose;
133
134 /* The BFD for this file -- implicit parameter to next_symbol_text.  */
135
136 static bfd *symfile_bfd;
137
138 /* The size of each symbol in the symbol file (in external form).
139    This is set by dbx_symfile_read when building psymtabs, and by
140    dbx_psymtab_to_symtab when building symtabs.  */
141
142 static unsigned symbol_size;
143
144 /* This is the offset of the symbol table in the executable file */
145 static unsigned symbol_table_offset;
146
147 /* This is the offset of the string table in the executable file */
148 static unsigned string_table_offset;
149
150 /* For elf+stab executables, the n_strx field is not a simple index
151    into the string table.  Instead, each .o file has a base offset
152    in the string table, and the associated symbols contain offsets
153    from this base.  The following two variables contain the base
154    offset for the current and next .o files. */
155 static unsigned int file_string_table_offset;
156 static unsigned int next_file_string_table_offset;
157
158 /* Complaints about the symbols we have encountered.  */
159
160 struct complaint lbrac_complaint = 
161   {"bad block start address patched", 0, 0};
162
163 struct complaint string_table_offset_complaint =
164   {"bad string table offset in symbol %d", 0, 0};
165
166 struct complaint unknown_symtype_complaint =
167   {"unknown symbol type %s", 0, 0};
168
169 struct complaint unknown_symchar_complaint =
170   {"unknown symbol type character `%c'", 0, 0};
171
172 struct complaint lbrac_rbrac_complaint =
173   {"block start larger than block end", 0, 0};
174
175 struct complaint lbrac_unmatched_complaint =
176   {"unmatched N_LBRAC before symtab pos %d", 0, 0};
177
178 struct complaint lbrac_mismatch_complaint =
179   {"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
180
181 struct complaint repeated_header_complaint =
182   {"\"repeated\" header file not previously seen, at symtab pos %d", 0, 0};
183
184 struct complaint repeated_header_name_complaint =
185   {"\"repeated\" header file not previously seen, named %s", 0, 0};
186 \f
187 /* During initial symbol readin, we need to have a structure to keep
188    track of which psymtabs have which bincls in them.  This structure
189    is used during readin to setup the list of dependencies within each
190    partial symbol table. */
191
192 struct header_file_location
193 {
194   char *name;                   /* Name of header file */
195   int instance;                 /* See above */
196   struct partial_symtab *pst;   /* Partial symtab that has the
197                                    BINCL/EINCL defs for this file */
198 };
199
200 /* The actual list and controling variables */
201 static struct header_file_location *bincl_list, *next_bincl;
202 static int bincls_allocated;
203
204 /* Local function prototypes */
205
206 static void
207 free_header_files PARAMS ((void));
208
209 static void
210 init_header_files PARAMS ((void));
211
212 static struct pending *
213 copy_pending PARAMS ((struct pending *, int, struct pending *));
214
215 static struct symtab *
216 read_ofile_symtab PARAMS ((struct objfile *, int, int, CORE_ADDR, int, 
217                            struct section_offsets *));
218
219 static void
220 dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *));
221
222 static void
223 dbx_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
224
225 static void
226 read_dbx_symtab PARAMS ((struct section_offsets *, struct objfile *,
227                          CORE_ADDR, int));
228
229 static void
230 free_bincl_list PARAMS ((struct objfile *));
231
232 static struct partial_symtab *
233 find_corresponding_bincl_psymtab PARAMS ((char *, int));
234
235 static void
236 add_bincl_to_list PARAMS ((struct partial_symtab *, char *, int));
237
238 static void
239 init_bincl_list PARAMS ((int, struct objfile *));
240
241 static void
242 init_psymbol_list PARAMS ((struct objfile *));
243
244 static char *
245 dbx_next_symbol_text PARAMS ((void));
246
247 static void
248 fill_symbuf PARAMS ((bfd *));
249
250 static void
251 dbx_symfile_init PARAMS ((struct objfile *));
252
253 static void
254 dbx_new_init PARAMS ((struct objfile *));
255
256 static void
257 dbx_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
258
259 static void
260 dbx_symfile_finish PARAMS ((struct objfile *));
261
262 static void
263 record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *));
264
265 static void
266 add_new_header_file PARAMS ((char *, int));
267
268 static void
269 add_old_header_file PARAMS ((char *, int));
270
271 static void
272 add_this_object_header_file PARAMS ((int));
273
274 /* Free up old header file tables */
275
276 static void
277 free_header_files ()
278 {
279   register int i;
280
281   if (header_files != NULL)
282     {
283       for (i = 0; i < n_header_files; i++)
284         {
285           free (header_files[i].name);
286         }
287       free ((PTR)header_files);
288       header_files = NULL;
289       n_header_files = 0;
290     }
291   if (this_object_header_files)
292     {
293       free ((PTR)this_object_header_files);
294       this_object_header_files = NULL;
295     }
296   n_allocated_header_files = 0;
297   n_allocated_this_object_header_files = 0;
298 }
299
300 /* Allocate new header file tables */
301
302 static void
303 init_header_files ()
304 {
305   n_header_files = 0;
306   n_allocated_header_files = 10;
307   header_files = (struct header_file *)
308     xmalloc (10 * sizeof (struct header_file));
309
310   n_allocated_this_object_header_files = 10;
311   this_object_header_files = (int *) xmalloc (10 * sizeof (int));
312 }
313
314 /* Add header file number I for this object file
315    at the next successive FILENUM.  */
316
317 static void
318 add_this_object_header_file (i)
319      int i;
320 {
321   if (n_this_object_header_files == n_allocated_this_object_header_files)
322     {
323       n_allocated_this_object_header_files *= 2;
324       this_object_header_files
325         = (int *) xrealloc ((char *) this_object_header_files,
326                             n_allocated_this_object_header_files * sizeof (int));
327     }
328
329   this_object_header_files[n_this_object_header_files++] = i;
330 }
331
332 /* Add to this file an "old" header file, one already seen in
333    a previous object file.  NAME is the header file's name.
334    INSTANCE is its instance code, to select among multiple
335    symbol tables for the same header file.  */
336
337 static void
338 add_old_header_file (name, instance)
339      char *name;
340      int instance;
341 {
342   register struct header_file *p = header_files;
343   register int i;
344
345   for (i = 0; i < n_header_files; i++)
346     if (STREQ (p[i].name, name) && instance == p[i].instance)
347       {
348         add_this_object_header_file (i);
349         return;
350       }
351   complain (&repeated_header_complaint, symnum);
352   complain (&repeated_header_name_complaint, name);
353 }
354
355 /* Add to this file a "new" header file: definitions for its types follow.
356    NAME is the header file's name.
357    Most often this happens only once for each distinct header file,
358    but not necessarily.  If it happens more than once, INSTANCE has
359    a different value each time, and references to the header file
360    use INSTANCE values to select among them.
361
362    dbx output contains "begin" and "end" markers for each new header file,
363    but at this level we just need to know which files there have been;
364    so we record the file when its "begin" is seen and ignore the "end".  */
365
366 static void
367 add_new_header_file (name, instance)
368      char *name;
369      int instance;
370 {
371   register int i;
372
373   /* Make sure there is room for one more header file.  */
374
375   if (n_header_files == n_allocated_header_files)
376     {
377       n_allocated_header_files *= 2;
378       header_files = (struct header_file *)
379         xrealloc ((char *) header_files,
380                   (n_allocated_header_files * sizeof (struct header_file)));
381     }
382
383   /* Create an entry for this header file.  */
384
385   i = n_header_files++;
386   header_files[i].name = savestring (name, strlen(name));
387   header_files[i].instance = instance;
388   header_files[i].length = 10;
389   header_files[i].vector
390     = (struct type **) xmalloc (10 * sizeof (struct type *));
391   memset (header_files[i].vector, 0, 10 * sizeof (struct type *));
392
393   add_this_object_header_file (i);
394 }
395
396 #if 0
397 static struct type **
398 explicit_lookup_type (real_filenum, index)
399      int real_filenum, index;
400 {
401   register struct header_file *f = &header_files[real_filenum];
402
403   if (index >= f->length)
404     {
405       f->length *= 2;
406       f->vector = (struct type **)
407         xrealloc (f->vector, f->length * sizeof (struct type *));
408       bzero (&f->vector[f->length / 2],
409              f->length * sizeof (struct type *) / 2);
410     }
411   return &f->vector[index];
412 }
413 #endif
414 \f
415 static void
416 record_minimal_symbol (name, address, type, objfile)
417      char *name;
418      CORE_ADDR address;
419      int type;
420      struct objfile *objfile;
421 {
422   enum minimal_symbol_type ms_type;
423
424   switch (type &~ N_EXT) {
425     case N_TEXT:  ms_type = mst_text; break;
426     case N_DATA:  ms_type = mst_data; break;
427     case N_BSS:   ms_type = mst_bss;  break;
428     case N_ABS:   ms_type = mst_abs;  break;
429 #ifdef N_SETV
430     case N_SETV:  ms_type = mst_data; break;
431 #endif
432     default:      ms_type = mst_unknown; break;
433   }
434
435   prim_record_minimal_symbol (obsavestring (name, strlen (name), &objfile -> symbol_obstack),
436                              address, ms_type);
437 }
438 \f
439 /* Scan and build partial symbols for a symbol file.
440    We have been initialized by a call to dbx_symfile_init, which 
441    put all the relevant info into a "struct dbx_symfile_info",
442    hung off the objfile structure.
443
444    SECTION_OFFSETS contains offsets relative to which the symbols in the
445    various sections are (depending where the sections were actually loaded).
446    MAINLINE is true if we are reading the main symbol
447    table (as opposed to a shared lib or dynamically loaded file).  */
448
449 static void
450 dbx_symfile_read (objfile, section_offsets, mainline)
451      struct objfile *objfile;
452      struct section_offsets *section_offsets;
453      int mainline;      /* FIXME comments above */
454 {
455   bfd *sym_bfd;
456   int val;
457
458   sym_bfd = objfile->obfd;
459   val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
460   if (val < 0)
461     perror_with_name (objfile->name);
462
463   /* If we are reinitializing, or if we have never loaded syms yet, init */
464   if (mainline || objfile->global_psymbols.size == 0 || objfile->static_psymbols.size == 0)
465     init_psymbol_list (objfile);
466
467   symbol_size = DBX_SYMBOL_SIZE (objfile);
468   symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
469
470   pending_blocks = 0;
471   make_cleanup (really_free_pendings, 0);
472
473   init_minimal_symbol_collection ();
474   make_cleanup (discard_minimal_symbols, 0);
475
476   /* Now that the symbol table data of the executable file are all in core,
477      process them and define symbols accordingly.  */
478
479   read_dbx_symtab (section_offsets, objfile,
480                    bfd_section_vma  (sym_bfd, DBX_TEXT_SECT (objfile)),
481                    bfd_section_size (sym_bfd, DBX_TEXT_SECT (objfile)));
482
483   /* Install any minimal symbols that have been collected as the current
484      minimal symbols for this objfile. */
485
486   install_minimal_symbols (objfile);
487
488   if (!have_partial_symbols ()) {
489     wrap_here ("");
490     printf_filtered ("(no debugging symbols found)...");
491     wrap_here ("");
492   }
493 }
494
495 /* Initialize anything that needs initializing when a completely new
496    symbol file is specified (not just adding some symbols from another
497    file, e.g. a shared library).  */
498
499 static void
500 dbx_new_init (ignore)
501      struct objfile *ignore;
502 {
503   stabsread_new_init ();
504   buildsym_new_init ();
505   init_header_files ();
506 }
507
508
509 /* dbx_symfile_init ()
510    is the dbx-specific initialization routine for reading symbols.
511    It is passed a struct objfile which contains, among other things,
512    the BFD for the file whose symbols are being read, and a slot for a pointer
513    to "private data" which we fill with goodies.
514
515    We read the string table into malloc'd space and stash a pointer to it.
516
517    Since BFD doesn't know how to read debug symbols in a format-independent
518    way (and may never do so...), we have to do it ourselves.  We will never
519    be called unless this is an a.out (or very similar) file. 
520    FIXME, there should be a cleaner peephole into the BFD environment here.  */
521
522 #define DBX_STRINGTAB_SIZE_SIZE sizeof(long)   /* FIXME */
523
524 static void
525 dbx_symfile_init (objfile)
526      struct objfile *objfile;
527 {
528   int val;
529   bfd *sym_bfd = objfile->obfd;
530   char *name = bfd_get_filename (sym_bfd);
531   unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
532
533   /* Allocate struct to keep track of the symfile */
534   objfile->sym_private = (PTR)
535     xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
536
537   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
538 #define STRING_TABLE_OFFSET     (sym_bfd->origin + obj_str_filepos (sym_bfd))
539 #define SYMBOL_TABLE_OFFSET     (sym_bfd->origin + obj_sym_filepos (sym_bfd))
540
541   /* FIXME POKING INSIDE BFD DATA STRUCTURES */
542
543   DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
544   DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
545   if (!DBX_TEXT_SECT (objfile))
546     error ("Can't find .text section in symbol file");
547
548   DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
549   DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
550   DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
551
552   /* Read the string table and stash it away in the psymbol_obstack.  It is
553      only needed as long as we need to expand psymbols into full symbols,
554      so when we blow away the psymbol the string table goes away as well.
555      Note that gdb used to use the results of attempting to malloc the
556      string table, based on the size it read, as a form of sanity check
557      for botched byte swapping, on the theory that a byte swapped string
558      table size would be so totally bogus that the malloc would fail.  Now
559      that we put in on the psymbol_obstack, we can't do this since gdb gets
560      a fatal error (out of virtual memory) if the size is bogus.  We can
561      however at least check to see if the size is less than the size of
562      the size field itself, or larger than the size of the entire file.
563      Note that all valid string tables have a size greater than zero, since
564      the bytes used to hold the size are included in the count. */
565
566   if (STRING_TABLE_OFFSET == 0)
567     {
568       /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
569          will never be zero, even when there is no string table.  This
570          would appear to be a bug in bfd. */
571       DBX_STRINGTAB_SIZE (objfile) = 0;
572       DBX_STRINGTAB (objfile) = NULL;
573     }
574   else
575     {
576       val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
577       if (val < 0)
578         perror_with_name (name);
579       
580       memset ((PTR) size_temp, 0, sizeof (size_temp));
581       val = bfd_read ((PTR) size_temp, sizeof (size_temp), 1, sym_bfd);
582       if (val < 0)
583         {
584           perror_with_name (name);
585         }
586       else if (val == 0)
587         {
588           /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
589              EOF if there is no string table, and attempting to read the size
590              from EOF will read zero bytes. */
591           DBX_STRINGTAB_SIZE (objfile) = 0;
592           DBX_STRINGTAB (objfile) = NULL;
593         }
594       else
595         {
596           /* Read some data that would appear to be the string table size.
597              If there really is a string table, then it is probably the right
598              size.  Byteswap if necessary and validate the size.  Note that
599              the minimum is DBX_STRINGTAB_SIZE_SIZE.  If we just read some
600              random data that happened to be at STRING_TABLE_OFFSET, because
601              bfd can't tell us there is no string table, the sanity checks may
602              or may not catch this. */
603           DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
604           
605           if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
606               || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
607             error ("ridiculous string table size (%d bytes).",
608                    DBX_STRINGTAB_SIZE (objfile));
609           
610           DBX_STRINGTAB (objfile) =
611             (char *) obstack_alloc (&objfile -> psymbol_obstack,
612                                     DBX_STRINGTAB_SIZE (objfile));
613           
614           /* Now read in the string table in one big gulp.  */
615           
616           val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
617           if (val < 0)
618             perror_with_name (name);
619           val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
620                           sym_bfd);
621           if (val != DBX_STRINGTAB_SIZE (objfile))
622             perror_with_name (name);
623         }
624     }
625 }
626
627 /* Perform any local cleanups required when we are done with a particular
628    objfile.  I.E, we are in the process of discarding all symbol information
629    for an objfile, freeing up all memory held for it, and unlinking the
630    objfile struct from the global list of known objfiles. */
631
632 static void
633 dbx_symfile_finish (objfile)
634      struct objfile *objfile;
635 {
636   if (objfile->sym_private != NULL)
637     {
638       mfree (objfile -> md, objfile->sym_private);
639     }
640   free_header_files ();
641 }
642
643 \f
644 /* Buffer for reading the symbol table entries.  */
645 static struct internal_nlist symbuf[4096];
646 static int symbuf_idx;
647 static int symbuf_end;
648
649 /* Name of last function encountered.  Used in Solaris to approximate
650    object file boundaries.  */
651 static char *last_function_name;
652
653 /* The address in memory of the string table of the object file we are
654    reading (which might not be the "main" object file, but might be a
655    shared library or some other dynamically loaded thing).  This is set
656    by read_dbx_symtab when building psymtabs, and by read_ofile_symtab 
657    when building symtabs, and is used only by next_symbol_text.  */
658 static char *stringtab_global;
659
660 /* Refill the symbol table input buffer
661    and set the variables that control fetching entries from it.
662    Reports an error if no data available.
663    This function can read past the end of the symbol table
664    (into the string table) but this does no harm.  */
665
666 static void
667 fill_symbuf (sym_bfd)
668      bfd *sym_bfd;
669 {
670   int nbytes = bfd_read ((PTR)symbuf, sizeof (symbuf), 1, sym_bfd);
671   if (nbytes < 0)
672     perror_with_name (bfd_get_filename (sym_bfd));
673   else if (nbytes == 0)
674     error ("Premature end of file reading symbol table");
675   symbuf_end = nbytes / symbol_size;
676   symbuf_idx = 0;
677 }
678
679 #define SWAP_SYMBOL(symp, abfd) \
680   { \
681     (symp)->n_strx = bfd_h_get_32(abfd,                 \
682                                 (unsigned char *)&(symp)->n_strx);      \
683     (symp)->n_desc = bfd_h_get_16 (abfd,                        \
684                                 (unsigned char *)&(symp)->n_desc);      \
685     (symp)->n_value = bfd_h_get_32 (abfd,                       \
686                                 (unsigned char *)&(symp)->n_value);     \
687   }
688
689 /* Invariant: The symbol pointed to by symbuf_idx is the first one
690    that hasn't been swapped.  Swap the symbol at the same time
691    that symbuf_idx is incremented.  */
692
693 /* dbx allows the text of a symbol name to be continued into the
694    next symbol name!  When such a continuation is encountered
695    (a \ at the end of the text of a name)
696    call this function to get the continuation.  */
697
698 static char *
699 dbx_next_symbol_text ()
700 {
701   if (symbuf_idx == symbuf_end)
702     fill_symbuf (symfile_bfd);
703   symnum++;
704   SWAP_SYMBOL(&symbuf[symbuf_idx], symfile_bfd);
705   return symbuf[symbuf_idx++].n_strx + stringtab_global
706           + file_string_table_offset;
707 }
708 \f
709 /* Initializes storage for all of the partial symbols that will be
710    created by read_dbx_symtab and subsidiaries.  */
711
712 static void
713 init_psymbol_list (objfile)
714      struct objfile *objfile;
715 {
716   /* Free any previously allocated psymbol lists.  */
717   if (objfile -> global_psymbols.list)
718     mfree (objfile -> md, (PTR)objfile -> global_psymbols.list);
719   if (objfile -> static_psymbols.list)
720     mfree (objfile -> md, (PTR)objfile -> static_psymbols.list);
721
722   /* Current best guess is that there are approximately a twentieth
723      of the total symbols (in a debugging file) are global or static
724      oriented symbols */
725   objfile -> global_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
726   objfile -> static_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
727   objfile -> global_psymbols.next = objfile -> global_psymbols.list = (struct partial_symbol *)
728     xmmalloc (objfile -> md, objfile -> global_psymbols.size * sizeof (struct partial_symbol));
729   objfile -> static_psymbols.next = objfile -> static_psymbols.list = (struct partial_symbol *)
730     xmmalloc (objfile -> md, objfile -> static_psymbols.size * sizeof (struct partial_symbol));
731 }
732
733 /* Initialize the list of bincls to contain none and have some
734    allocated.  */
735
736 static void
737 init_bincl_list (number, objfile)
738      int number;
739      struct objfile *objfile;
740 {
741   bincls_allocated = number;
742   next_bincl = bincl_list = (struct header_file_location *)
743     xmmalloc (objfile -> md, bincls_allocated * sizeof(struct header_file_location));
744 }
745
746 /* Add a bincl to the list.  */
747
748 static void
749 add_bincl_to_list (pst, name, instance)
750      struct partial_symtab *pst;
751      char *name;
752      int instance;
753 {
754   if (next_bincl >= bincl_list + bincls_allocated)
755     {
756       int offset = next_bincl - bincl_list;
757       bincls_allocated *= 2;
758       bincl_list = (struct header_file_location *)
759         xmrealloc (pst->objfile->md, (char *)bincl_list,
760                   bincls_allocated * sizeof (struct header_file_location));
761       next_bincl = bincl_list + offset;
762     }
763   next_bincl->pst = pst;
764   next_bincl->instance = instance;
765   next_bincl++->name = name;
766 }
767
768 /* Given a name, value pair, find the corresponding
769    bincl in the list.  Return the partial symtab associated
770    with that header_file_location.  */
771
772 static struct partial_symtab *
773 find_corresponding_bincl_psymtab (name, instance)
774      char *name;
775      int instance;
776 {
777   struct header_file_location *bincl;
778
779   for (bincl = bincl_list; bincl < next_bincl; bincl++)
780     if (bincl->instance == instance
781         && STREQ (name, bincl->name))
782       return bincl->pst;
783
784   return (struct partial_symtab *) 0;
785 }
786
787 /* Free the storage allocated for the bincl list.  */
788
789 static void
790 free_bincl_list (objfile)
791      struct objfile *objfile;
792 {
793   mfree (objfile -> md, (PTR)bincl_list);
794   bincls_allocated = 0;
795 }
796
797 /* Given pointers to an a.out symbol table in core containing dbx
798    style data, setup partial_symtab's describing each source file for
799    which debugging information is available.
800    SYMFILE_NAME is the name of the file we are reading from
801    and SECTION_OFFSETS is the set of offsets for the various sections
802    of the file (a set of zeros if the mainline program).  */
803
804 static void
805 read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
806      struct section_offsets *section_offsets;
807      struct objfile *objfile;
808      CORE_ADDR text_addr;
809      int text_size;
810 {
811   register struct internal_nlist *bufp = 0;     /* =0 avoids gcc -Wall glitch */
812   register char *namestring;
813   int nsl;
814   int past_first_source_file = 0;
815   CORE_ADDR last_o_file_start = 0;
816   struct cleanup *old_chain;
817   bfd *abfd;
818
819   /* End of the text segment of the executable file.  */
820   CORE_ADDR end_of_text_addr;
821
822   /* Current partial symtab */
823   struct partial_symtab *pst;
824
825   /* List of current psymtab's include files */
826   char **psymtab_include_list;
827   int includes_allocated;
828   int includes_used;
829
830   /* Index within current psymtab dependency list */
831   struct partial_symtab **dependency_list;
832   int dependencies_used, dependencies_allocated;
833
834   /* FIXME.  We probably want to change stringtab_global rather than add this
835      while processing every symbol entry.  FIXME.  */
836   file_string_table_offset = 0;
837   next_file_string_table_offset = 0;
838
839   stringtab_global = DBX_STRINGTAB (objfile);
840   
841   pst = (struct partial_symtab *) 0;
842
843   includes_allocated = 30;
844   includes_used = 0;
845   psymtab_include_list = (char **) alloca (includes_allocated *
846                                            sizeof (char *));
847
848   dependencies_allocated = 30;
849   dependencies_used = 0;
850   dependency_list =
851     (struct partial_symtab **) alloca (dependencies_allocated *
852                                        sizeof (struct partial_symtab *));
853
854   old_chain = make_cleanup (free_objfile, objfile);
855
856   /* Init bincl list */
857   init_bincl_list (20, objfile);
858   make_cleanup (free_bincl_list, objfile);
859
860   last_source_file = NULL;
861
862 #ifdef END_OF_TEXT_DEFAULT
863   end_of_text_addr = END_OF_TEXT_DEFAULT;
864 #else
865   end_of_text_addr = text_addr + section_offsets->offsets[SECT_OFF_TEXT]
866                                + text_size;     /* Relocate */
867 #endif
868
869   symfile_bfd = objfile->obfd;  /* For next_text_symbol */
870   abfd = objfile->obfd;
871   symbuf_end = symbuf_idx = 0;
872   next_symbol_text_func = dbx_next_symbol_text;
873
874   for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
875     {
876       /* Get the symbol for this run and pull out some info */
877       QUIT;     /* allow this to be interruptable */
878       if (symbuf_idx == symbuf_end)
879         fill_symbuf (abfd);
880       bufp = &symbuf[symbuf_idx++];
881
882       /*
883        * Special case to speed up readin.
884        */
885       if (bufp->n_type == (unsigned char)N_SLINE) continue;
886
887       SWAP_SYMBOL (bufp, abfd);
888
889       /* Ok.  There is a lot of code duplicated in the rest of this
890          switch statement (for efficiency reasons).  Since I don't
891          like duplicating code, I will do my penance here, and
892          describe the code which is duplicated:
893
894          *) The assignment to namestring.
895          *) The call to strchr.
896          *) The addition of a partial symbol the the two partial
897             symbol lists.  This last is a large section of code, so
898             I've imbedded it in the following macro.
899          */
900       
901 /* Set namestring based on bufp.  If the string table index is invalid, 
902    give a fake name, and print a single error message per symbol file read,
903    rather than abort the symbol reading or flood the user with messages.  */
904
905 /*FIXME: Too many adds and indirections in here for the inner loop.  */
906 #define SET_NAMESTRING()\
907   if (((unsigned)bufp->n_strx + file_string_table_offset) >=            \
908       DBX_STRINGTAB_SIZE (objfile)) {                                   \
909     complain (&string_table_offset_complaint, symnum);                  \
910     namestring = "foo";                                                 \
911   } else                                                                \
912     namestring = bufp->n_strx + file_string_table_offset +              \
913                  DBX_STRINGTAB (objfile)
914
915 #define CUR_SYMBOL_TYPE bufp->n_type
916 #define CUR_SYMBOL_VALUE bufp->n_value
917 #define DBXREAD_ONLY
918 #define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms)\
919   start_psymtab(ofile, secoff, fname, low, symoff, global_syms, static_syms)
920 #define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps)\
921   end_psymtab(pst,ilist,ninc,c_off,c_text,dep_list,n_deps)
922
923 #include "partial-stab.h"
924     }
925
926   /* If there's stuff to be cleaned up, clean it up.  */
927   if (DBX_SYMCOUNT (objfile) > 0                        /* We have some syms */
928 /*FIXME, does this have a bug at start address 0? */
929       && last_o_file_start
930       && objfile -> ei.entry_point < bufp->n_value
931       && objfile -> ei.entry_point >= last_o_file_start)
932     {
933       objfile -> ei.entry_file_lowpc = last_o_file_start;
934       objfile -> ei.entry_file_highpc = bufp->n_value;
935     }
936
937   if (pst)
938     {
939       end_psymtab (pst, psymtab_include_list, includes_used,
940                    symnum * symbol_size, end_of_text_addr,
941                    dependency_list, dependencies_used);
942     }
943
944   free_bincl_list (objfile);
945   discard_cleanups (old_chain);
946 }
947
948 /* Allocate and partially fill a partial symtab.  It will be
949    completely filled at the end of the symbol list.
950
951    SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
952    is the address relative to which its symbols are (incremental) or 0
953    (normal). */
954
955
956 struct partial_symtab *
957 start_psymtab (objfile, section_offsets,
958                filename, textlow, ldsymoff, global_syms, static_syms)
959      struct objfile *objfile;
960      struct section_offsets *section_offsets;
961      char *filename;
962      CORE_ADDR textlow;
963      int ldsymoff;
964      struct partial_symbol *global_syms;
965      struct partial_symbol *static_syms;
966 {
967   struct partial_symtab *result =
968       start_psymtab_common(objfile, section_offsets,
969                            filename, textlow, global_syms, static_syms);
970
971   result->read_symtab_private = (char *)
972     obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc));
973   LDSYMOFF(result) = ldsymoff;
974   result->read_symtab = dbx_psymtab_to_symtab;
975   SYMBOL_SIZE(result) = symbol_size;
976   SYMBOL_OFFSET(result) = symbol_table_offset;
977   STRING_OFFSET(result) = string_table_offset;
978   FILE_STRING_OFFSET(result) = file_string_table_offset;
979
980   /* If we're handling an ELF file, drag some section-relocation info
981      for this source file out of the ELF symbol table, to compensate for
982      Sun brain death.  This replaces the section_offsets in this psymtab,
983      if successful.  */
984   elfstab_offset_sections (objfile, result);
985
986   /* Deduce the source language from the filename for this psymtab. */
987   psymtab_language = deduce_language_from_filename (filename);
988
989   return result;
990 }
991
992 /* Close off the current usage of a partial_symbol table entry.  This
993    involves setting the correct number of includes (with a realloc),
994    setting the high text mark, setting the symbol length in the
995    executable, and setting the length of the global and static lists
996    of psymbols.
997
998    The global symbols and static symbols are then seperately sorted.
999
1000    Then the partial symtab is put on the global list.
1001    *** List variables and peculiarities of same. ***
1002    */
1003
1004 void
1005 end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
1006              capping_text, dependency_list, number_dependencies)
1007      struct partial_symtab *pst;
1008      char **include_list;
1009      int num_includes;
1010      int capping_symbol_offset;
1011      CORE_ADDR capping_text;
1012      struct partial_symtab **dependency_list;
1013      int number_dependencies;
1014 /*     struct partial_symbol *capping_global, *capping_static;*/
1015 {
1016   int i;
1017   struct partial_symtab *p1;
1018   struct objfile *objfile = pst -> objfile;
1019
1020   if (capping_symbol_offset != -1)
1021       LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
1022   pst->texthigh = capping_text;
1023
1024   /* Under Solaris, the N_SO symbols always have a value of 0,
1025      instead of the usual address of the .o file.  Therefore,
1026      we have to do some tricks to fill in texthigh and textlow.
1027      The first trick is in partial-stab.h: if we see a static
1028      or global function, and the textlow for the current pst
1029      is still 0, then we use that function's address for 
1030      the textlow of the pst.
1031
1032      Now, to fill in texthigh, we remember the last function seen
1033      in the .o file (also in partial-stab.h).  Also, there's a hack in
1034      bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
1035      to here via the misc_info field.  Therefore, we can fill in
1036      a reliable texthigh by taking the address plus size of the
1037      last function in the file.
1038
1039      Unfortunately, that does not cover the case where the last function
1040      in the file is static.  See the paragraph below for more comments
1041      on this situation.
1042
1043      Finally, if we have a valid textlow for the current file, we run
1044      down the partial_symtab_list filling in previous texthighs that
1045      are still unknown.  */
1046
1047   if (pst->texthigh == 0 && last_function_name) {
1048     char *p;
1049     int n;
1050     struct minimal_symbol *minsym;
1051
1052     p = strchr (last_function_name, ':');
1053     if (p == NULL)
1054       p = last_function_name;
1055     n = p - last_function_name;
1056     p = alloca (n + 1);
1057     strncpy (p, last_function_name, n);
1058     p[n] = 0;
1059     
1060     minsym = lookup_minimal_symbol (p, objfile);
1061
1062     if (minsym) {
1063       pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) +
1064         (int) MSYMBOL_INFO (minsym);
1065     } else {
1066       /* This file ends with a static function, and it's
1067          difficult to imagine how hard it would be to track down
1068          the elf symbol.  Luckily, most of the time no one will notice,
1069          since the next file will likely be compiled with -g, so
1070          the code below will copy the first fuction's start address 
1071          back to our texthigh variable.  (Also, if this file is the
1072          last one in a dynamically linked program, texthigh already
1073          has the right value.)  If the next file isn't compiled
1074          with -g, then the last function in this file winds up owning
1075          all of the text space up to the next -g file, or the end (minus
1076          shared libraries).  This only matters for single stepping,
1077          and even then it will still work, except that it will single
1078          step through all of the covered functions, instead of setting
1079          breakpoints around them as it usualy does.  This makes it
1080          pretty slow, but at least it doesn't fail.
1081
1082          We can fix this with a fairly big change to bfd, but we need
1083          to coordinate better with Cygnus if we want to do that.  FIXME.  */
1084     }
1085     last_function_name = NULL;
1086   }
1087
1088   /* this test will be true if the last .o file is only data */
1089   if (pst->textlow == 0)
1090     pst->textlow = pst->texthigh;
1091
1092   /* If we know our own starting text address, then walk through all other
1093      psymtabs for this objfile, and if any didn't know their ending text
1094      address, set it to our starting address.  Take care to not set our
1095      own ending address to our starting address, nor to set addresses on
1096      `dependency' files that have both textlow and texthigh zero.  */
1097   if (pst->textlow) {
1098     ALL_OBJFILE_PSYMTABS (objfile, p1) {
1099       if (p1->texthigh == 0  && p1->textlow != 0 && p1 != pst) {
1100         p1->texthigh = pst->textlow;
1101         /* if this file has only data, then make textlow match texthigh */
1102         if (p1->textlow == 0)
1103           p1->textlow = p1->texthigh;
1104       }
1105     }
1106   }
1107
1108   /* End of kludge for patching Solaris textlow and texthigh.  */
1109
1110
1111   pst->n_global_syms =
1112     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1113   pst->n_static_syms =
1114     objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1115
1116   pst->number_of_dependencies = number_dependencies;
1117   if (number_dependencies)
1118     {
1119       pst->dependencies = (struct partial_symtab **)
1120         obstack_alloc (&objfile->psymbol_obstack,
1121                        number_dependencies * sizeof (struct partial_symtab *));
1122       memcpy (pst->dependencies, dependency_list,
1123              number_dependencies * sizeof (struct partial_symtab *));
1124     }
1125   else
1126     pst->dependencies = 0;
1127
1128   for (i = 0; i < num_includes; i++)
1129     {
1130       struct partial_symtab *subpst =
1131         allocate_psymtab (include_list[i], objfile);
1132
1133       subpst->section_offsets = pst->section_offsets;
1134       subpst->read_symtab_private =
1135           (char *) obstack_alloc (&objfile->psymbol_obstack,
1136                                   sizeof (struct symloc));
1137       LDSYMOFF(subpst) =
1138         LDSYMLEN(subpst) =
1139           subpst->textlow =
1140             subpst->texthigh = 0;
1141
1142       /* We could save slight bits of space by only making one of these,
1143          shared by the entire set of include files.  FIXME-someday.  */
1144       subpst->dependencies = (struct partial_symtab **)
1145         obstack_alloc (&objfile->psymbol_obstack,
1146                        sizeof (struct partial_symtab *));
1147       subpst->dependencies[0] = pst;
1148       subpst->number_of_dependencies = 1;
1149
1150       subpst->globals_offset =
1151         subpst->n_global_syms =
1152           subpst->statics_offset =
1153             subpst->n_static_syms = 0;
1154
1155       subpst->readin = 0;
1156       subpst->symtab = 0;
1157       subpst->read_symtab = pst->read_symtab;
1158     }
1159
1160   sort_pst_symbols (pst);
1161
1162   /* If there is already a psymtab or symtab for a file of this name, remove it.
1163      (If there is a symtab, more drastic things also happen.)
1164      This happens in VxWorks.  */
1165   free_named_symtabs (pst->filename);
1166
1167   if (num_includes == 0
1168    && number_dependencies == 0
1169    && pst->n_global_syms == 0
1170    && pst->n_static_syms == 0) {
1171     /* Throw away this psymtab, it's empty.  We can't deallocate it, since
1172        it is on the obstack, but we can forget to chain it on the list.  */
1173     struct partial_symtab *prev_pst;
1174
1175     /* First, snip it out of the psymtab chain */
1176
1177     if (pst->objfile->psymtabs == pst)
1178       pst->objfile->psymtabs = pst->next;
1179     else
1180       for (prev_pst = pst->objfile->psymtabs; prev_pst; prev_pst = pst->next)
1181         if (prev_pst->next == pst)
1182           prev_pst->next = pst->next;
1183
1184     /* Next, put it on a free list for recycling */
1185
1186     pst->next = pst->objfile->free_psymtabs;
1187     pst->objfile->free_psymtabs = pst;
1188   }
1189 }
1190 \f
1191 static void
1192 dbx_psymtab_to_symtab_1 (pst)
1193      struct partial_symtab *pst;
1194 {
1195   struct cleanup *old_chain;
1196   int i;
1197   
1198   if (!pst)
1199     return;
1200
1201   if (pst->readin)
1202     {
1203       fprintf (stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1204                pst->filename);
1205       return;
1206     }
1207
1208   /* Read in all partial symtabs on which this one is dependent */
1209   for (i = 0; i < pst->number_of_dependencies; i++)
1210     if (!pst->dependencies[i]->readin)
1211       {
1212         /* Inform about additional files that need to be read in.  */
1213         if (info_verbose)
1214           {
1215             fputs_filtered (" ", stdout);
1216             wrap_here ("");
1217             fputs_filtered ("and ", stdout);
1218             wrap_here ("");
1219             printf_filtered ("%s...", pst->dependencies[i]->filename);
1220             wrap_here ("");             /* Flush output */
1221             fflush (stdout);
1222           }
1223         dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
1224       }
1225
1226   if (LDSYMLEN(pst))            /* Otherwise it's a dummy */
1227     {
1228       /* Init stuff necessary for reading in symbols */
1229       stabsread_init ();
1230       buildsym_init ();
1231       old_chain = make_cleanup (really_free_pendings, 0);
1232       file_string_table_offset = FILE_STRING_OFFSET (pst);
1233       symbol_size = SYMBOL_SIZE (pst);
1234
1235       /* Read in this file's symbols */
1236       bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), L_SET);
1237       pst->symtab =
1238         read_ofile_symtab (pst->objfile, LDSYMOFF(pst), LDSYMLEN(pst),
1239                            pst->textlow, pst->texthigh - pst->textlow,
1240                            pst->section_offsets);
1241       sort_symtab_syms (pst->symtab);
1242
1243       do_cleanups (old_chain);
1244     }
1245
1246   pst->readin = 1;
1247 }
1248
1249 /* Read in all of the symbols for a given psymtab for real.
1250    Be verbose about it if the user wants that.  */
1251
1252 static void
1253 dbx_psymtab_to_symtab (pst)
1254      struct partial_symtab *pst;
1255 {
1256   bfd *sym_bfd;
1257
1258   if (!pst)
1259     return;
1260
1261   if (pst->readin)
1262     {
1263       fprintf (stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1264                pst->filename);
1265       return;
1266     }
1267
1268   if (LDSYMLEN(pst) || pst->number_of_dependencies)
1269     {
1270       /* Print the message now, before reading the string table,
1271          to avoid disconcerting pauses.  */
1272       if (info_verbose)
1273         {
1274           printf_filtered ("Reading in symbols for %s...", pst->filename);
1275           fflush (stdout);
1276         }
1277
1278       sym_bfd = pst->objfile->obfd;
1279
1280       next_symbol_text_func = dbx_next_symbol_text;
1281
1282       dbx_psymtab_to_symtab_1 (pst);
1283
1284       /* Match with global symbols.  This only needs to be done once,
1285          after all of the symtabs and dependencies have been read in.   */
1286       scan_file_globals (pst->objfile);
1287
1288       /* Finish up the debug error message.  */
1289       if (info_verbose)
1290         printf_filtered ("done.\n");
1291     }
1292 }
1293
1294 /* Read in a defined section of a specific object file's symbols.
1295   
1296    DESC is the file descriptor for the file, positioned at the
1297    beginning of the symtab
1298    SYM_OFFSET is the offset within the file of
1299    the beginning of the symbols we want to read
1300    SYM_SIZE is the size of the symbol info to read in.
1301    TEXT_OFFSET is the beginning of the text segment we are reading symbols for
1302    TEXT_SIZE is the size of the text segment read in.
1303    SECTION_OFFSETS are the relocation offsets which get added to each symbol. */
1304
1305 static struct symtab *
1306 read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
1307                    section_offsets)
1308      struct objfile *objfile;
1309      int sym_offset;
1310      int sym_size;
1311      CORE_ADDR text_offset;
1312      int text_size;
1313      struct section_offsets *section_offsets;
1314 {
1315   register char *namestring;
1316   register struct internal_nlist *bufp;
1317   unsigned char type;
1318   unsigned max_symnum;
1319   register bfd *abfd;
1320   struct symtab *rtn;
1321
1322   current_objfile = objfile;
1323   subfile_stack = NULL;
1324
1325   stringtab_global = DBX_STRINGTAB (objfile);
1326   last_source_file = NULL;
1327
1328   abfd = objfile->obfd;
1329   symfile_bfd = objfile->obfd;  /* Implicit param to next_text_symbol */
1330   symbuf_end = symbuf_idx = 0;
1331
1332   /* It is necessary to actually read one symbol *before* the start
1333      of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
1334      occurs before the N_SO symbol.
1335
1336      Detecting this in read_dbx_symtab
1337      would slow down initial readin, so we look for it here instead.  */
1338   if (!processing_acc_compilation && sym_offset >= (int)symbol_size)
1339     {
1340       bfd_seek (symfile_bfd, sym_offset - symbol_size, L_INCR);
1341       fill_symbuf (abfd);
1342       bufp = &symbuf[symbuf_idx++];
1343       SWAP_SYMBOL (bufp, abfd);
1344
1345       SET_NAMESTRING ();
1346
1347       processing_gcc_compilation = 0;
1348       if (bufp->n_type == N_TEXT)
1349         {
1350           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1351             processing_gcc_compilation = 1;
1352           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1353             processing_gcc_compilation = 2;
1354         }
1355
1356       /* Try to select a C++ demangling based on the compilation unit
1357          producer. */
1358
1359       if (processing_gcc_compilation)
1360         {
1361           if (AUTO_DEMANGLING)
1362             {
1363               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1364             }
1365         }
1366     }
1367   else
1368     {
1369       /* The N_SO starting this symtab is the first symbol, so we
1370          better not check the symbol before it.  I'm not this can
1371          happen, but it doesn't hurt to check for it.  */
1372       bfd_seek (symfile_bfd, sym_offset, L_INCR);
1373       processing_gcc_compilation = 0;
1374     }
1375
1376   if (symbuf_idx == symbuf_end)
1377     fill_symbuf (abfd);
1378   bufp = &symbuf[symbuf_idx];
1379   if (bufp->n_type != (unsigned char)N_SO)
1380     error("First symbol in segment of executable not a source symbol");
1381
1382   max_symnum = sym_size / symbol_size;
1383
1384   for (symnum = 0;
1385        symnum < max_symnum;
1386        symnum++)
1387     {
1388       QUIT;                     /* Allow this to be interruptable */
1389       if (symbuf_idx == symbuf_end)
1390         fill_symbuf(abfd);
1391       bufp = &symbuf[symbuf_idx++];
1392       SWAP_SYMBOL (bufp, abfd);
1393
1394       type = bufp->n_type;
1395
1396       SET_NAMESTRING ();
1397
1398       if (type & N_STAB) {
1399           process_one_symbol (type, bufp->n_desc, bufp->n_value,
1400                               namestring, section_offsets, objfile);
1401       }
1402       /* We skip checking for a new .o or -l file; that should never
1403          happen in this routine. */
1404       else if (type == N_TEXT)
1405         {
1406           /* I don't think this code will ever be executed, because
1407              the GCC_COMPILED_FLAG_SYMBOL usually is right before
1408              the N_SO symbol which starts this source file.
1409              However, there is no reason not to accept
1410              the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
1411
1412           if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1413             processing_gcc_compilation = 1;
1414           else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1415             processing_gcc_compilation = 2;
1416
1417           if (AUTO_DEMANGLING)
1418             {
1419               set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1420             }
1421         }
1422       else if (type & N_EXT || type == (unsigned char)N_TEXT
1423                || type == (unsigned char)N_NBTEXT
1424                ) {
1425           /* Global symbol: see if we came across a dbx defintion for
1426              a corresponding symbol.  If so, store the value.  Remove
1427              syms from the chain when their values are stored, but
1428              search the whole chain, as there may be several syms from
1429              different files with the same name. */
1430           /* This is probably not true.  Since the files will be read
1431              in one at a time, each reference to a global symbol will
1432              be satisfied in each file as it appears. So we skip this
1433              section. */
1434           ;
1435         }
1436     }
1437
1438   current_objfile = NULL;
1439
1440   /* In a Solaris elf file, this variable, which comes from the
1441      value of the N_SO symbol, will still be 0.  Luckily, text_offset,
1442      which comes from pst->textlow is correct. */
1443   if (last_source_start_addr == 0)
1444     last_source_start_addr = text_offset;
1445
1446   rtn = end_symtab (text_offset + text_size, 0, 0, objfile, SECT_OFF_TEXT);
1447   end_stabs ();
1448   return (rtn);
1449 }
1450 \f
1451 /* This handles a single symbol from the symbol-file, building symbols
1452    into a GDB symtab.  It takes these arguments and an implicit argument.
1453
1454    TYPE is the type field of the ".stab" symbol entry.
1455    DESC is the desc field of the ".stab" entry.
1456    VALU is the value field of the ".stab" entry.
1457    NAME is the symbol name, in our address space.
1458    SECTION_OFFSETS is a set of amounts by which the sections of this object
1459           file were relocated when it was loaded into memory.
1460           All symbols that refer
1461           to memory locations need to be offset by these amounts.
1462    OBJFILE is the object file from which we are reading symbols.
1463                It is used in end_symtab.  */
1464
1465 void
1466 process_one_symbol (type, desc, valu, name, section_offsets, objfile)
1467      int type, desc;
1468      CORE_ADDR valu;
1469      char *name;
1470      struct section_offsets *section_offsets;
1471      struct objfile *objfile;
1472 {
1473 #ifndef SUN_FIXED_LBRAC_BUG
1474   /* This records the last pc address we've seen.  We depend on there being
1475      an SLINE or FUN or SO before the first LBRAC, since the variable does
1476      not get reset in between reads of different symbol files.  */
1477   static CORE_ADDR last_pc_address;
1478 #endif
1479   register struct context_stack *new;
1480   /* This remembers the address of the start of a function.  It is used
1481      because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
1482      relative to the current function's start address.  On systems
1483      other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
1484      used to relocate these symbol types rather than SECTION_OFFSETS.  */
1485   static CORE_ADDR function_start_offset;
1486   char *colon_pos;
1487
1488 #ifndef BLOCK_ADDRESS_FUNCTION_RELATIVE
1489   /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
1490      function start address, so just use the text offset.  */
1491   function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
1492 #endif
1493
1494   /* Something is wrong if we see real data before
1495      seeing a source file name.  */
1496
1497   if (last_source_file == NULL && type != (unsigned char)N_SO)
1498     {
1499       /* Currently this ignores N_ENTRY on Gould machines, N_NSYM on machines
1500          where that code is defined.  */
1501       if (IGNORE_SYMBOL (type))
1502         return;
1503
1504       /* FIXME, this should not be an error, since it precludes extending
1505          the symbol table information in this way...  */
1506       error ("Invalid symbol data: does not start by identifying a source file.");
1507     }
1508
1509   switch (type)
1510     {
1511     case N_FUN:
1512     case N_FNAME:
1513 #if 0
1514 /* It seems that the Sun ANSI C compiler (acc) replaces N_FUN with N_GSYM and
1515    N_STSYM with a type code of f or F.  Can't enable this until we get some
1516    stuff straightened out with psymtabs.  FIXME. */
1517
1518     case N_GSYM:
1519     case N_STSYM:
1520 #endif /* 0 */
1521
1522       /* Relocate for dynamic loading */
1523       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1524
1525       /* Either of these types of symbols indicates the start of
1526          a new function.  We must process its "name" normally for dbx,
1527          but also record the start of a new lexical context, and possibly
1528          also the end of the lexical context for the previous function.  */
1529       /* This is not always true.  This type of symbol may indicate a
1530          text segment variable.  */
1531
1532       colon_pos = strchr (name, ':');
1533       if (!colon_pos++
1534           || (*colon_pos != 'f' && *colon_pos != 'F'))
1535         {
1536           define_symbol (valu, name, desc, type, objfile);
1537           break;
1538         }
1539
1540 #ifndef SUN_FIXED_LBRAC_BUG
1541       last_pc_address = valu;   /* Save for SunOS bug circumcision */
1542 #endif
1543
1544 #ifdef  BLOCK_ADDRESS_FUNCTION_RELATIVE
1545       /* On Solaris 2.0 compilers, the block addresses and N_SLINE's
1546          are relative to the start of the function.  On normal systems,
1547          and when using gcc on Solaris 2.0, these addresses are just
1548          absolute, or relative to the N_SO, depending on
1549          BLOCK_ADDRESS_ABSOLUTE.  */
1550       function_start_offset = valu;     
1551 #endif
1552
1553       within_function = 1;
1554       if (context_stack_depth > 0)
1555         {
1556           new = pop_context ();
1557           /* Make a block for the local symbols within.  */
1558           finish_block (new->name, &local_symbols, new->old_blocks,
1559                         new->start_addr, valu, objfile);
1560         }
1561       /* Stack must be empty now.  */
1562       if (context_stack_depth != 0)
1563         complain (&lbrac_unmatched_complaint, symnum);
1564
1565       new = push_context (0, valu);
1566       new->name = define_symbol (valu, name, desc, type, objfile);
1567       break;
1568
1569     case N_LBRAC:
1570       /* This "symbol" just indicates the start of an inner lexical
1571          context within a function.  */
1572
1573 #if defined(BLOCK_ADDRESS_ABSOLUTE) || defined(BLOCK_ADDRESS_FUNCTION_RELATIVE)
1574       /* Relocate for dynamic loading and Sun ELF acc fn-relative syms.  */
1575       valu += function_start_offset;
1576 #else
1577       /* On most machines, the block addresses are relative to the
1578          N_SO, the linker did not relocate them (sigh).  */
1579       valu += last_source_start_addr;
1580 #endif
1581
1582 #ifndef SUN_FIXED_LBRAC_BUG
1583       if (valu < last_pc_address) {
1584         /* Patch current LBRAC pc value to match last handy pc value */
1585         complain (&lbrac_complaint);
1586         valu = last_pc_address;
1587       }
1588 #endif
1589       new = push_context (desc, valu);
1590       break;
1591
1592     case N_RBRAC:
1593       /* This "symbol" just indicates the end of an inner lexical
1594          context that was started with N_LBRAC.  */
1595
1596 #if defined(BLOCK_ADDRESS_ABSOLUTE) || defined(BLOCK_ADDRESS_FUNCTION_RELATIVE)
1597       /* Relocate for dynamic loading and Sun ELF acc fn-relative syms.  */
1598       valu += function_start_offset;
1599 #else
1600       /* On most machines, the block addresses are relative to the
1601          N_SO, the linker did not relocate them (sigh).  */
1602       valu += last_source_start_addr;
1603 #endif
1604
1605       new = pop_context();
1606       if (desc != new->depth)
1607         complain (&lbrac_mismatch_complaint, symnum);
1608
1609       /* Some compilers put the variable decls inside of an
1610          LBRAC/RBRAC block.  This macro should be nonzero if this
1611          is true.  DESC is N_DESC from the N_RBRAC symbol.
1612          GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
1613          or the GCC2_COMPILED_SYMBOL.  */
1614 #if !defined (VARIABLES_INSIDE_BLOCK)
1615 #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
1616 #endif
1617
1618       /* Can only use new->locals as local symbols here if we're in
1619          gcc or on a machine that puts them before the lbrack.  */
1620       if (!VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1621         local_symbols = new->locals;
1622
1623       /* If this is not the outermost LBRAC...RBRAC pair in the
1624          function, its local symbols preceded it, and are the ones
1625          just recovered from the context stack.  Defined the block for them.
1626
1627          If this is the outermost LBRAC...RBRAC pair, there is no
1628          need to do anything; leave the symbols that preceded it
1629          to be attached to the function's own block.  However, if
1630          it is so, we need to indicate that we just moved outside
1631          of the function.  */
1632       if (local_symbols
1633           && (context_stack_depth
1634               > !VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation)))
1635         {
1636           /* FIXME Muzzle a compiler bug that makes end < start.  */
1637           if (new->start_addr > valu)
1638             {
1639               complain (&lbrac_rbrac_complaint);
1640               new->start_addr = valu;
1641             }
1642           /* Make a block for the local symbols within.  */
1643           finish_block (0, &local_symbols, new->old_blocks,
1644                         new->start_addr, valu, objfile);
1645         }
1646       else
1647         {
1648           within_function = 0;
1649         }
1650       if (VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1651         /* Now pop locals of block just finished.  */
1652         local_symbols = new->locals;
1653       break;
1654
1655     case N_FN:
1656     case N_FN_SEQ:
1657       /* This kind of symbol indicates the start of an object file.  */
1658       /* Relocate for dynamic loading */
1659       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1660       break;
1661
1662     case N_SO:
1663       /* This type of symbol indicates the start of data
1664          for one source file.
1665          Finish the symbol table of the previous source file
1666          (if any) and start accumulating a new symbol table.  */
1667       /* Relocate for dynamic loading */
1668       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1669
1670 #ifndef SUN_FIXED_LBRAC_BUG
1671       last_pc_address = valu;   /* Save for SunOS bug circumcision */
1672 #endif
1673   
1674 #ifdef PCC_SOL_BROKEN
1675       /* pcc bug, occasionally puts out SO for SOL.  */
1676       if (context_stack_depth > 0)
1677         {
1678           start_subfile (name, NULL);
1679           break;
1680         }
1681 #endif
1682       if (last_source_file)
1683         {
1684           /* Check if previous symbol was also an N_SO (with some
1685              sanity checks).  If so, that one was actually the directory
1686              name, and the current one is the real file name.
1687              Patch things up. */           
1688           if (previous_stab_code == (unsigned char) N_SO)
1689             {
1690               patch_subfile_names (current_subfile, name);
1691               break;            /* Ignore repeated SOs */
1692             }
1693           end_symtab (valu, 0, 0, objfile, SECT_OFF_TEXT);
1694           end_stabs ();
1695         }
1696       start_stabs ();
1697       start_symtab (name, NULL, valu);
1698       break;
1699
1700
1701     case N_SOL:
1702       /* This type of symbol indicates the start of data for
1703          a sub-source-file, one whose contents were copied or
1704          included in the compilation of the main source file
1705          (whose name was given in the N_SO symbol.)  */
1706       /* Relocate for dynamic loading */
1707       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1708       start_subfile (name, current_subfile->dirname);
1709       break;
1710
1711     case N_BINCL:
1712       push_subfile ();
1713       add_new_header_file (name, valu);
1714       start_subfile (name, current_subfile->dirname);
1715       break;
1716
1717     case N_EINCL:
1718       start_subfile (pop_subfile (), current_subfile->dirname);
1719       break;
1720
1721     case N_EXCL:
1722       add_old_header_file (name, valu);
1723       break;
1724
1725     case N_SLINE:
1726       /* This type of "symbol" really just records
1727          one line-number -- core-address correspondence.
1728          Enter it in the line list for this symbol table.  */
1729       /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
1730       valu += function_start_offset;
1731 #ifndef SUN_FIXED_LBRAC_BUG
1732       last_pc_address = valu;   /* Save for SunOS bug circumcision */
1733 #endif
1734       record_line (current_subfile, desc, valu);
1735       break;
1736
1737     case N_BCOMM:
1738       if (common_block)
1739         error ("Invalid symbol data: common within common at symtab pos %d",
1740                symnum);
1741       common_block = local_symbols;
1742       common_block_i = local_symbols ? local_symbols->nsyms : 0;
1743       break;
1744
1745     case N_ECOMM:
1746       /* Symbols declared since the BCOMM are to have the common block
1747          start address added in when we know it.  common_block points to
1748          the first symbol after the BCOMM in the local_symbols list;
1749          copy the list and hang it off the symbol for the common block name
1750          for later fixup.  */
1751       {
1752         int i;
1753         struct symbol *sym =
1754           (struct symbol *) xmmalloc (objfile -> md, sizeof (struct symbol));
1755         memset (sym, 0, sizeof *sym);
1756         SYMBOL_NAME (sym) = savestring (name, strlen (name));
1757         SYMBOL_CLASS (sym) = LOC_BLOCK;
1758         SYMBOL_NAMESPACE (sym) = (enum namespace)((long)
1759           copy_pending (local_symbols, common_block_i, common_block));
1760         i = hashname (SYMBOL_NAME (sym));
1761         SYMBOL_VALUE_CHAIN (sym) = global_sym_chain[i];
1762         global_sym_chain[i] = sym;
1763         common_block = 0;
1764         break;
1765       }
1766
1767     /* The following symbol types need to have the appropriate offset added
1768        to their value; then we process symbol definitions in the name.  */
1769
1770     case N_STSYM:               /* Static symbol in data seg */
1771     case N_LCSYM:               /* Static symbol in BSS seg */
1772     case N_ROSYM:               /* Static symbol in Read-only data seg */
1773      /* HORRID HACK DEPT.  However, it's Sun's furgin' fault.  FIXME.
1774         Solaris2's stabs-in-coff makes *most* symbols relative
1775         but leaves a few absolute.  N_STSYM and friends sit on the fence.
1776         .stab "foo:S...",N_STSYM        is absolute (ld relocates it)
1777         .stab "foo:V...",N_STSYM        is relative (section base subtracted).
1778         This leaves us no choice but to search for the 'S' or 'V'...
1779         (or pass the whole section_offsets stuff down ONE MORE function
1780         call level, which we really don't want to do).  */
1781       {
1782         char *p;
1783         p = strchr (name, ':');
1784         if (p != 0 && p[1] == 'S')
1785           {
1786             /* FIXME!  We relocate it by the TEXT offset, in case the
1787                whole module moved in memory.  But this is wrong, since
1788                the sections can side around independently.  */
1789             valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1790             goto define_a_symbol;
1791           }
1792         /* Since it's not the kludge case, re-dispatch to the right handler. */
1793         switch (type) {
1794         case N_STSYM:   goto case_N_STSYM;
1795         case N_LCSYM:   goto case_N_LCSYM;
1796         case N_ROSYM:   goto case_N_ROSYM;
1797         default:        abort();
1798         }
1799       }
1800
1801     case_N_STSYM:               /* Static symbol in data seg */
1802     case N_DSLINE:              /* Source line number, data seg */
1803       valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
1804       goto define_a_symbol;
1805
1806     case_N_LCSYM:               /* Static symbol in BSS seg */
1807     case N_BSLINE:              /* Source line number, bss seg */
1808     /*   N_BROWS:       overlaps with N_BSLINE */
1809       valu += ANOFFSET (section_offsets, SECT_OFF_BSS);
1810       goto define_a_symbol;
1811
1812     case_N_ROSYM:               /* Static symbol in Read-only data seg */
1813       valu += ANOFFSET (section_offsets, SECT_OFF_RODATA);
1814       goto define_a_symbol;
1815
1816     case N_ENTRY:               /* Alternate entry point */
1817       /* Relocate for dynamic loading */
1818       valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1819       goto define_a_symbol;
1820
1821     /* The following symbol types don't need the address field relocated,
1822        since it is either unused, or is absolute.  */
1823     define_a_symbol:
1824     case N_GSYM:                /* Global variable */
1825     case N_NSYMS:               /* Number of symbols (ultrix) */
1826     case N_NOMAP:               /* No map?  (ultrix) */
1827     case N_RSYM:                /* Register variable */
1828     case N_DEFD:                /* Modula-2 GNU module dependency */
1829     case N_SSYM:                /* Struct or union element */
1830     case N_LSYM:                /* Local symbol in stack */
1831     case N_PSYM:                /* Parameter variable */
1832     case N_LENG:                /* Length of preceding symbol type */
1833       if (name)
1834         define_symbol (valu, name, desc, type, objfile);
1835       break;
1836
1837     /* We use N_OPT to carry the gcc2_compiled flag.  Sun uses it
1838        for a bunch of other flags, too.  Someday we may parse their
1839        flags; for now we ignore theirs and hope they'll ignore ours.  */
1840     case N_OPT:                 /* Solaris 2:  Compiler options */
1841       if (name)
1842         {
1843           if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
1844             {
1845               processing_gcc_compilation = 2;
1846 #if 1         /* Works, but is experimental.  -fnf */
1847               if (AUTO_DEMANGLING)
1848                 {
1849                   set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1850                 }
1851 #endif
1852             }
1853         }
1854       break;
1855
1856     /* The following symbol types can be ignored.  */
1857     case N_OBJ:                 /* Solaris 2:  Object file dir and name */
1858     /*   N_UNDF:                   Solaris 2:  file separator mark */
1859     /*   N_UNDF: -- we will never encounter it, since we only process one
1860                     file's symbols at once.  */
1861     case N_ENDM:                /* Solaris 2:  End of module */
1862     case N_MAIN:                /* Name of main routine.  */
1863       break;
1864       
1865     /* The following symbol types we don't know how to process.  Handle
1866        them in a "default" way, but complain to people who care.  */
1867     default:
1868     case N_CATCH:               /* Exception handler catcher */
1869     case N_EHDECL:              /* Exception handler name */
1870     case N_PC:                  /* Global symbol in Pascal */
1871     case N_M2C:                 /* Modula-2 compilation unit */
1872     /*   N_MOD2:        overlaps with N_EHDECL */
1873     case N_SCOPE:               /* Modula-2 scope information */
1874     case N_ECOML:               /* End common (local name) */
1875     case N_NBTEXT:              /* Gould Non-Base-Register symbols??? */
1876     case N_NBDATA:
1877     case N_NBBSS:
1878     case N_NBSTS:
1879     case N_NBLCS:
1880       complain (&unknown_symtype_complaint, local_hex_string(type));
1881       if (name)
1882         define_symbol (valu, name, desc, type, objfile);
1883     }
1884
1885   previous_stab_code = type;
1886 }
1887 \f
1888 /* Copy a pending list, used to record the contents of a common
1889    block for later fixup.  */
1890 static struct pending *
1891 copy_pending (beg, begi, end)
1892     struct pending *beg;
1893     int begi;
1894     struct pending *end;
1895 {
1896   struct pending *new = 0;
1897   struct pending *next;
1898
1899   for (next = beg; next != 0 && (next != end || begi < end->nsyms);
1900        next = next->next, begi = 0)
1901     {
1902       register int j;
1903       for (j = begi; j < next->nsyms; j++)
1904         add_symbol_to_list (next->symbol[j], &new);
1905     }
1906   return new;
1907 }
1908 \f
1909 /* Scan and build partial symbols for an ELF symbol file.
1910    This ELF file has already been processed to get its minimal symbols,
1911    and any DWARF symbols that were in it.
1912
1913    This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
1914    rolled into one.
1915
1916    OBJFILE is the object file we are reading symbols from.
1917    ADDR is the address relative to which the symbols are (e.g.
1918    the base address of the text segment).
1919    MAINLINE is true if we are reading the main symbol
1920    table (as opposed to a shared lib or dynamically loaded file).
1921    STABOFFSET and STABSIZE define the location in OBJFILE where the .stab
1922    section exists.
1923    STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
1924    .stabstr section exists.
1925
1926    This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
1927    adjusted for elf details. */
1928
1929 void
1930 elfstab_build_psymtabs (objfile, section_offsets, mainline, 
1931                                staboffset, stabsize,
1932                                stabstroffset, stabstrsize)
1933       struct objfile *objfile;
1934       struct section_offsets *section_offsets;
1935       int mainline;
1936       file_ptr staboffset;
1937       unsigned int stabsize;
1938       file_ptr stabstroffset;
1939       unsigned int stabstrsize;
1940 {
1941   int val;
1942   bfd *sym_bfd = objfile->obfd;
1943   char *name = bfd_get_filename (sym_bfd);
1944   struct dbx_symfile_info *info;
1945
1946   /* There is already a dbx_symfile_info allocated by our caller.
1947      It might even contain some info from the ELF symtab to help us.  */
1948   info = (struct dbx_symfile_info *) objfile->sym_private;
1949
1950   DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
1951   if (!DBX_TEXT_SECT (objfile))
1952     error ("Can't find .text section in symbol file");
1953
1954 #define ELF_STABS_SYMBOL_SIZE   12      /* XXX FIXME XXX */
1955   DBX_SYMBOL_SIZE    (objfile) = ELF_STABS_SYMBOL_SIZE;
1956   DBX_SYMCOUNT       (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
1957   DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
1958   DBX_SYMTAB_OFFSET  (objfile) = staboffset;
1959   
1960   if (stabstrsize < 0   /* FIXME:  stabstrsize is unsigned; never true! */
1961       || stabstrsize > bfd_get_size (sym_bfd))
1962     error ("ridiculous string table size: %d bytes", stabstrsize);
1963   DBX_STRINGTAB (objfile) = (char *)
1964     obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
1965
1966   /* Now read in the string table in one big gulp.  */
1967
1968   val = bfd_seek (sym_bfd, stabstroffset, L_SET);
1969   if (val < 0)
1970     perror_with_name (name);
1971   val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
1972   if (val != stabstrsize)
1973     perror_with_name (name);
1974
1975   stabsread_new_init ();
1976   buildsym_new_init ();
1977   free_header_files ();
1978   init_header_files ();
1979   install_minimal_symbols (objfile);
1980
1981   processing_acc_compilation = 1;
1982
1983   /* In an elf file, we've already installed the minimal symbols that came
1984      from the elf (non-stab) symbol table, so always act like an
1985      incremental load here. */
1986   dbx_symfile_read (objfile, section_offsets, 0);
1987 }
1988 \f
1989 /* Scan and build partial symbols for a PA symbol file.
1990    This PA file has already been processed to get its minimal symbols.
1991
1992    OBJFILE is the object file we are reading symbols from.
1993    ADDR is the address relative to which the symbols are (e.g.
1994    the base address of the text segment).
1995    MAINLINE is true if we are reading the main symbol
1996    table (as opposed to a shared lib or dynamically loaded file).
1997
1998    */
1999
2000 void
2001 pastab_build_psymtabs (objfile, section_offsets, mainline)
2002      struct objfile *objfile;
2003      struct section_offsets *section_offsets;
2004      int mainline;
2005 {
2006   free_header_files ();
2007   init_header_files ();
2008
2009   /* In a PA file, we've already installed the minimal symbols that came
2010      from the PA (non-stab) symbol table, so always act like an
2011      incremental load here. */
2012
2013   dbx_symfile_read (objfile, section_offsets, mainline);
2014 }
2015 \f
2016 /* Parse the user's idea of an offset for dynamic linking, into our idea
2017    of how to represent it for fast symbol reading.  */
2018
2019 static struct section_offsets *
2020 dbx_symfile_offsets (objfile, addr)
2021      struct objfile *objfile;
2022      CORE_ADDR addr;
2023 {
2024   struct section_offsets *section_offsets;
2025   int i;
2026  
2027   section_offsets = (struct section_offsets *)
2028     obstack_alloc (&objfile -> psymbol_obstack,
2029                    sizeof (struct section_offsets) +
2030                           sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
2031
2032   for (i = 0; i < SECT_OFF_MAX; i++)
2033     ANOFFSET (section_offsets, i) = addr;
2034   
2035   return section_offsets;
2036 }
2037 \f
2038 /* Register our willingness to decode symbols for SunOS and a.out and
2039    b.out files handled by BFD... */
2040 static struct sym_fns sunos_sym_fns =
2041 {
2042   "sunOs",              /* sym_name: name or name prefix of BFD target type */
2043   6,                    /* sym_namelen: number of significant sym_name chars */
2044   dbx_new_init,         /* sym_new_init: init anything gbl to entire symtab */
2045   dbx_symfile_init,     /* sym_init: read initial info, setup for sym_read() */
2046   dbx_symfile_read,     /* sym_read: read a symbol file into symtab */
2047   dbx_symfile_finish,   /* sym_finish: finished with file, cleanup */
2048   dbx_symfile_offsets,  /* sym_offsets: parse user's offsets to internal form */
2049   NULL                  /* next: pointer to next struct sym_fns */
2050 };
2051
2052 static struct sym_fns aout_sym_fns =
2053 {
2054   "a.out",              /* sym_name: name or name prefix of BFD target type */
2055   5,                    /* sym_namelen: number of significant sym_name chars */
2056   dbx_new_init,         /* sym_new_init: init anything gbl to entire symtab */
2057   dbx_symfile_init,     /* sym_init: read initial info, setup for sym_read() */
2058   dbx_symfile_read,     /* sym_read: read a symbol file into symtab */
2059   dbx_symfile_finish,   /* sym_finish: finished with file, cleanup */
2060   dbx_symfile_offsets,  /* sym_offsets: parse user's offsets to internal form */
2061   NULL                  /* next: pointer to next struct sym_fns */
2062 };
2063
2064 static struct sym_fns bout_sym_fns =
2065 {
2066   "b.out",              /* sym_name: name or name prefix of BFD target type */
2067   5,                    /* sym_namelen: number of significant sym_name chars */
2068   dbx_new_init,         /* sym_new_init: init anything gbl to entire symtab */
2069   dbx_symfile_init,     /* sym_init: read initial info, setup for sym_read() */
2070   dbx_symfile_read,     /* sym_read: read a symbol file into symtab */
2071   dbx_symfile_finish,   /* sym_finish: finished with file, cleanup */
2072   dbx_symfile_offsets,  /* sym_offsets: parse user's offsets to internal form */
2073   NULL                  /* next: pointer to next struct sym_fns */
2074 };
2075
2076 void
2077 _initialize_dbxread ()
2078 {
2079   add_symtab_fns(&sunos_sym_fns);
2080   add_symtab_fns(&aout_sym_fns);
2081   add_symtab_fns(&bout_sym_fns);
2082 }