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