1 /* Read dbx symbol tables and convert to internal format, for GDB.
2 Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20 /* This module provides three functions: dbx_symfile_init,
21 which initializes to read a symbol file; dbx_new_init, which
22 discards existing cached information when all symbols are being
23 discarded; and dbx_symfile_read, which reads a symbol table
26 dbx_symfile_read only does the minimum work necessary for letting the
27 user "name" things symbolically; it does not read the entire symtab.
28 Instead, it reads the external and static symbols and puts them in partial
29 symbol tables. When more extensive information is requested of a
30 file, the corresponding partial symbol table is mutated into a full
31 fledged symbol table by going back and reading the symbols
32 for real. dbx_psymtab_to_symtab() is the function that does this */
37 #if defined(USG) || defined(__CYGNUSCLIB__)
38 #include <sys/types.h>
44 #ifdef GDB_TARGET_IS_HPPA
45 /* We don't want to use HP-UX's nlists. */
46 #define _NLIST_INCLUDED
50 #include <sys/param.h>
57 #include "breakpoint.h"
60 #include "gdbcore.h" /* for bfd stuff */
61 #include "libbfd.h" /* FIXME Secret internal BFD stuff (bfd_read) */
62 #ifdef GDB_TARGET_IS_HPPA
66 #include "libaout.h" /* FIXME Secret internal BFD stuff for a.out */
71 #include "stabsread.h"
72 #include "gdb-stabs.h"
74 #include "language.h" /* Needed inside partial-stab.h */
75 #include "complaints.h"
77 #include "aout/aout64.h"
78 #include "aout/stab_gnu.h" /* We always use GNU stabs, not native, now */
80 /* Each partial symbol table entry contains a pointer to private data for the
81 read_symtab() function to use when expanding a partial symbol table entry
82 to a full symbol table entry.
84 For dbxread this structure contains the offset within the file symbol table
85 of first local symbol for this file, and length (in bytes) of the section
86 of the symbol table devoted to this file's symbols (actually, the section
87 bracketed may contain more than just this file's symbols). It also contains
88 further information needed to locate the symbols if they are in an ELF file.
90 If ldsymlen is 0, the only reason for this thing's existence is the
91 dependency list. Nothing else will happen when it is read in. */
93 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
94 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
95 #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
96 #define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
97 #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
98 #define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
99 #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset)
107 int file_string_offset;
110 /* Macro to determine which symbols to ignore when reading the first symbol
111 of a file. Some machines override this definition. */
112 #ifndef IGNORE_SYMBOL
113 /* This code is used on Ultrix systems. Ignore it */
114 #define IGNORE_SYMBOL(type) (type == (int)N_NSYMS)
117 /* Macro for name of symbol to indicate a file compiled with gcc. */
118 #ifndef GCC_COMPILED_FLAG_SYMBOL
119 #define GCC_COMPILED_FLAG_SYMBOL "gcc_compiled."
122 /* Macro for name of symbol to indicate a file compiled with gcc2. */
123 #ifndef GCC2_COMPILED_FLAG_SYMBOL
124 #define GCC2_COMPILED_FLAG_SYMBOL "gcc2_compiled."
127 /* Define this as 1 if a pcc declaration of a char or short argument
128 gives the correct address. Otherwise assume pcc gives the
129 address of the corresponding int, which is not the same on a
130 big-endian machine. */
132 #ifndef BELIEVE_PCC_PROMOTION
133 #define BELIEVE_PCC_PROMOTION 0
136 /* Remember what we deduced to be the source language of this psymtab. */
138 static enum language psymtab_language = language_unknown;
140 /* Nonzero means give verbose info on gdb action. From main.c. */
141 extern int info_verbose;
143 /* The BFD for this file -- implicit parameter to next_symbol_text. */
145 static bfd *symfile_bfd;
147 /* The size of each symbol in the symbol file (in external form).
148 This is set by dbx_symfile_read when building psymtabs, and by
149 dbx_psymtab_to_symtab when building symtabs. */
151 static unsigned symbol_size;
153 /* This is the offset of the symbol table in the executable file */
154 static unsigned symbol_table_offset;
156 /* This is the offset of the string table in the executable file */
157 static unsigned string_table_offset;
159 /* For elf+stab executables, the n_strx field is not a simple index
160 into the string table. Instead, each .o file has a base offset
161 in the string table, and the associated symbols contain offsets
162 from this base. The following two variables contain the base
163 offset for the current and next .o files. */
164 static unsigned int file_string_table_offset;
165 static unsigned int next_file_string_table_offset;
167 /* Complaints about the symbols we have encountered. */
169 struct complaint lbrac_complaint =
170 {"bad block start address patched", 0, 0};
172 struct complaint string_table_offset_complaint =
173 {"bad string table offset in symbol %d", 0, 0};
175 struct complaint unknown_symtype_complaint =
176 {"unknown symbol type %s", 0, 0};
178 struct complaint lbrac_rbrac_complaint =
179 {"block start larger than block end", 0, 0};
181 struct complaint lbrac_unmatched_complaint =
182 {"unmatched N_LBRAC before symtab pos %d", 0, 0};
184 struct complaint lbrac_mismatch_complaint =
185 {"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
187 struct complaint repeated_header_complaint =
188 {"\"repeated\" header file not previously seen, at symtab pos %d", 0, 0};
190 struct complaint repeated_header_name_complaint =
191 {"\"repeated\" header file not previously seen, named %s", 0, 0};
193 /* During initial symbol readin, we need to have a structure to keep
194 track of which psymtabs have which bincls in them. This structure
195 is used during readin to setup the list of dependencies within each
196 partial symbol table. */
198 struct header_file_location
200 char *name; /* Name of header file */
201 int instance; /* See above */
202 struct partial_symtab *pst; /* Partial symtab that has the
203 BINCL/EINCL defs for this file */
206 /* The actual list and controling variables */
207 static struct header_file_location *bincl_list, *next_bincl;
208 static int bincls_allocated;
210 /* Local function prototypes */
213 free_header_files PARAMS ((void));
216 init_header_files PARAMS ((void));
218 static struct pending *
219 copy_pending PARAMS ((struct pending *, int, struct pending *));
221 static struct symtab *
222 read_ofile_symtab PARAMS ((struct objfile *, int, int, CORE_ADDR, int,
223 struct section_offsets *));
226 dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *));
229 dbx_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
232 read_dbx_symtab PARAMS ((struct section_offsets *, struct objfile *,
236 free_bincl_list PARAMS ((struct objfile *));
238 static struct partial_symtab *
239 find_corresponding_bincl_psymtab PARAMS ((char *, int));
242 add_bincl_to_list PARAMS ((struct partial_symtab *, char *, int));
245 init_bincl_list PARAMS ((int, struct objfile *));
248 init_psymbol_list PARAMS ((struct objfile *));
251 dbx_next_symbol_text PARAMS ((void));
254 fill_symbuf PARAMS ((bfd *));
257 dbx_symfile_init PARAMS ((struct objfile *));
260 dbx_new_init PARAMS ((struct objfile *));
263 dbx_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
266 dbx_symfile_finish PARAMS ((struct objfile *));
269 record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *));
272 add_new_header_file PARAMS ((char *, int));
275 add_old_header_file PARAMS ((char *, int));
278 add_this_object_header_file PARAMS ((int));
280 /* Free up old header file tables */
287 if (header_files != NULL)
289 for (i = 0; i < n_header_files; i++)
291 free (header_files[i].name);
293 free ((PTR)header_files);
297 if (this_object_header_files)
299 free ((PTR)this_object_header_files);
300 this_object_header_files = NULL;
302 n_allocated_header_files = 0;
303 n_allocated_this_object_header_files = 0;
306 /* Allocate new header file tables */
312 n_allocated_header_files = 10;
313 header_files = (struct header_file *)
314 xmalloc (10 * sizeof (struct header_file));
316 n_allocated_this_object_header_files = 10;
317 this_object_header_files = (int *) xmalloc (10 * sizeof (int));
320 /* Add header file number I for this object file
321 at the next successive FILENUM. */
324 add_this_object_header_file (i)
327 if (n_this_object_header_files == n_allocated_this_object_header_files)
329 n_allocated_this_object_header_files *= 2;
330 this_object_header_files
331 = (int *) xrealloc ((char *) this_object_header_files,
332 n_allocated_this_object_header_files * sizeof (int));
335 this_object_header_files[n_this_object_header_files++] = i;
338 /* Add to this file an "old" header file, one already seen in
339 a previous object file. NAME is the header file's name.
340 INSTANCE is its instance code, to select among multiple
341 symbol tables for the same header file. */
344 add_old_header_file (name, instance)
348 register struct header_file *p = header_files;
351 for (i = 0; i < n_header_files; i++)
352 if (STREQ (p[i].name, name) && instance == p[i].instance)
354 add_this_object_header_file (i);
357 complain (&repeated_header_complaint, symnum);
358 complain (&repeated_header_name_complaint, name);
361 /* Add to this file a "new" header file: definitions for its types follow.
362 NAME is the header file's name.
363 Most often this happens only once for each distinct header file,
364 but not necessarily. If it happens more than once, INSTANCE has
365 a different value each time, and references to the header file
366 use INSTANCE values to select among them.
368 dbx output contains "begin" and "end" markers for each new header file,
369 but at this level we just need to know which files there have been;
370 so we record the file when its "begin" is seen and ignore the "end". */
373 add_new_header_file (name, instance)
379 /* Make sure there is room for one more header file. */
381 if (n_header_files == n_allocated_header_files)
383 n_allocated_header_files *= 2;
384 header_files = (struct header_file *)
385 xrealloc ((char *) header_files,
386 (n_allocated_header_files * sizeof (struct header_file)));
389 /* Create an entry for this header file. */
391 i = n_header_files++;
392 header_files[i].name = savestring (name, strlen(name));
393 header_files[i].instance = instance;
394 header_files[i].length = 10;
395 header_files[i].vector
396 = (struct type **) xmalloc (10 * sizeof (struct type *));
397 memset (header_files[i].vector, 0, 10 * sizeof (struct type *));
399 add_this_object_header_file (i);
403 static struct type **
404 explicit_lookup_type (real_filenum, index)
405 int real_filenum, index;
407 register struct header_file *f = &header_files[real_filenum];
409 if (index >= f->length)
412 f->vector = (struct type **)
413 xrealloc (f->vector, f->length * sizeof (struct type *));
414 bzero (&f->vector[f->length / 2],
415 f->length * sizeof (struct type *) / 2);
417 return &f->vector[index];
422 record_minimal_symbol (name, address, type, objfile)
426 struct objfile *objfile;
428 enum minimal_symbol_type ms_type;
430 switch (type &~ N_EXT) {
431 case N_TEXT: ms_type = mst_text; break;
432 case N_DATA: ms_type = mst_data; break;
433 case N_BSS: ms_type = mst_bss; break;
434 case N_ABS: ms_type = mst_abs; break;
436 case N_SETV: ms_type = mst_data; break;
438 default: ms_type = mst_unknown; break;
441 prim_record_minimal_symbol (obsavestring (name, strlen (name), &objfile -> symbol_obstack),
445 /* Scan and build partial symbols for a symbol file.
446 We have been initialized by a call to dbx_symfile_init, which
447 put all the relevant info into a "struct dbx_symfile_info",
448 hung off the objfile structure.
450 SECTION_OFFSETS contains offsets relative to which the symbols in the
451 various sections are (depending where the sections were actually loaded).
452 MAINLINE is true if we are reading the main symbol
453 table (as opposed to a shared lib or dynamically loaded file). */
456 dbx_symfile_read (objfile, section_offsets, mainline)
457 struct objfile *objfile;
458 struct section_offsets *section_offsets;
459 int mainline; /* FIXME comments above */
464 sym_bfd = objfile->obfd;
465 val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
467 perror_with_name (objfile->name);
469 /* If we are reinitializing, or if we have never loaded syms yet, init */
470 if (mainline || objfile->global_psymbols.size == 0 || objfile->static_psymbols.size == 0)
471 init_psymbol_list (objfile);
473 #ifdef GDB_TARGET_IS_HPPA
474 symbol_size = obj_dbx_symbol_entry_size (sym_bfd);
476 symbol_size = DBX_SYMBOL_SIZE (objfile);
478 symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
481 make_cleanup (really_free_pendings, 0);
483 init_minimal_symbol_collection ();
484 make_cleanup (discard_minimal_symbols, 0);
486 /* Now that the symbol table data of the executable file are all in core,
487 process them and define symbols accordingly. */
489 read_dbx_symtab (section_offsets, objfile,
490 bfd_section_vma (sym_bfd, DBX_TEXT_SECT (objfile)),
491 bfd_section_size (sym_bfd, DBX_TEXT_SECT (objfile)));
493 /* Install any minimal symbols that have been collected as the current
494 minimal symbols for this objfile. */
496 install_minimal_symbols (objfile);
498 if (!have_partial_symbols ()) {
500 printf_filtered ("(no debugging symbols found)...");
505 /* Initialize anything that needs initializing when a completely new
506 symbol file is specified (not just adding some symbols from another
507 file, e.g. a shared library). */
510 dbx_new_init (ignore)
511 struct objfile *ignore;
513 stabsread_new_init ();
514 buildsym_new_init ();
515 init_header_files ();
519 /* dbx_symfile_init ()
520 is the dbx-specific initialization routine for reading symbols.
521 It is passed a struct objfile which contains, among other things,
522 the BFD for the file whose symbols are being read, and a slot for a pointer
523 to "private data" which we fill with goodies.
525 We read the string table into malloc'd space and stash a pointer to it.
527 Since BFD doesn't know how to read debug symbols in a format-independent
528 way (and may never do so...), we have to do it ourselves. We will never
529 be called unless this is an a.out (or very similar) file.
530 FIXME, there should be a cleaner peephole into the BFD environment here. */
533 dbx_symfile_init (objfile)
534 struct objfile *objfile;
537 bfd *sym_bfd = objfile->obfd;
538 char *name = bfd_get_filename (sym_bfd);
539 unsigned char size_temp[4];
541 /* Allocate struct to keep track of the symfile */
542 objfile->sym_private = (PTR)
543 xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
545 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
546 #ifdef GDB_TARGET_IS_HPPA
547 #define STRING_TABLE_OFFSET (sym_bfd->origin + obj_dbx_str_filepos (sym_bfd))
548 #define SYMBOL_TABLE_OFFSET (sym_bfd->origin + obj_dbx_sym_filepos (sym_bfd))
549 #define HP_STRING_TABLE_OFFSET (sym_bfd->origin + obj_hp_str_filepos (sym_bfd))
550 #define HP_SYMBOL_TABLE_OFFSET (sym_bfd->origin + obj_hp_sym_filepos (sym_bfd))
552 #define STRING_TABLE_OFFSET (sym_bfd->origin + obj_str_filepos (sym_bfd))
553 #define SYMBOL_TABLE_OFFSET (sym_bfd->origin + obj_sym_filepos (sym_bfd))
555 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
557 DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
558 DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
559 if (!DBX_TEXT_SECT (objfile))
560 error ("Can't find .text section in symbol file");
562 #ifdef GDB_TARGET_IS_HPPA
563 HP_SYMCOUNT (objfile) = obj_hp_sym_count (sym_bfd);
564 DBX_SYMCOUNT (objfile) = obj_dbx_sym_count (sym_bfd);
566 DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
567 DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
569 DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
571 /* Read the string table and stash it away in the psymbol_obstack. It is
572 only needed as long as we need to expand psymbols into full symbols,
573 so when we blow away the psymbol the string table goes away as well.
574 Note that gdb used to use the results of attempting to malloc the
575 string table, based on the size it read, as a form of sanity check
576 for botched byte swapping, on the theory that a byte swapped string
577 table size would be so totally bogus that the malloc would fail. Now
578 that we put in on the psymbol_obstack, we can't do this since gdb gets
579 a fatal error (out of virtual memory) if the size is bogus. We can
580 however at least check to see if the size is zero or some negative
583 #ifdef GDB_TARGET_IS_HPPA
584 DBX_STRINGTAB_SIZE (objfile) = obj_dbx_stringtab_size (sym_bfd);
585 HP_STRINGTAB_SIZE (objfile) = obj_hp_stringtab_size (sym_bfd);
587 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
589 perror_with_name (name);
591 val = bfd_read ((PTR)size_temp, sizeof (long), 1, sym_bfd);
593 perror_with_name (name);
595 DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
598 if (DBX_STRINGTAB_SIZE (objfile) <= 0
599 || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
600 error ("ridiculous string table size (%d bytes).",
601 DBX_STRINGTAB_SIZE (objfile));
603 DBX_STRINGTAB (objfile) =
604 (char *) obstack_alloc (&objfile -> psymbol_obstack,
605 DBX_STRINGTAB_SIZE (objfile));
606 #ifdef GDB_TARGET_IS_HPPA
607 if (HP_STRINGTAB_SIZE (objfile) <= 0
608 || HP_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
609 error ("ridiculous string table size (%d bytes).",
610 HP_STRINGTAB_SIZE (objfile));
612 HP_STRINGTAB (objfile) =
613 (char *) obstack_alloc (&objfile -> psymbol_obstack,
614 HP_STRINGTAB_SIZE (objfile));
617 /* Now read in the string table in one big gulp. */
619 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
621 perror_with_name (name);
622 val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
624 if (val != DBX_STRINGTAB_SIZE (objfile))
625 perror_with_name (name);
626 #ifdef GDB_TARGET_IS_HPPA
627 val = bfd_seek (sym_bfd, HP_STRING_TABLE_OFFSET, L_SET);
629 perror_with_name (name);
630 val = bfd_read (HP_STRINGTAB (objfile), HP_STRINGTAB_SIZE (objfile), 1,
632 if (val != HP_STRINGTAB_SIZE (objfile))
633 perror_with_name (name);
635 #ifdef GDB_TARGET_IS_HPPA
636 HP_SYMTAB_OFFSET (objfile) = HP_SYMBOL_TABLE_OFFSET;
640 /* Perform any local cleanups required when we are done with a particular
641 objfile. I.E, we are in the process of discarding all symbol information
642 for an objfile, freeing up all memory held for it, and unlinking the
643 objfile struct from the global list of known objfiles. */
646 dbx_symfile_finish (objfile)
647 struct objfile *objfile;
649 if (objfile->sym_private != NULL)
651 mfree (objfile -> md, objfile->sym_private);
653 free_header_files ();
657 /* Buffer for reading the symbol table entries. */
658 static struct internal_nlist symbuf[4096];
659 static int symbuf_idx;
660 static int symbuf_end;
662 /* Name of last function encountered. Used in Solaris to approximate
663 object file boundaries. */
664 static char *last_function_name;
666 /* The address in memory of the string table of the object file we are
667 reading (which might not be the "main" object file, but might be a
668 shared library or some other dynamically loaded thing). This is set
669 by read_dbx_symtab when building psymtabs, and by read_ofile_symtab
670 when building symtabs, and is used only by next_symbol_text. */
671 static char *stringtab_global;
673 /* Refill the symbol table input buffer
674 and set the variables that control fetching entries from it.
675 Reports an error if no data available.
676 This function can read past the end of the symbol table
677 (into the string table) but this does no harm. */
680 fill_symbuf (sym_bfd)
683 int nbytes = bfd_read ((PTR)symbuf, sizeof (symbuf), 1, sym_bfd);
685 perror_with_name (bfd_get_filename (sym_bfd));
686 else if (nbytes == 0)
687 error ("Premature end of file reading symbol table");
688 symbuf_end = nbytes / symbol_size;
691 #ifdef GDB_TARGET_IS_HPPA
692 /* same as above for the HP symbol table */
694 static struct symbol_dictionary_record hp_symbuf[4096];
695 static int hp_symbuf_idx;
696 static int hp_symbuf_end;
699 fill_hp_symbuf (sym_bfd)
702 int nbytes = bfd_read ((PTR)hp_symbuf, sizeof (hp_symbuf), 1, sym_bfd);
704 error ("error or end of file reading symbol table");
705 hp_symbuf_end = nbytes / sizeof (struct symbol_dictionary_record);
711 #define SWAP_SYMBOL(symp, abfd) \
713 (symp)->n_strx = bfd_h_get_32(abfd, \
714 (unsigned char *)&(symp)->n_strx); \
715 (symp)->n_desc = bfd_h_get_16 (abfd, \
716 (unsigned char *)&(symp)->n_desc); \
717 (symp)->n_value = bfd_h_get_32 (abfd, \
718 (unsigned char *)&(symp)->n_value); \
721 /* Invariant: The symbol pointed to by symbuf_idx is the first one
722 that hasn't been swapped. Swap the symbol at the same time
723 that symbuf_idx is incremented. */
725 /* dbx allows the text of a symbol name to be continued into the
726 next symbol name! When such a continuation is encountered
727 (a \ at the end of the text of a name)
728 call this function to get the continuation. */
731 dbx_next_symbol_text ()
733 if (symbuf_idx == symbuf_end)
734 fill_symbuf (symfile_bfd);
736 SWAP_SYMBOL(&symbuf[symbuf_idx], symfile_bfd);
737 return symbuf[symbuf_idx++].n_strx + stringtab_global
738 + file_string_table_offset;
741 /* Initializes storage for all of the partial symbols that will be
742 created by read_dbx_symtab and subsidiaries. */
745 init_psymbol_list (objfile)
746 struct objfile *objfile;
748 /* Free any previously allocated psymbol lists. */
749 if (objfile -> global_psymbols.list)
750 mfree (objfile -> md, (PTR)objfile -> global_psymbols.list);
751 if (objfile -> static_psymbols.list)
752 mfree (objfile -> md, (PTR)objfile -> static_psymbols.list);
754 /* Current best guess is that there are approximately a twentieth
755 of the total symbols (in a debugging file) are global or static
757 #ifdef GDB_TARGET_IS_HPPA
758 objfile -> global_psymbols.size = (DBX_SYMCOUNT (objfile) +
759 HP_SYMCOUNT (objfile)) / 10;
760 objfile -> static_psymbols.size = (DBX_SYMCOUNT (objfile) +
761 HP_SYMCOUNT (objfile)) / 10;
763 objfile -> global_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
764 objfile -> static_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
766 objfile -> global_psymbols.next = objfile -> global_psymbols.list = (struct partial_symbol *)
767 xmmalloc (objfile -> md, objfile -> global_psymbols.size * sizeof (struct partial_symbol));
768 objfile -> static_psymbols.next = objfile -> static_psymbols.list = (struct partial_symbol *)
769 xmmalloc (objfile -> md, objfile -> static_psymbols.size * sizeof (struct partial_symbol));
772 /* Initialize the list of bincls to contain none and have some
776 init_bincl_list (number, objfile)
778 struct objfile *objfile;
780 bincls_allocated = number;
781 next_bincl = bincl_list = (struct header_file_location *)
782 xmmalloc (objfile -> md, bincls_allocated * sizeof(struct header_file_location));
785 /* Add a bincl to the list. */
788 add_bincl_to_list (pst, name, instance)
789 struct partial_symtab *pst;
793 if (next_bincl >= bincl_list + bincls_allocated)
795 int offset = next_bincl - bincl_list;
796 bincls_allocated *= 2;
797 bincl_list = (struct header_file_location *)
798 xmrealloc (pst->objfile->md, (char *)bincl_list,
799 bincls_allocated * sizeof (struct header_file_location));
800 next_bincl = bincl_list + offset;
802 next_bincl->pst = pst;
803 next_bincl->instance = instance;
804 next_bincl++->name = name;
807 /* Given a name, value pair, find the corresponding
808 bincl in the list. Return the partial symtab associated
809 with that header_file_location. */
811 static struct partial_symtab *
812 find_corresponding_bincl_psymtab (name, instance)
816 struct header_file_location *bincl;
818 for (bincl = bincl_list; bincl < next_bincl; bincl++)
819 if (bincl->instance == instance
820 && STREQ (name, bincl->name))
823 return (struct partial_symtab *) 0;
826 /* Free the storage allocated for the bincl list. */
829 free_bincl_list (objfile)
830 struct objfile *objfile;
832 mfree (objfile -> md, (PTR)bincl_list);
833 bincls_allocated = 0;
836 /* Given pointers to an a.out symbol table in core containing dbx
837 style data, setup partial_symtab's describing each source file for
838 which debugging information is available.
839 SYMFILE_NAME is the name of the file we are reading from
840 and SECTION_OFFSETS is the set of offsets for the various sections
841 of the file (a set of zeros if the mainline program). */
844 read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
845 struct section_offsets *section_offsets;
846 struct objfile *objfile;
850 register struct internal_nlist *bufp = 0; /* =0 avoids gcc -Wall glitch */
851 register char *namestring;
853 int past_first_source_file = 0;
854 CORE_ADDR last_o_file_start = 0;
855 struct cleanup *old_chain;
857 #ifdef GDB_TARGET_IS_HPPA
859 struct symbol_dictionary_record *hp_bufp;
861 /* A hack: the first text symbol in the debugging library */
866 /* End of the text segment of the executable file. */
867 CORE_ADDR end_of_text_addr;
869 /* Current partial symtab */
870 struct partial_symtab *pst;
872 /* List of current psymtab's include files */
873 char **psymtab_include_list;
874 int includes_allocated;
877 /* Index within current psymtab dependency list */
878 struct partial_symtab **dependency_list;
879 int dependencies_used, dependencies_allocated;
881 /* FIXME. We probably want to change stringtab_global rather than add this
882 while processing every symbol entry. FIXME. */
883 file_string_table_offset = 0;
884 next_file_string_table_offset = 0;
886 #ifdef GDB_TARGET_IS_HPPA
887 stringtab_global = HP_STRINGTAB (objfile);
889 stringtab_global = DBX_STRINGTAB (objfile);
892 pst = (struct partial_symtab *) 0;
894 includes_allocated = 30;
896 psymtab_include_list = (char **) alloca (includes_allocated *
899 dependencies_allocated = 30;
900 dependencies_used = 0;
902 (struct partial_symtab **) alloca (dependencies_allocated *
903 sizeof (struct partial_symtab *));
905 old_chain = make_cleanup (free_objfile, objfile);
907 /* Init bincl list */
908 init_bincl_list (20, objfile);
909 make_cleanup (free_bincl_list, objfile);
911 last_source_file = NULL;
913 #ifdef END_OF_TEXT_DEFAULT
914 end_of_text_addr = END_OF_TEXT_DEFAULT;
916 end_of_text_addr = text_addr + section_offsets->offsets[SECT_OFF_TEXT]
917 + text_size; /* Relocate */
920 symfile_bfd = objfile->obfd; /* For next_text_symbol */
921 abfd = objfile->obfd;
922 symbuf_end = symbuf_idx = 0;
923 next_symbol_text_func = dbx_next_symbol_text;
925 #ifdef GDB_TARGET_IS_HPPA
926 /* On pa machines, the global symbols are all in the regular HP-UX
927 symbol table. Read them in first. */
929 hp_symbuf_end = hp_symbuf_idx = 0;
930 bfd_seek (abfd, HP_SYMTAB_OFFSET (objfile), L_SET);
932 for (hp_symnum = 0; hp_symnum < HP_SYMCOUNT (objfile); hp_symnum++)
937 if (hp_symbuf_idx == hp_symbuf_end)
938 fill_hp_symbuf (abfd);
939 hp_bufp = &hp_symbuf[hp_symbuf_idx++];
940 switch (hp_bufp->symbol_type)
951 hp_bufp->symbol_value &= ~3; /* clear out permission bits */
959 extern int kernel_debugging;
960 if (!kernel_debugging)
969 /* Use the address of dbsubc to finish the last psymtab. */
970 if (hp_bufp->symbol_type == ST_CODE &&
971 HP_STRINGTAB (objfile)[hp_bufp->name.n_strx] == '_' &&
972 STREQ (HP_STRINGTAB (objfile) + hp_bufp->name.n_strx, "_dbsubc"))
973 dbsubc_addr = hp_bufp->symbol_value;
974 if (hp_bufp->symbol_scope == SS_UNIVERSAL)
976 if (hp_bufp->name.n_strx > HP_STRINGTAB_SIZE (objfile))
977 error ("Invalid symbol data; bad HP string table offset: %d",
978 hp_bufp->name.n_strx);
979 /* A hack, but gets the job done. */
980 if (STREQ (hp_bufp->name.n_strx + HP_STRINGTAB (objfile),
982 objfile -> ei.entry_file_lowpc = hp_bufp->symbol_value;
983 if (STREQ (hp_bufp->name.n_strx + HP_STRINGTAB (objfile),
985 objfile -> ei.entry_file_highpc = hp_bufp->symbol_value;
986 record_minimal_symbol (hp_bufp->name.n_strx + HP_STRINGTAB (objfile),
987 hp_bufp->symbol_value, dbx_type | N_EXT,
991 bfd_seek (abfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
994 for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
996 /* Get the symbol for this run and pull out some info */
997 QUIT; /* allow this to be interruptable */
998 if (symbuf_idx == symbuf_end)
1000 bufp = &symbuf[symbuf_idx++];
1003 * Special case to speed up readin.
1005 if (bufp->n_type == (unsigned char)N_SLINE) continue;
1007 SWAP_SYMBOL (bufp, abfd);
1009 /* Ok. There is a lot of code duplicated in the rest of this
1010 switch statement (for efficiency reasons). Since I don't
1011 like duplicating code, I will do my penance here, and
1012 describe the code which is duplicated:
1014 *) The assignment to namestring.
1015 *) The call to strchr.
1016 *) The addition of a partial symbol the the two partial
1017 symbol lists. This last is a large section of code, so
1018 I've imbedded it in the following macro.
1021 /* Set namestring based on bufp. If the string table index is invalid,
1022 give a fake name, and print a single error message per symbol file read,
1023 rather than abort the symbol reading or flood the user with messages. */
1025 /*FIXME: Too many adds and indirections in here for the inner loop. */
1026 #define SET_NAMESTRING()\
1027 if (((unsigned)bufp->n_strx + file_string_table_offset) >= \
1028 DBX_STRINGTAB_SIZE (objfile)) { \
1029 complain (&string_table_offset_complaint, symnum); \
1030 namestring = "foo"; \
1032 namestring = bufp->n_strx + file_string_table_offset + \
1033 DBX_STRINGTAB (objfile)
1035 #define CUR_SYMBOL_TYPE bufp->n_type
1036 #define CUR_SYMBOL_VALUE bufp->n_value
1037 #define DBXREAD_ONLY
1038 #define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms)\
1039 start_psymtab(ofile, secoff, fname, low, symoff, global_syms, static_syms)
1040 #define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps)\
1041 end_psymtab(pst,ilist,ninc,c_off,c_text,dep_list,n_deps)
1043 #include "partial-stab.h"
1046 /* If there's stuff to be cleaned up, clean it up. */
1047 #ifndef GDB_TARGET_IS_HPPA
1048 if (DBX_SYMCOUNT (objfile) > 0 /* We have some syms */
1049 /*FIXME, does this have a bug at start address 0? */
1050 && last_o_file_start
1051 && objfile -> ei.entry_point < bufp->n_value
1052 && objfile -> ei.entry_point >= last_o_file_start)
1054 objfile -> ei.entry_file_lowpc = last_o_file_start;
1055 objfile -> ei.entry_file_highpc = bufp->n_value;
1061 #ifdef GDB_TARGET_IS_HPPA
1062 end_psymtab (pst, psymtab_include_list, includes_used,
1063 symnum * symbol_size, dbsubc_addr,
1064 dependency_list, dependencies_used);
1066 end_psymtab (pst, psymtab_include_list, includes_used,
1067 symnum * symbol_size, end_of_text_addr,
1068 dependency_list, dependencies_used);
1072 free_bincl_list (objfile);
1073 discard_cleanups (old_chain);
1076 /* Allocate and partially fill a partial symtab. It will be
1077 completely filled at the end of the symbol list.
1079 SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
1080 is the address relative to which its symbols are (incremental) or 0
1084 struct partial_symtab *
1085 start_psymtab (objfile, section_offsets,
1086 filename, textlow, ldsymoff, global_syms, static_syms)
1087 struct objfile *objfile;
1088 struct section_offsets *section_offsets;
1092 struct partial_symbol *global_syms;
1093 struct partial_symbol *static_syms;
1095 struct partial_symtab *result =
1096 start_psymtab_common(objfile, section_offsets,
1097 filename, textlow, global_syms, static_syms);
1099 result->read_symtab_private = (char *)
1100 obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc));
1101 LDSYMOFF(result) = ldsymoff;
1102 result->read_symtab = dbx_psymtab_to_symtab;
1103 SYMBOL_SIZE(result) = symbol_size;
1104 SYMBOL_OFFSET(result) = symbol_table_offset;
1105 STRING_OFFSET(result) = string_table_offset;
1106 FILE_STRING_OFFSET(result) = file_string_table_offset;
1108 /* If we're handling an ELF file, drag some section-relocation info
1109 for this source file out of the ELF symbol table, to compensate for
1110 Sun brain death. This replaces the section_offsets in this psymtab,
1112 elfstab_offset_sections (objfile, result);
1114 /* Deduce the source language from the filename for this psymtab. */
1115 psymtab_language = deduce_language_from_filename (filename);
1120 /* Close off the current usage of a partial_symbol table entry. This
1121 involves setting the correct number of includes (with a realloc),
1122 setting the high text mark, setting the symbol length in the
1123 executable, and setting the length of the global and static lists
1126 The global symbols and static symbols are then seperately sorted.
1128 Then the partial symtab is put on the global list.
1129 *** List variables and peculiarities of same. ***
1133 end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
1134 capping_text, dependency_list, number_dependencies)
1135 struct partial_symtab *pst;
1136 char **include_list;
1138 int capping_symbol_offset;
1139 CORE_ADDR capping_text;
1140 struct partial_symtab **dependency_list;
1141 int number_dependencies;
1142 /* struct partial_symbol *capping_global, *capping_static;*/
1145 struct partial_symtab *p1;
1146 struct objfile *objfile = pst -> objfile;
1148 if (capping_symbol_offset != -1)
1149 LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
1150 pst->texthigh = capping_text;
1152 /* Under Solaris, the N_SO symbols always have a value of 0,
1153 instead of the usual address of the .o file. Therefore,
1154 we have to do some tricks to fill in texthigh and textlow.
1155 The first trick is in partial-stab.h: if we see a static
1156 or global function, and the textlow for the current pst
1157 is still 0, then we use that function's address for
1158 the textlow of the pst.
1160 Now, to fill in texthigh, we remember the last function seen
1161 in the .o file (also in partial-stab.h). Also, there's a hack in
1162 bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
1163 to here via the misc_info field. Therefore, we can fill in
1164 a reliable texthigh by taking the address plus size of the
1165 last function in the file.
1167 Unfortunately, that does not cover the case where the last function
1168 in the file is static. See the paragraph below for more comments
1171 Finally, if we have a valid textlow for the current file, we run
1172 down the partial_symtab_list filling in previous texthighs that
1173 are still unknown. */
1175 if (pst->texthigh == 0 && last_function_name) {
1178 struct minimal_symbol *minsym;
1180 p = strchr (last_function_name, ':');
1182 p = last_function_name;
1183 n = p - last_function_name;
1185 strncpy (p, last_function_name, n);
1188 minsym = lookup_minimal_symbol (p, objfile);
1191 pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) +
1192 (int) MSYMBOL_INFO (minsym);
1194 /* This file ends with a static function, and it's
1195 difficult to imagine how hard it would be to track down
1196 the elf symbol. Luckily, most of the time no one will notice,
1197 since the next file will likely be compiled with -g, so
1198 the code below will copy the first fuction's start address
1199 back to our texthigh variable. (Also, if this file is the
1200 last one in a dynamically linked program, texthigh already
1201 has the right value.) If the next file isn't compiled
1202 with -g, then the last function in this file winds up owning
1203 all of the text space up to the next -g file, or the end (minus
1204 shared libraries). This only matters for single stepping,
1205 and even then it will still work, except that it will single
1206 step through all of the covered functions, instead of setting
1207 breakpoints around them as it usualy does. This makes it
1208 pretty slow, but at least it doesn't fail.
1210 We can fix this with a fairly big change to bfd, but we need
1211 to coordinate better with Cygnus if we want to do that. FIXME. */
1213 last_function_name = NULL;
1216 /* this test will be true if the last .o file is only data */
1217 if (pst->textlow == 0)
1218 pst->textlow = pst->texthigh;
1220 /* If we know our own starting text address, then walk through all other
1221 psymtabs for this objfile, and if any didn't know their ending text
1222 address, set it to our starting address. Take care to not set our
1223 own ending address to our starting address, nor to set addresses on
1224 `dependency' files that have both textlow and texthigh zero. */
1226 ALL_OBJFILE_PSYMTABS (objfile, p1) {
1227 if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst) {
1228 p1->texthigh = pst->textlow;
1229 /* if this file has only data, then make textlow match texthigh */
1230 if (p1->textlow == 0)
1231 p1->textlow = p1->texthigh;
1236 /* End of kludge for patching Solaris textlow and texthigh. */
1239 pst->n_global_syms =
1240 objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1241 pst->n_static_syms =
1242 objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1244 pst->number_of_dependencies = number_dependencies;
1245 if (number_dependencies)
1247 pst->dependencies = (struct partial_symtab **)
1248 obstack_alloc (&objfile->psymbol_obstack,
1249 number_dependencies * sizeof (struct partial_symtab *));
1250 memcpy (pst->dependencies, dependency_list,
1251 number_dependencies * sizeof (struct partial_symtab *));
1254 pst->dependencies = 0;
1256 for (i = 0; i < num_includes; i++)
1258 struct partial_symtab *subpst =
1259 allocate_psymtab (include_list[i], objfile);
1261 subpst->section_offsets = pst->section_offsets;
1262 subpst->read_symtab_private =
1263 (char *) obstack_alloc (&objfile->psymbol_obstack,
1264 sizeof (struct symloc));
1268 subpst->texthigh = 0;
1270 /* We could save slight bits of space by only making one of these,
1271 shared by the entire set of include files. FIXME-someday. */
1272 subpst->dependencies = (struct partial_symtab **)
1273 obstack_alloc (&objfile->psymbol_obstack,
1274 sizeof (struct partial_symtab *));
1275 subpst->dependencies[0] = pst;
1276 subpst->number_of_dependencies = 1;
1278 subpst->globals_offset =
1279 subpst->n_global_syms =
1280 subpst->statics_offset =
1281 subpst->n_static_syms = 0;
1285 subpst->read_symtab = dbx_psymtab_to_symtab;
1288 sort_pst_symbols (pst);
1290 /* If there is already a psymtab or symtab for a file of this name, remove it.
1291 (If there is a symtab, more drastic things also happen.)
1292 This happens in VxWorks. */
1293 free_named_symtabs (pst->filename);
1295 if (num_includes == 0
1296 && number_dependencies == 0
1297 && pst->n_global_syms == 0
1298 && pst->n_static_syms == 0) {
1299 /* Throw away this psymtab, it's empty. We can't deallocate it, since
1300 it is on the obstack, but we can forget to chain it on the list. */
1301 struct partial_symtab *prev_pst;
1303 /* First, snip it out of the psymtab chain */
1305 if (pst->objfile->psymtabs == pst)
1306 pst->objfile->psymtabs = pst->next;
1308 for (prev_pst = pst->objfile->psymtabs; prev_pst; prev_pst = pst->next)
1309 if (prev_pst->next == pst)
1310 prev_pst->next = pst->next;
1312 /* Next, put it on a free list for recycling */
1314 pst->next = pst->objfile->free_psymtabs;
1315 pst->objfile->free_psymtabs = pst;
1320 dbx_psymtab_to_symtab_1 (pst)
1321 struct partial_symtab *pst;
1323 struct cleanup *old_chain;
1331 fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
1336 /* Read in all partial symtabs on which this one is dependent */
1337 for (i = 0; i < pst->number_of_dependencies; i++)
1338 if (!pst->dependencies[i]->readin)
1340 /* Inform about additional files that need to be read in. */
1343 fputs_filtered (" ", stdout);
1345 fputs_filtered ("and ", stdout);
1347 printf_filtered ("%s...", pst->dependencies[i]->filename);
1348 wrap_here (""); /* Flush output */
1351 dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
1354 if (LDSYMLEN(pst)) /* Otherwise it's a dummy */
1356 /* Init stuff necessary for reading in symbols */
1359 old_chain = make_cleanup (really_free_pendings, 0);
1360 file_string_table_offset = FILE_STRING_OFFSET (pst);
1361 #ifdef GDB_TARGET_IS_HPPA
1362 symbol_size = obj_dbx_symbol_entry_size (pst->objfile->obfd);
1364 symbol_size = SYMBOL_SIZE (pst);
1367 /* Read in this file's symbols */
1368 bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), L_SET);
1370 read_ofile_symtab (pst->objfile, LDSYMOFF(pst), LDSYMLEN(pst),
1371 pst->textlow, pst->texthigh - pst->textlow,
1372 pst->section_offsets);
1373 sort_symtab_syms (pst->symtab);
1375 do_cleanups (old_chain);
1381 /* Read in all of the symbols for a given psymtab for real.
1382 Be verbose about it if the user wants that. */
1385 dbx_psymtab_to_symtab (pst)
1386 struct partial_symtab *pst;
1395 fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
1400 if (LDSYMLEN(pst) || pst->number_of_dependencies)
1402 /* Print the message now, before reading the string table,
1403 to avoid disconcerting pauses. */
1406 printf_filtered ("Reading in symbols for %s...", pst->filename);
1410 sym_bfd = pst->objfile->obfd;
1412 next_symbol_text_func = dbx_next_symbol_text;
1414 dbx_psymtab_to_symtab_1 (pst);
1416 /* Match with global symbols. This only needs to be done once,
1417 after all of the symtabs and dependencies have been read in. */
1418 scan_file_globals (pst->objfile);
1420 /* Finish up the debug error message. */
1422 printf_filtered ("done.\n");
1426 /* Read in a defined section of a specific object file's symbols.
1428 DESC is the file descriptor for the file, positioned at the
1429 beginning of the symtab
1430 SYM_OFFSET is the offset within the file of
1431 the beginning of the symbols we want to read
1432 SYM_SIZE is the size of the symbol info to read in.
1433 TEXT_OFFSET is the beginning of the text segment we are reading symbols for
1434 TEXT_SIZE is the size of the text segment read in.
1435 SECTION_OFFSETS are the relocation offsets which get added to each symbol. */
1437 static struct symtab *
1438 read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
1440 struct objfile *objfile;
1443 CORE_ADDR text_offset;
1445 struct section_offsets *section_offsets;
1447 register char *namestring;
1448 register struct internal_nlist *bufp;
1450 unsigned max_symnum;
1454 current_objfile = objfile;
1455 subfile_stack = NULL;
1457 #ifdef GDB_TARGET_IS_HPPA
1458 stringtab_global = HP_STRINGTAB (objfile);
1460 stringtab_global = DBX_STRINGTAB (objfile);
1462 last_source_file = NULL;
1464 abfd = objfile->obfd;
1465 symfile_bfd = objfile->obfd; /* Implicit param to next_text_symbol */
1466 symbuf_end = symbuf_idx = 0;
1468 /* It is necessary to actually read one symbol *before* the start
1469 of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
1470 occurs before the N_SO symbol.
1472 Detecting this in read_dbx_symtab
1473 would slow down initial readin, so we look for it here instead. */
1474 if (!processing_acc_compilation && sym_offset >= (int)symbol_size)
1476 bfd_seek (symfile_bfd, sym_offset - symbol_size, L_INCR);
1478 bufp = &symbuf[symbuf_idx++];
1479 SWAP_SYMBOL (bufp, abfd);
1483 processing_gcc_compilation = 0;
1484 if (bufp->n_type == N_TEXT)
1486 if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1487 processing_gcc_compilation = 1;
1488 else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1489 processing_gcc_compilation = 2;
1492 /* Try to select a C++ demangling based on the compilation unit
1495 if (processing_gcc_compilation)
1497 #if 1 /* Works, but is experimental. -fnf */
1498 if (AUTO_DEMANGLING)
1500 set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1507 /* The N_SO starting this symtab is the first symbol, so we
1508 better not check the symbol before it. I'm not this can
1509 happen, but it doesn't hurt to check for it. */
1510 bfd_seek (symfile_bfd, sym_offset, L_INCR);
1511 processing_gcc_compilation = 0;
1514 if (symbuf_idx == symbuf_end)
1516 bufp = &symbuf[symbuf_idx];
1517 if (bufp->n_type != (unsigned char)N_SO)
1518 error("First symbol in segment of executable not a source symbol");
1520 max_symnum = sym_size / symbol_size;
1523 symnum < max_symnum;
1526 QUIT; /* Allow this to be interruptable */
1527 if (symbuf_idx == symbuf_end)
1529 bufp = &symbuf[symbuf_idx++];
1530 SWAP_SYMBOL (bufp, abfd);
1532 type = bufp->n_type;
1536 if (type & N_STAB) {
1537 process_one_symbol (type, bufp->n_desc, bufp->n_value,
1538 namestring, section_offsets, objfile);
1540 /* We skip checking for a new .o or -l file; that should never
1541 happen in this routine. */
1542 else if (type == N_TEXT)
1544 /* I don't think this code will ever be executed, because
1545 the GCC_COMPILED_FLAG_SYMBOL usually is right before
1546 the N_SO symbol which starts this source file.
1547 However, there is no reason not to accept
1548 the GCC_COMPILED_FLAG_SYMBOL anywhere. */
1550 if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1551 processing_gcc_compilation = 1;
1552 else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1553 processing_gcc_compilation = 2;
1555 #if 1 /* Works, but is experimental. -fnf */
1556 if (AUTO_DEMANGLING)
1558 set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1562 else if (type & N_EXT || type == (unsigned char)N_TEXT
1563 || type == (unsigned char)N_NBTEXT
1565 /* Global symbol: see if we came across a dbx defintion for
1566 a corresponding symbol. If so, store the value. Remove
1567 syms from the chain when their values are stored, but
1568 search the whole chain, as there may be several syms from
1569 different files with the same name. */
1570 /* This is probably not true. Since the files will be read
1571 in one at a time, each reference to a global symbol will
1572 be satisfied in each file as it appears. So we skip this
1578 current_objfile = NULL;
1580 /* In a Solaris elf file, this variable, which comes from the
1581 value of the N_SO symbol, will still be 0. Luckily, text_offset,
1582 which comes from pst->textlow is correct. */
1583 if (last_source_start_addr == 0)
1584 last_source_start_addr = text_offset;
1586 rtn = end_symtab (text_offset + text_size, 0, 0, objfile);
1591 /* This handles a single symbol from the symbol-file, building symbols
1592 into a GDB symtab. It takes these arguments and an implicit argument.
1594 TYPE is the type field of the ".stab" symbol entry.
1595 DESC is the desc field of the ".stab" entry.
1596 VALU is the value field of the ".stab" entry.
1597 NAME is the symbol name, in our address space.
1598 SECTION_OFFSETS is a set of amounts by which the sections of this object
1599 file were relocated when it was loaded into memory.
1600 All symbols that refer
1601 to memory locations need to be offset by these amounts.
1602 OBJFILE is the object file from which we are reading symbols.
1603 It is used in end_symtab. */
1606 process_one_symbol (type, desc, valu, name, section_offsets, objfile)
1610 struct section_offsets *section_offsets;
1611 struct objfile *objfile;
1613 #ifndef SUN_FIXED_LBRAC_BUG
1614 /* This records the last pc address we've seen. We depend on there being
1615 an SLINE or FUN or SO before the first LBRAC, since the variable does
1616 not get reset in between reads of different symbol files. */
1617 static CORE_ADDR last_pc_address;
1619 register struct context_stack *new;
1620 /* This remembers the address of the start of a function. It is used
1621 because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
1622 relative to the current function's start address. On systems
1623 other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
1624 used to relocate these symbol types rather than SECTION_OFFSETS. */
1625 static CORE_ADDR function_start_offset;
1628 #ifndef BLOCK_ADDRESS_FUNCTION_RELATIVE
1629 /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
1630 function start address, so just use the text offset. */
1631 function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
1634 /* Something is wrong if we see real data before
1635 seeing a source file name. */
1637 if (last_source_file == NULL && type != (unsigned char)N_SO)
1639 /* Currently this ignores N_ENTRY on Gould machines, N_NSYM on machines
1640 where that code is defined. */
1641 if (IGNORE_SYMBOL (type))
1644 /* FIXME, this should not be an error, since it precludes extending
1645 the symbol table information in this way... */
1646 error ("Invalid symbol data: does not start by identifying a source file.");
1654 /* It seems that the Sun ANSI C compiler (acc) replaces N_FUN with N_GSYM and
1655 N_STSYM with a type code of f or F. Can't enable this until we get some
1656 stuff straightened out with psymtabs. FIXME. */
1662 /* Relocate for dynamic loading */
1663 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1665 /* Either of these types of symbols indicates the start of
1666 a new function. We must process its "name" normally for dbx,
1667 but also record the start of a new lexical context, and possibly
1668 also the end of the lexical context for the previous function. */
1669 /* This is not always true. This type of symbol may indicate a
1670 text segment variable. */
1672 colon_pos = strchr (name, ':');
1674 || (*colon_pos != 'f' && *colon_pos != 'F'))
1676 define_symbol (valu, name, desc, type, objfile);
1680 #ifndef SUN_FIXED_LBRAC_BUG
1681 last_pc_address = valu; /* Save for SunOS bug circumcision */
1684 #ifdef BLOCK_ADDRESS_FUNCTION_RELATIVE
1685 /* On Solaris 2.0 compilers, the block addresses and N_SLINE's
1686 are relative to the start of the function. On normal systems,
1687 and when using gcc on Solaris 2.0, these addresses are just
1688 absolute, or relative to the N_SO, depending on
1689 BLOCK_ADDRESS_ABSOLUTE. */
1690 function_start_offset = valu;
1693 within_function = 1;
1694 if (context_stack_depth > 0)
1696 new = pop_context ();
1697 /* Make a block for the local symbols within. */
1698 finish_block (new->name, &local_symbols, new->old_blocks,
1699 new->start_addr, valu, objfile);
1701 /* Stack must be empty now. */
1702 if (context_stack_depth != 0)
1703 complain (&lbrac_unmatched_complaint, symnum);
1705 new = push_context (0, valu);
1706 new->name = define_symbol (valu, name, desc, type, objfile);
1710 /* This "symbol" just indicates the start of an inner lexical
1711 context within a function. */
1713 #if defined(BLOCK_ADDRESS_ABSOLUTE) || defined(BLOCK_ADDRESS_FUNCTION_RELATIVE)
1714 /* Relocate for dynamic loading and Sun ELF acc fn-relative syms. */
1715 valu += function_start_offset;
1717 /* On most machines, the block addresses are relative to the
1718 N_SO, the linker did not relocate them (sigh). */
1719 valu += last_source_start_addr;
1722 #ifndef SUN_FIXED_LBRAC_BUG
1723 if (valu < last_pc_address) {
1724 /* Patch current LBRAC pc value to match last handy pc value */
1725 complain (&lbrac_complaint);
1726 valu = last_pc_address;
1729 new = push_context (desc, valu);
1733 /* This "symbol" just indicates the end of an inner lexical
1734 context that was started with N_LBRAC. */
1736 #if defined(BLOCK_ADDRESS_ABSOLUTE) || defined(BLOCK_ADDRESS_FUNCTION_RELATIVE)
1737 /* Relocate for dynamic loading and Sun ELF acc fn-relative syms. */
1738 valu += function_start_offset;
1740 /* On most machines, the block addresses are relative to the
1741 N_SO, the linker did not relocate them (sigh). */
1742 valu += last_source_start_addr;
1745 new = pop_context();
1746 if (desc != new->depth)
1747 complain (&lbrac_mismatch_complaint, symnum);
1749 /* Some compilers put the variable decls inside of an
1750 LBRAC/RBRAC block. This macro should be nonzero if this
1751 is true. DESC is N_DESC from the N_RBRAC symbol.
1752 GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
1753 or the GCC2_COMPILED_SYMBOL. */
1754 #if !defined (VARIABLES_INSIDE_BLOCK)
1755 #define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
1758 /* Can only use new->locals as local symbols here if we're in
1759 gcc or on a machine that puts them before the lbrack. */
1760 if (!VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1761 local_symbols = new->locals;
1763 /* If this is not the outermost LBRAC...RBRAC pair in the
1764 function, its local symbols preceded it, and are the ones
1765 just recovered from the context stack. Defined the block for them.
1767 If this is the outermost LBRAC...RBRAC pair, there is no
1768 need to do anything; leave the symbols that preceded it
1769 to be attached to the function's own block. However, if
1770 it is so, we need to indicate that we just moved outside
1773 && (context_stack_depth
1774 > !VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation)))
1776 /* FIXME Muzzle a compiler bug that makes end < start. */
1777 if (new->start_addr > valu)
1779 complain (&lbrac_rbrac_complaint);
1780 new->start_addr = valu;
1782 /* Make a block for the local symbols within. */
1783 finish_block (0, &local_symbols, new->old_blocks,
1784 new->start_addr, valu, objfile);
1788 within_function = 0;
1790 if (VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1791 /* Now pop locals of block just finished. */
1792 local_symbols = new->locals;
1797 /* This kind of symbol indicates the start of an object file. */
1798 /* Relocate for dynamic loading */
1799 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1803 /* This type of symbol indicates the start of data
1804 for one source file.
1805 Finish the symbol table of the previous source file
1806 (if any) and start accumulating a new symbol table. */
1807 /* Relocate for dynamic loading */
1808 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1810 #ifndef SUN_FIXED_LBRAC_BUG
1811 last_pc_address = valu; /* Save for SunOS bug circumcision */
1814 #ifdef PCC_SOL_BROKEN
1815 /* pcc bug, occasionally puts out SO for SOL. */
1816 if (context_stack_depth > 0)
1818 start_subfile (name, NULL);
1822 if (last_source_file)
1824 /* Check if previous symbol was also an N_SO (with some
1825 sanity checks). If so, that one was actually the directory
1826 name, and the current one is the real file name.
1828 if (previous_stab_code == N_SO)
1830 patch_subfile_names (current_subfile, name);
1831 break; /* Ignore repeated SOs */
1833 end_symtab (valu, 0, 0, objfile);
1837 start_symtab (name, NULL, valu);
1842 /* This type of symbol indicates the start of data for
1843 a sub-source-file, one whose contents were copied or
1844 included in the compilation of the main source file
1845 (whose name was given in the N_SO symbol.) */
1846 /* Relocate for dynamic loading */
1847 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1848 start_subfile (name, current_subfile->dirname);
1853 add_new_header_file (name, valu);
1854 start_subfile (name, current_subfile->dirname);
1858 start_subfile (pop_subfile (), current_subfile->dirname);
1862 add_old_header_file (name, valu);
1866 /* This type of "symbol" really just records
1867 one line-number -- core-address correspondence.
1868 Enter it in the line list for this symbol table. */
1869 /* Relocate for dynamic loading and for ELF acc fn-relative syms. */
1870 valu += function_start_offset;
1871 #ifndef SUN_FIXED_LBRAC_BUG
1872 last_pc_address = valu; /* Save for SunOS bug circumcision */
1874 record_line (current_subfile, desc, valu);
1879 error ("Invalid symbol data: common within common at symtab pos %d",
1881 common_block = local_symbols;
1882 common_block_i = local_symbols ? local_symbols->nsyms : 0;
1886 /* Symbols declared since the BCOMM are to have the common block
1887 start address added in when we know it. common_block points to
1888 the first symbol after the BCOMM in the local_symbols list;
1889 copy the list and hang it off the symbol for the common block name
1893 struct symbol *sym =
1894 (struct symbol *) xmmalloc (objfile -> md, sizeof (struct symbol));
1895 memset (sym, 0, sizeof *sym);
1896 SYMBOL_NAME (sym) = savestring (name, strlen (name));
1897 SYMBOL_CLASS (sym) = LOC_BLOCK;
1898 SYMBOL_NAMESPACE (sym) = (enum namespace)((long)
1899 copy_pending (local_symbols, common_block_i, common_block));
1900 i = hashname (SYMBOL_NAME (sym));
1901 SYMBOL_VALUE_CHAIN (sym) = global_sym_chain[i];
1902 global_sym_chain[i] = sym;
1907 /* The following symbol types need to have the appropriate offset added
1908 to their value; then we process symbol definitions in the name. */
1910 case N_STSYM: /* Static symbol in data seg */
1911 case N_LCSYM: /* Static symbol in BSS seg */
1912 case N_ROSYM: /* Static symbol in Read-only data seg */
1913 /* HORRID HACK DEPT. However, it's Sun's furgin' fault. FIXME.
1914 Solaris2's stabs-in-coff makes *most* symbols relative
1915 but leaves a few absolute. N_STSYM and friends sit on the fence.
1916 .stab "foo:S...",N_STSYM is absolute (ld relocates it)
1917 .stab "foo:V...",N_STSYM is relative (section base subtracted).
1918 This leaves us no choice but to search for the 'S' or 'V'...
1919 (or pass the whole section_offsets stuff down ONE MORE function
1920 call level, which we really don't want to do). */
1923 p = strchr (name, ':');
1924 if (p != 0 && p[1] == 'S')
1926 /* FIXME! We relocate it by the TEXT offset, in case the
1927 whole module moved in memory. But this is wrong, since
1928 the sections can side around independently. */
1929 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1930 goto define_a_symbol;
1932 /* Since it's not the kludge case, re-dispatch to the right handler. */
1934 case N_STSYM: goto case_N_STSYM;
1935 case N_LCSYM: goto case_N_LCSYM;
1936 case N_ROSYM: goto case_N_ROSYM;
1941 case_N_STSYM: /* Static symbol in data seg */
1942 case N_DSLINE: /* Source line number, data seg */
1943 valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
1944 goto define_a_symbol;
1946 case_N_LCSYM: /* Static symbol in BSS seg */
1947 case N_BSLINE: /* Source line number, bss seg */
1948 /* N_BROWS: overlaps with N_BSLINE */
1949 valu += ANOFFSET (section_offsets, SECT_OFF_BSS);
1950 goto define_a_symbol;
1952 case_N_ROSYM: /* Static symbol in Read-only data seg */
1953 valu += ANOFFSET (section_offsets, SECT_OFF_RODATA);
1954 goto define_a_symbol;
1956 case N_ENTRY: /* Alternate entry point */
1957 /* Relocate for dynamic loading */
1958 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1959 goto define_a_symbol;
1961 /* The following symbol types don't need the address field relocated,
1962 since it is either unused, or is absolute. */
1964 case N_GSYM: /* Global variable */
1965 case N_NSYMS: /* Number of symbols (ultrix) */
1966 case N_NOMAP: /* No map? (ultrix) */
1967 case N_RSYM: /* Register variable */
1968 case N_DEFD: /* Modula-2 GNU module dependency */
1969 case N_SSYM: /* Struct or union element */
1970 case N_LSYM: /* Local symbol in stack */
1971 case N_PSYM: /* Parameter variable */
1972 case N_LENG: /* Length of preceding symbol type */
1974 define_symbol (valu, name, desc, type, objfile);
1977 /* We use N_OPT to carry the gcc2_compiled flag. Sun uses it
1978 for a bunch of other flags, too. Someday we may parse their
1979 flags; for now we ignore theirs and hope they'll ignore ours. */
1980 case N_OPT: /* Solaris 2: Compiler options */
1983 if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
1985 processing_gcc_compilation = 2;
1986 #if 1 /* Works, but is experimental. -fnf */
1987 if (AUTO_DEMANGLING)
1989 set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1996 /* The following symbol types can be ignored. */
1997 case N_OBJ: /* Solaris 2: Object file dir and name */
1998 /* N_UNDF: Solaris 2: file separator mark */
1999 /* N_UNDF: -- we will never encounter it, since we only process one
2000 file's symbols at once. */
2001 case N_ENDM: /* Solaris 2: End of module */
2002 case N_MAIN: /* Name of main routine. */
2005 /* The following symbol types we don't know how to process. Handle
2006 them in a "default" way, but complain to people who care. */
2008 case N_CATCH: /* Exception handler catcher */
2009 case N_EHDECL: /* Exception handler name */
2010 case N_PC: /* Global symbol in Pascal */
2011 case N_M2C: /* Modula-2 compilation unit */
2012 /* N_MOD2: overlaps with N_EHDECL */
2013 case N_SCOPE: /* Modula-2 scope information */
2014 case N_ECOML: /* End common (local name) */
2015 case N_NBTEXT: /* Gould Non-Base-Register symbols??? */
2020 complain (&unknown_symtype_complaint, local_hex_string(type));
2022 define_symbol (valu, name, desc, type, objfile);
2025 previous_stab_code = type;
2028 /* Copy a pending list, used to record the contents of a common
2029 block for later fixup. */
2030 static struct pending *
2031 copy_pending (beg, begi, end)
2032 struct pending *beg;
2034 struct pending *end;
2036 struct pending *new = 0;
2037 struct pending *next;
2039 for (next = beg; next != 0 && (next != end || begi < end->nsyms);
2040 next = next->next, begi = 0)
2043 for (j = begi; j < next->nsyms; j++)
2044 add_symbol_to_list (next->symbol[j], &new);
2049 /* Scan and build partial symbols for an ELF symbol file.
2050 This ELF file has already been processed to get its minimal symbols,
2051 and any DWARF symbols that were in it.
2053 This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2056 OBJFILE is the object file we are reading symbols from.
2057 ADDR is the address relative to which the symbols are (e.g.
2058 the base address of the text segment).
2059 MAINLINE is true if we are reading the main symbol
2060 table (as opposed to a shared lib or dynamically loaded file).
2061 STABOFFSET and STABSIZE define the location in OBJFILE where the .stab
2063 STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2064 .stabstr section exists.
2066 This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2067 adjusted for elf details. */
2070 elfstab_build_psymtabs (objfile, section_offsets, mainline,
2071 staboffset, stabsize,
2072 stabstroffset, stabstrsize)
2073 struct objfile *objfile;
2074 struct section_offsets *section_offsets;
2076 file_ptr staboffset;
2077 unsigned int stabsize;
2078 file_ptr stabstroffset;
2079 unsigned int stabstrsize;
2082 bfd *sym_bfd = objfile->obfd;
2083 char *name = bfd_get_filename (sym_bfd);
2084 struct dbx_symfile_info *info;
2086 /* There is already a dbx_symfile_info allocated by our caller.
2087 It might even contain some info from the ELF symtab to help us. */
2088 info = (struct dbx_symfile_info *) objfile->sym_private;
2090 DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
2091 if (!DBX_TEXT_SECT (objfile))
2092 error ("Can't find .text section in symbol file");
2094 #define ELF_STABS_SYMBOL_SIZE 12 /* XXX FIXME XXX */
2095 DBX_SYMBOL_SIZE (objfile) = ELF_STABS_SYMBOL_SIZE;
2096 DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2097 DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2098 DBX_SYMTAB_OFFSET (objfile) = staboffset;
2100 if (stabstrsize < 0 /* FIXME: stabstrsize is unsigned; never true! */
2101 || stabstrsize > bfd_get_size (sym_bfd))
2102 error ("ridiculous string table size: %d bytes", stabstrsize);
2103 DBX_STRINGTAB (objfile) = (char *)
2104 obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
2106 /* Now read in the string table in one big gulp. */
2108 val = bfd_seek (sym_bfd, stabstroffset, L_SET);
2110 perror_with_name (name);
2111 val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2112 if (val != stabstrsize)
2113 perror_with_name (name);
2115 stabsread_new_init ();
2116 buildsym_new_init ();
2117 free_header_files ();
2118 init_header_files ();
2119 install_minimal_symbols (objfile);
2121 processing_acc_compilation = 1;
2123 /* In an elf file, we've already installed the minimal symbols that came
2124 from the elf (non-stab) symbol table, so always act like an
2125 incremental load here. */
2126 dbx_symfile_read (objfile, section_offsets, 0);
2129 /* Parse the user's idea of an offset for dynamic linking, into our idea
2130 of how to represent it for fast symbol reading. */
2132 struct section_offsets *
2133 dbx_symfile_offsets (objfile, addr)
2134 struct objfile *objfile;
2137 struct section_offsets *section_offsets;
2140 section_offsets = (struct section_offsets *)
2141 obstack_alloc (&objfile -> psymbol_obstack,
2142 sizeof (struct section_offsets) +
2143 sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
2145 for (i = 0; i < SECT_OFF_MAX; i++)
2146 ANOFFSET (section_offsets, i) = addr;
2148 return section_offsets;
2151 /* Register our willingness to decode symbols for SunOS and a.out and
2152 b.out files handled by BFD... */
2153 static struct sym_fns sunos_sym_fns =
2155 "sunOs", /* sym_name: name or name prefix of BFD target type */
2156 6, /* sym_namelen: number of significant sym_name chars */
2157 dbx_new_init, /* sym_new_init: init anything gbl to entire symtab */
2158 dbx_symfile_init, /* sym_init: read initial info, setup for sym_read() */
2159 dbx_symfile_read, /* sym_read: read a symbol file into symtab */
2160 dbx_symfile_finish, /* sym_finish: finished with file, cleanup */
2161 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
2162 NULL /* next: pointer to next struct sym_fns */
2165 static struct sym_fns aout_sym_fns =
2167 "a.out", /* sym_name: name or name prefix of BFD target type */
2168 5, /* sym_namelen: number of significant sym_name chars */
2169 dbx_new_init, /* sym_new_init: init anything gbl to entire symtab */
2170 dbx_symfile_init, /* sym_init: read initial info, setup for sym_read() */
2171 dbx_symfile_read, /* sym_read: read a symbol file into symtab */
2172 dbx_symfile_finish, /* sym_finish: finished with file, cleanup */
2173 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
2174 NULL /* next: pointer to next struct sym_fns */
2177 static struct sym_fns bout_sym_fns =
2179 "b.out", /* sym_name: name or name prefix of BFD target type */
2180 5, /* sym_namelen: number of significant sym_name chars */
2181 dbx_new_init, /* sym_new_init: init anything gbl to entire symtab */
2182 dbx_symfile_init, /* sym_init: read initial info, setup for sym_read() */
2183 dbx_symfile_read, /* sym_read: read a symbol file into symtab */
2184 dbx_symfile_finish, /* sym_finish: finished with file, cleanup */
2185 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
2186 NULL /* next: pointer to next struct sym_fns */
2189 /* This is probably a mistake. FIXME. Why can't the HP's use an ordinary
2190 file format name with an -hppa suffix? */
2191 static struct sym_fns hppa_sym_fns =
2193 "hppa", /* sym_name: name or name prefix of BFD target type */
2194 4, /* sym_namelen: number of significant sym_name chars */
2195 dbx_new_init, /* sym_new_init: init anything gbl to entire symtab */
2196 dbx_symfile_init, /* sym_init: read initial info, setup for sym_read() */
2197 dbx_symfile_read, /* sym_read: read a symbol file into symtab */
2198 dbx_symfile_finish, /* sym_finish: finished with file, cleanup */
2199 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
2200 NULL /* next: pointer to next struct sym_fns */
2204 _initialize_dbxread ()
2206 add_symtab_fns(&sunos_sym_fns);
2207 add_symtab_fns(&aout_sym_fns);
2208 add_symtab_fns(&bout_sym_fns);
2209 add_symtab_fns(&hppa_sym_fns);