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