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