misc updates
[deliverable/binutils-gdb.git] / gdb / dbxread.c
CommitLineData
bd5635a1 1/* Read dbx symbol tables and convert to internal format, for GDB.
c55e6167 2 Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
bd5635a1
RP
3
4This file is part of GDB.
5
c3a21801 6This program is free software; you can redistribute it and/or modify
bd5635a1 7it under the terms of the GNU General Public License as published by
c3a21801
JG
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
bd5635a1 10
c3a21801 11This program is distributed in the hope that it will be useful,
bd5635a1
RP
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
c3a21801
JG
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
9404978d
MT
19
20/* This module provides three functions: dbx_symfile_init,
21 which initializes to read a symbol file; dbx_new_init, which
22 discards existing cached information when all symbols are being
23 discarded; and dbx_symfile_read, which reads a symbol table
24 from a file.
25
26 dbx_symfile_read only does the minimum work necessary for letting the
27 user "name" things symbolically; it does not read the entire symtab.
28 Instead, it reads the external and static symbols and puts them in partial
29 symbol tables. When more extensive information is requested of a
30 file, the corresponding partial symbol table is mutated into a full
31 fledged symbol table by going back and reading the symbols
32 for real. dbx_psymtab_to_symtab() is the function that does this */
bd5635a1 33
bd5635a1 34#include "defs.h"
318bf84f 35#include <string.h>
bd5635a1 36
9342ecb9 37#if defined(USG) || defined(__CYGNUSCLIB__)
bd5635a1
RP
38#include <sys/types.h>
39#include <fcntl.h>
40#define L_SET 0
41#define L_INCR 1
42#endif
43
e0ba1d14 44#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
45/* We don't want to use HP-UX's nlists. */
46#define _NLIST_INCLUDED
47#endif
48
afe4ca15
JG
49#include <obstack.h>
50#include <sys/param.h>
021959e2 51#ifndef NO_SYS_FILE
afe4ca15 52#include <sys/file.h>
021959e2 53#endif
afe4ca15 54#include <sys/stat.h>
bd5635a1 55#include <ctype.h>
afe4ca15
JG
56#include "symtab.h"
57#include "breakpoint.h"
58#include "command.h"
59#include "target.h"
60#include "gdbcore.h" /* for bfd stuff */
ac88ca20 61#include "libbfd.h" /* FIXME Secret internal BFD stuff (bfd_read) */
e0ba1d14 62#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
63#include "libhppa.h"
64#include "syms.h"
65#else
afe4ca15 66#include "libaout.h" /* FIXME Secret internal BFD stuff for a.out */
7da1e27d 67#endif
afe4ca15 68#include "symfile.h"
3624c875 69#include "objfiles.h"
c0302457 70#include "buildsym.h"
3416d90b 71#include "stabsread.h"
2af231b8 72#include "gdb-stabs.h"
3416d90b 73#include "demangle.h"
51b80b00
FF
74#include "language.h" /* Needed inside partial-stab.h */
75#include "complaints.h"
afe4ca15 76
7e258d18
PB
77#include "aout/aout64.h"
78#include "aout/stab_gnu.h" /* We always use GNU stabs, not native, now */
bd5635a1 79
4a35d6e9
FF
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.
83
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
9342ecb9
JG
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.
89
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. */
4a35d6e9
FF
92
93#define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
94#define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
9342ecb9
JG
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)
4a35d6e9
FF
100
101struct symloc {
102 int ldsymoff;
103 int ldsymlen;
9342ecb9
JG
104 int symbol_size;
105 int symbol_offset;
106 int string_offset;
107 int file_string_offset;
4a35d6e9
FF
108};
109
bd5635a1
RP
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)
115#endif
116
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."
120#endif
121
0cf9329b
PB
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."
125#endif
126
bd5635a1
RP
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. */
131
132#ifndef BELIEVE_PCC_PROMOTION
133#define BELIEVE_PCC_PROMOTION 0
134#endif
c0302457 135
2e4964ad
FF
136/* Remember what we deduced to be the source language of this psymtab. */
137
138static enum language psymtab_language = language_unknown;
139
bd5635a1
RP
140/* Nonzero means give verbose info on gdb action. From main.c. */
141extern int info_verbose;
142
7d9884b9 143/* The BFD for this file -- implicit parameter to next_symbol_text. */
bd5635a1 144
c0302457 145static bfd *symfile_bfd;
bd5635a1 146
afe4ca15
JG
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. */
150
151static unsigned symbol_size;
152
9342ecb9
JG
153/* This is the offset of the symbol table in the executable file */
154static unsigned symbol_table_offset;
155
156/* This is the offset of the string table in the executable file */
157static unsigned string_table_offset;
158
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. */
164static unsigned int file_string_table_offset;
165static unsigned int next_file_string_table_offset;
166
bd5635a1
RP
167/* Complaints about the symbols we have encountered. */
168
bd5635a1
RP
169struct complaint lbrac_complaint =
170 {"bad block start address patched", 0, 0};
171
bd5635a1
RP
172struct complaint string_table_offset_complaint =
173 {"bad string table offset in symbol %d", 0, 0};
174
175struct complaint unknown_symtype_complaint =
0c4d2cc2 176 {"unknown symbol type %s", 0, 0};
bd5635a1
RP
177
178struct complaint lbrac_rbrac_complaint =
179 {"block start larger than block end", 0, 0};
7d9884b9
JG
180
181struct complaint lbrac_unmatched_complaint =
182 {"unmatched N_LBRAC before symtab pos %d", 0, 0};
183
184struct complaint lbrac_mismatch_complaint =
185 {"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
9342ecb9
JG
186
187struct complaint repeated_header_complaint =
188 {"\"repeated\" header file not previously seen, at symtab pos %d", 0, 0};
189
190struct complaint repeated_header_name_complaint =
191 {"\"repeated\" header file not previously seen, named %s", 0, 0};
bd5635a1 192\f
bd5635a1
RP
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. */
197
198struct header_file_location
199{
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 */
204};
205
206/* The actual list and controling variables */
207static struct header_file_location *bincl_list, *next_bincl;
208static int bincls_allocated;
209
021959e2
JG
210/* Local function prototypes */
211
212static void
80d68b1d
FF
213free_header_files PARAMS ((void));
214
215static void
216init_header_files PARAMS ((void));
021959e2
JG
217
218static struct pending *
219copy_pending PARAMS ((struct pending *, int, struct pending *));
220
221static struct symtab *
2af231b8
JG
222read_ofile_symtab PARAMS ((struct objfile *, int, int, CORE_ADDR, int,
223 struct section_offsets *));
021959e2
JG
224
225static void
226dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *));
227
228static void
4c07f28d 229dbx_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
021959e2
JG
230
231static void
2af231b8
JG
232read_dbx_symtab PARAMS ((struct section_offsets *, struct objfile *,
233 CORE_ADDR, int));
021959e2
JG
234
235static void
236free_bincl_list PARAMS ((struct objfile *));
237
238static struct partial_symtab *
239find_corresponding_bincl_psymtab PARAMS ((char *, int));
240
241static void
242add_bincl_to_list PARAMS ((struct partial_symtab *, char *, int));
243
244static void
245init_bincl_list PARAMS ((int, struct objfile *));
246
247static void
3624c875 248init_psymbol_list PARAMS ((struct objfile *));
021959e2
JG
249
250static char *
251dbx_next_symbol_text PARAMS ((void));
252
253static void
254fill_symbuf PARAMS ((bfd *));
255
256static void
80d68b1d
FF
257dbx_symfile_init PARAMS ((struct objfile *));
258
259static void
260dbx_new_init PARAMS ((struct objfile *));
021959e2
JG
261
262static void
2af231b8 263dbx_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
021959e2
JG
264
265static void
80d68b1d 266dbx_symfile_finish PARAMS ((struct objfile *));
021959e2
JG
267
268static void
269record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *));
270
271static void
272add_new_header_file PARAMS ((char *, int));
273
274static void
275add_old_header_file PARAMS ((char *, int));
276
277static void
278add_this_object_header_file PARAMS ((int));
279
80d68b1d 280/* Free up old header file tables */
bd5635a1 281
021959e2 282static void
80d68b1d 283free_header_files ()
bd5635a1
RP
284{
285 register int i;
bd5635a1 286
80d68b1d
FF
287 if (header_files != NULL)
288 {
289 for (i = 0; i < n_header_files; i++)
290 {
291 free (header_files[i].name);
292 }
ac88ca20 293 free ((PTR)header_files);
80d68b1d
FF
294 header_files = NULL;
295 n_header_files = 0;
296 }
297 if (this_object_header_files)
298 {
ac88ca20 299 free ((PTR)this_object_header_files);
80d68b1d
FF
300 this_object_header_files = NULL;
301 }
302 n_allocated_header_files = 0;
303 n_allocated_this_object_header_files = 0;
304}
305
306/* Allocate new header file tables */
307
308static void
309init_header_files ()
310{
bd5635a1 311 n_header_files = 0;
80d68b1d
FF
312 n_allocated_header_files = 10;
313 header_files = (struct header_file *)
314 xmalloc (10 * sizeof (struct header_file));
bd5635a1
RP
315
316 n_allocated_this_object_header_files = 10;
317 this_object_header_files = (int *) xmalloc (10 * sizeof (int));
318}
319
bd5635a1
RP
320/* Add header file number I for this object file
321 at the next successive FILENUM. */
322
323static void
324add_this_object_header_file (i)
325 int i;
326{
327 if (n_this_object_header_files == n_allocated_this_object_header_files)
328 {
329 n_allocated_this_object_header_files *= 2;
330 this_object_header_files
021959e2 331 = (int *) xrealloc ((char *) this_object_header_files,
bd5635a1
RP
332 n_allocated_this_object_header_files * sizeof (int));
333 }
334
335 this_object_header_files[n_this_object_header_files++] = i;
336}
337
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. */
342
343static void
344add_old_header_file (name, instance)
345 char *name;
346 int instance;
347{
348 register struct header_file *p = header_files;
349 register int i;
350
351 for (i = 0; i < n_header_files; i++)
2e4964ad 352 if (STREQ (p[i].name, name) && instance == p[i].instance)
bd5635a1
RP
353 {
354 add_this_object_header_file (i);
355 return;
356 }
51b80b00 357 complain (&repeated_header_complaint, symnum);
9342ecb9 358 complain (&repeated_header_name_complaint, name);
bd5635a1
RP
359}
360
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.
367
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". */
371
372static void
373add_new_header_file (name, instance)
374 char *name;
375 int instance;
376{
377 register int i;
bd5635a1
RP
378
379 /* Make sure there is room for one more header file. */
380
381 if (n_header_files == n_allocated_header_files)
382 {
383 n_allocated_header_files *= 2;
384 header_files = (struct header_file *)
021959e2
JG
385 xrealloc ((char *) header_files,
386 (n_allocated_header_files * sizeof (struct header_file)));
bd5635a1
RP
387 }
388
389 /* Create an entry for this header file. */
390
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 *));
4ed3a9ea 397 memset (header_files[i].vector, 0, 10 * sizeof (struct type *));
bd5635a1
RP
398
399 add_this_object_header_file (i);
400}
401
bd5635a1
RP
402#if 0
403static struct type **
404explicit_lookup_type (real_filenum, index)
405 int real_filenum, index;
406{
407 register struct header_file *f = &header_files[real_filenum];
408
409 if (index >= f->length)
410 {
411 f->length *= 2;
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);
416 }
417 return &f->vector[index];
418}
419#endif
420\f
9bba3334 421static void
021959e2 422record_minimal_symbol (name, address, type, objfile)
bd5635a1
RP
423 char *name;
424 CORE_ADDR address;
425 int type;
021959e2 426 struct objfile *objfile;
bd5635a1 427{
021959e2 428 enum minimal_symbol_type ms_type;
0c4d2cc2
JG
429
430 switch (type &~ N_EXT) {
021959e2
JG
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;
0c4d2cc2 435#ifdef N_SETV
021959e2 436 case N_SETV: ms_type = mst_data; break;
0c4d2cc2 437#endif
021959e2 438 default: ms_type = mst_unknown; break;
0c4d2cc2 439 }
bd5635a1 440
021959e2
JG
441 prim_record_minimal_symbol (obsavestring (name, strlen (name), &objfile -> symbol_obstack),
442 address, ms_type);
bd5635a1
RP
443}
444\f
445/* Scan and build partial symbols for a symbol file.
446 We have been initialized by a call to dbx_symfile_init, which
3624c875
FF
447 put all the relevant info into a "struct dbx_symfile_info",
448 hung off the objfile structure.
bd5635a1 449
2af231b8
JG
450 SECTION_OFFSETS contains offsets relative to which the symbols in the
451 various sections are (depending where the sections were actually loaded).
bd5635a1
RP
452 MAINLINE is true if we are reading the main symbol
453 table (as opposed to a shared lib or dynamically loaded file). */
454
9bba3334 455static void
2af231b8 456dbx_symfile_read (objfile, section_offsets, mainline)
80d68b1d 457 struct objfile *objfile;
2af231b8 458 struct section_offsets *section_offsets;
bd5635a1
RP
459 int mainline; /* FIXME comments above */
460{
80d68b1d 461 bfd *sym_bfd;
bd5635a1 462 int val;
bd5635a1 463
80d68b1d 464 sym_bfd = objfile->obfd;
3624c875 465 val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
bd5635a1 466 if (val < 0)
80d68b1d 467 perror_with_name (objfile->name);
bd5635a1 468
66eeea27 469 /* If we are reinitializing, or if we have never loaded syms yet, init */
80d68b1d 470 if (mainline || objfile->global_psymbols.size == 0 || objfile->static_psymbols.size == 0)
3624c875 471 init_psymbol_list (objfile);
66eeea27 472
e0ba1d14 473#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
474 symbol_size = obj_dbx_symbol_entry_size (sym_bfd);
475#else
9342ecb9 476 symbol_size = DBX_SYMBOL_SIZE (objfile);
7da1e27d 477#endif
9342ecb9 478 symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
afe4ca15 479
bd5635a1
RP
480 pending_blocks = 0;
481 make_cleanup (really_free_pendings, 0);
482
021959e2
JG
483 init_minimal_symbol_collection ();
484 make_cleanup (discard_minimal_symbols, 0);
bd5635a1
RP
485
486 /* Now that the symbol table data of the executable file are all in core,
487 process them and define symbols accordingly. */
488
2af231b8 489 read_dbx_symtab (section_offsets, objfile,
3624c875
FF
490 bfd_section_vma (sym_bfd, DBX_TEXT_SECT (objfile)),
491 bfd_section_size (sym_bfd, DBX_TEXT_SECT (objfile)));
bd5635a1 492
021959e2
JG
493 /* Install any minimal symbols that have been collected as the current
494 minimal symbols for this objfile. */
bd5635a1 495
80d68b1d 496 install_minimal_symbols (objfile);
bd5635a1 497
021959e2 498 if (!have_partial_symbols ()) {
9404978d
MT
499 wrap_here ("");
500 printf_filtered ("(no debugging symbols found)...");
501 wrap_here ("");
502 }
bd5635a1
RP
503}
504
9404978d
MT
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). */
bd5635a1 508
9bba3334 509static void
ac88ca20
JG
510dbx_new_init (ignore)
511 struct objfile *ignore;
bd5635a1 512{
3416d90b 513 stabsread_new_init ();
c0302457 514 buildsym_new_init ();
80d68b1d 515 init_header_files ();
bd5635a1
RP
516}
517
518
519/* dbx_symfile_init ()
520 is the dbx-specific initialization routine for reading symbols.
80d68b1d 521 It is passed a struct objfile which contains, among other things,
bd5635a1
RP
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.
524
525 We read the string table into malloc'd space and stash a pointer to it.
526
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. */
531
9bba3334 532static void
80d68b1d
FF
533dbx_symfile_init (objfile)
534 struct objfile *objfile;
bd5635a1
RP
535{
536 int val;
80d68b1d 537 bfd *sym_bfd = objfile->obfd;
bd5635a1 538 char *name = bfd_get_filename (sym_bfd);
bd5635a1
RP
539 unsigned char size_temp[4];
540
541 /* Allocate struct to keep track of the symfile */
ac88ca20 542 objfile->sym_private = (PTR)
3624c875 543 xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
bd5635a1
RP
544
545 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
e0ba1d14 546#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
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))
551#else
bd5635a1
RP
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))
7da1e27d 554#endif
bd5635a1
RP
555 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
556
784fd92b 557 DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
3624c875
FF
558 DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
559 if (!DBX_TEXT_SECT (objfile))
9342ecb9
JG
560 error ("Can't find .text section in symbol file");
561
e0ba1d14 562#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
563 HP_SYMCOUNT (objfile) = obj_hp_sym_count (sym_bfd);
564 DBX_SYMCOUNT (objfile) = obj_dbx_sym_count (sym_bfd);
565#else
bf18ac80 566 DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
7da1e27d
SG
567 DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
568#endif
9342ecb9 569 DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
3624c875
FF
570
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
581 value. */
bd5635a1 582
e0ba1d14 583#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
584 DBX_STRINGTAB_SIZE (objfile) = obj_dbx_stringtab_size (sym_bfd);
585 HP_STRINGTAB_SIZE (objfile) = obj_hp_stringtab_size (sym_bfd);
586#else
7d9884b9 587 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
bd5635a1 588 if (val < 0)
3624c875 589 perror_with_name (name);
bd5635a1 590
ac88ca20 591 val = bfd_read ((PTR)size_temp, sizeof (long), 1, sym_bfd);
bd5635a1 592 if (val < 0)
3624c875
FF
593 perror_with_name (name);
594
595 DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
7da1e27d
SG
596#endif
597
51db2323
FF
598 if (DBX_STRINGTAB_SIZE (objfile) <= 0
599 || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
3624c875
FF
600 error ("ridiculous string table size (%d bytes).",
601 DBX_STRINGTAB_SIZE (objfile));
602
603 DBX_STRINGTAB (objfile) =
604 (char *) obstack_alloc (&objfile -> psymbol_obstack,
605 DBX_STRINGTAB_SIZE (objfile));
e0ba1d14 606#ifdef GDB_TARGET_IS_HPPA
51db2323
FF
607 if (HP_STRINGTAB_SIZE (objfile) <= 0
608 || HP_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
7da1e27d
SG
609 error ("ridiculous string table size (%d bytes).",
610 HP_STRINGTAB_SIZE (objfile));
611
612 HP_STRINGTAB (objfile) =
613 (char *) obstack_alloc (&objfile -> psymbol_obstack,
614 HP_STRINGTAB_SIZE (objfile));
615#endif
bd5635a1
RP
616
617 /* Now read in the string table in one big gulp. */
618
7d9884b9 619 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
bd5635a1
RP
620 if (val < 0)
621 perror_with_name (name);
3624c875
FF
622 val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
623 sym_bfd);
624 if (val != DBX_STRINGTAB_SIZE (objfile))
bd5635a1 625 perror_with_name (name);
e0ba1d14 626#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
627 val = bfd_seek (sym_bfd, HP_STRING_TABLE_OFFSET, L_SET);
628 if (val < 0)
629 perror_with_name (name);
630 val = bfd_read (HP_STRINGTAB (objfile), HP_STRINGTAB_SIZE (objfile), 1,
631 sym_bfd);
632 if (val != HP_STRINGTAB_SIZE (objfile))
633 perror_with_name (name);
634#endif
e0ba1d14 635#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
636 HP_SYMTAB_OFFSET (objfile) = HP_SYMBOL_TABLE_OFFSET;
637#endif
bd5635a1 638}
80d68b1d
FF
639
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. */
644
645static void
646dbx_symfile_finish (objfile)
647 struct objfile *objfile;
648{
ac88ca20 649 if (objfile->sym_private != NULL)
80d68b1d 650 {
ac88ca20 651 mfree (objfile -> md, objfile->sym_private);
80d68b1d
FF
652 }
653 free_header_files ();
654}
655
bd5635a1
RP
656\f
657/* Buffer for reading the symbol table entries. */
afe4ca15 658static struct internal_nlist symbuf[4096];
bd5635a1
RP
659static int symbuf_idx;
660static int symbuf_end;
661
9342ecb9
JG
662/* Name of last function encountered. Used in Solaris to approximate
663 object file boundaries. */
664static char *last_function_name;
665
bd5635a1
RP
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. */
671static char *stringtab_global;
672
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. */
678
7d9884b9
JG
679static void
680fill_symbuf (sym_bfd)
681 bfd *sym_bfd;
bd5635a1 682{
ac88ca20 683 int nbytes = bfd_read ((PTR)symbuf, sizeof (symbuf), 1, sym_bfd);
bd5635a1 684 if (nbytes < 0)
7d9884b9 685 perror_with_name (bfd_get_filename (sym_bfd));
bd5635a1
RP
686 else if (nbytes == 0)
687 error ("Premature end of file reading symbol table");
afe4ca15 688 symbuf_end = nbytes / symbol_size;
bd5635a1 689 symbuf_idx = 0;
bd5635a1 690}
e0ba1d14 691#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
692/* same as above for the HP symbol table */
693
694static struct symbol_dictionary_record hp_symbuf[4096];
695static int hp_symbuf_idx;
696static int hp_symbuf_end;
697
698static int
699fill_hp_symbuf (sym_bfd)
700 bfd *sym_bfd;
701{
702 int nbytes = bfd_read ((PTR)hp_symbuf, sizeof (hp_symbuf), 1, sym_bfd);
703 if (nbytes <= 0)
704 error ("error or end of file reading symbol table");
705 hp_symbuf_end = nbytes / sizeof (struct symbol_dictionary_record);
706 hp_symbuf_idx = 0;
707 return 1;
708}
709#endif
bd5635a1 710
7d9884b9 711#define SWAP_SYMBOL(symp, abfd) \
bd5635a1 712 { \
7d9884b9 713 (symp)->n_strx = bfd_h_get_32(abfd, \
afe4ca15 714 (unsigned char *)&(symp)->n_strx); \
7d9884b9 715 (symp)->n_desc = bfd_h_get_16 (abfd, \
bd5635a1 716 (unsigned char *)&(symp)->n_desc); \
7d9884b9 717 (symp)->n_value = bfd_h_get_32 (abfd, \
bd5635a1
RP
718 (unsigned char *)&(symp)->n_value); \
719 }
720
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. */
724
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. */
729
021959e2 730static char *
aab77d5f 731dbx_next_symbol_text ()
bd5635a1
RP
732{
733 if (symbuf_idx == symbuf_end)
7d9884b9 734 fill_symbuf (symfile_bfd);
bd5635a1 735 symnum++;
7d9884b9 736 SWAP_SYMBOL(&symbuf[symbuf_idx], symfile_bfd);
9342ecb9
JG
737 return symbuf[symbuf_idx++].n_strx + stringtab_global
738 + file_string_table_offset;
bd5635a1
RP
739}
740\f
741/* Initializes storage for all of the partial symbols that will be
742 created by read_dbx_symtab and subsidiaries. */
743
744static void
3624c875 745init_psymbol_list (objfile)
021959e2 746 struct objfile *objfile;
bd5635a1
RP
747{
748 /* Free any previously allocated psymbol lists. */
021959e2 749 if (objfile -> global_psymbols.list)
ac88ca20 750 mfree (objfile -> md, (PTR)objfile -> global_psymbols.list);
021959e2 751 if (objfile -> static_psymbols.list)
ac88ca20 752 mfree (objfile -> md, (PTR)objfile -> static_psymbols.list);
bd5635a1
RP
753
754 /* Current best guess is that there are approximately a twentieth
755 of the total symbols (in a debugging file) are global or static
756 oriented symbols */
e0ba1d14 757#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
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;
762#else
3624c875
FF
763 objfile -> global_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
764 objfile -> static_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
7da1e27d 765#endif
021959e2 766 objfile -> global_psymbols.next = objfile -> global_psymbols.list = (struct partial_symbol *)
318bf84f 767 xmmalloc (objfile -> md, objfile -> global_psymbols.size * sizeof (struct partial_symbol));
021959e2 768 objfile -> static_psymbols.next = objfile -> static_psymbols.list = (struct partial_symbol *)
318bf84f 769 xmmalloc (objfile -> md, objfile -> static_psymbols.size * sizeof (struct partial_symbol));
bd5635a1
RP
770}
771
772/* Initialize the list of bincls to contain none and have some
773 allocated. */
774
775static void
021959e2 776init_bincl_list (number, objfile)
bd5635a1 777 int number;
021959e2 778 struct objfile *objfile;
bd5635a1
RP
779{
780 bincls_allocated = number;
781 next_bincl = bincl_list = (struct header_file_location *)
318bf84f 782 xmmalloc (objfile -> md, bincls_allocated * sizeof(struct header_file_location));
bd5635a1
RP
783}
784
785/* Add a bincl to the list. */
786
787static void
788add_bincl_to_list (pst, name, instance)
789 struct partial_symtab *pst;
790 char *name;
791 int instance;
792{
793 if (next_bincl >= bincl_list + bincls_allocated)
794 {
795 int offset = next_bincl - bincl_list;
796 bincls_allocated *= 2;
797 bincl_list = (struct header_file_location *)
318bf84f 798 xmrealloc (pst->objfile->md, (char *)bincl_list,
bd5635a1
RP
799 bincls_allocated * sizeof (struct header_file_location));
800 next_bincl = bincl_list + offset;
801 }
802 next_bincl->pst = pst;
803 next_bincl->instance = instance;
804 next_bincl++->name = name;
805}
806
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. */
810
9bba3334 811static struct partial_symtab *
bd5635a1
RP
812find_corresponding_bincl_psymtab (name, instance)
813 char *name;
814 int instance;
815{
816 struct header_file_location *bincl;
817
818 for (bincl = bincl_list; bincl < next_bincl; bincl++)
819 if (bincl->instance == instance
2e4964ad 820 && STREQ (name, bincl->name))
bd5635a1
RP
821 return bincl->pst;
822
823 return (struct partial_symtab *) 0;
824}
825
826/* Free the storage allocated for the bincl list. */
827
828static void
021959e2
JG
829free_bincl_list (objfile)
830 struct objfile *objfile;
bd5635a1 831{
ac88ca20 832 mfree (objfile -> md, (PTR)bincl_list);
bd5635a1
RP
833 bincls_allocated = 0;
834}
835
bd5635a1
RP
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
3624c875
FF
838 which debugging information is available.
839 SYMFILE_NAME is the name of the file we are reading from
2af231b8
JG
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). */
bd5635a1
RP
842
843static void
2af231b8
JG
844read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
845 struct section_offsets *section_offsets;
7d9884b9 846 struct objfile *objfile;
bd5635a1
RP
847 CORE_ADDR text_addr;
848 int text_size;
849{
ac88ca20 850 register struct internal_nlist *bufp = 0; /* =0 avoids gcc -Wall glitch */
bd5635a1 851 register char *namestring;
bd5635a1
RP
852 int nsl;
853 int past_first_source_file = 0;
854 CORE_ADDR last_o_file_start = 0;
855 struct cleanup *old_chain;
7d9884b9 856 bfd *abfd;
e0ba1d14 857#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
858 /* HP stuff */
859 struct symbol_dictionary_record *hp_bufp;
860 int hp_symnum;
861 /* A hack: the first text symbol in the debugging library */
862 int dbsubc_addr = 0;
863#endif
864
bd5635a1
RP
865
866 /* End of the text segment of the executable file. */
867 CORE_ADDR end_of_text_addr;
868
869 /* Current partial symtab */
870 struct partial_symtab *pst;
871
872 /* List of current psymtab's include files */
873 char **psymtab_include_list;
874 int includes_allocated;
875 int includes_used;
876
877 /* Index within current psymtab dependency list */
878 struct partial_symtab **dependency_list;
879 int dependencies_used, dependencies_allocated;
880
9342ecb9
JG
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;
885
e0ba1d14 886#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
887 stringtab_global = HP_STRINGTAB (objfile);
888#else
3624c875 889 stringtab_global = DBX_STRINGTAB (objfile);
7da1e27d 890#endif
bd5635a1
RP
891
892 pst = (struct partial_symtab *) 0;
893
894 includes_allocated = 30;
895 includes_used = 0;
896 psymtab_include_list = (char **) alloca (includes_allocated *
897 sizeof (char *));
898
899 dependencies_allocated = 30;
900 dependencies_used = 0;
901 dependency_list =
902 (struct partial_symtab **) alloca (dependencies_allocated *
903 sizeof (struct partial_symtab *));
904
7d9884b9 905 old_chain = make_cleanup (free_objfile, objfile);
bd5635a1
RP
906
907 /* Init bincl list */
021959e2
JG
908 init_bincl_list (20, objfile);
909 make_cleanup (free_bincl_list, objfile);
bd5635a1 910
3416d90b 911 last_source_file = NULL;
bd5635a1
RP
912
913#ifdef END_OF_TEXT_DEFAULT
914 end_of_text_addr = END_OF_TEXT_DEFAULT;
915#else
2af231b8
JG
916 end_of_text_addr = text_addr + section_offsets->offsets[SECT_OFF_TEXT]
917 + text_size; /* Relocate */
bd5635a1
RP
918#endif
919
7d9884b9
JG
920 symfile_bfd = objfile->obfd; /* For next_text_symbol */
921 abfd = objfile->obfd;
bd5635a1 922 symbuf_end = symbuf_idx = 0;
aab77d5f 923 next_symbol_text_func = dbx_next_symbol_text;
bd5635a1 924
e0ba1d14 925#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
926 /* On pa machines, the global symbols are all in the regular HP-UX
927 symbol table. Read them in first. */
928
929 hp_symbuf_end = hp_symbuf_idx = 0;
51b80b00 930 bfd_seek (abfd, HP_SYMTAB_OFFSET (objfile), L_SET);
7da1e27d
SG
931
932 for (hp_symnum = 0; hp_symnum < HP_SYMCOUNT (objfile); hp_symnum++)
933 {
934 int dbx_type;
935
936 QUIT;
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)
941 {
942 case ST_SYM_EXT:
943 case ST_ARG_EXT:
944 continue;
945 case ST_CODE:
946 case ST_PRI_PROG:
947 case ST_SEC_PROG:
948 case ST_ENTRY:
949 case ST_MILLICODE:
950 dbx_type = N_TEXT;
951 hp_bufp->symbol_value &= ~3; /* clear out permission bits */
952 break;
953 case ST_DATA:
954 dbx_type = N_DATA;
955 break;
956#ifdef KERNELDEBUG
957 case ST_ABSOLUTE:
958 {
959 extern int kernel_debugging;
960 if (!kernel_debugging)
961 continue;
962 dbx_type = N_ABS;
963 break;
964 }
965#endif
966 default:
967 continue;
968 }
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] == '_' &&
2e4964ad 972 STREQ (HP_STRINGTAB (objfile) + hp_bufp->name.n_strx, "_dbsubc"))
7da1e27d
SG
973 dbsubc_addr = hp_bufp->symbol_value;
974 if (hp_bufp->symbol_scope == SS_UNIVERSAL)
975 {
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. */
2e4964ad 980 if (STREQ (hp_bufp->name.n_strx + HP_STRINGTAB (objfile),
7da1e27d
SG
981 "$START$"))
982 objfile -> ei.entry_file_lowpc = hp_bufp->symbol_value;
2e4964ad 983 if (STREQ (hp_bufp->name.n_strx + HP_STRINGTAB (objfile),
7da1e27d
SG
984 "_sr4export"))
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,
988 objfile);
989 }
990 }
51b80b00 991 bfd_seek (abfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
7da1e27d
SG
992#endif
993
3624c875 994 for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
bd5635a1
RP
995 {
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)
7d9884b9 999 fill_symbuf (abfd);
bd5635a1
RP
1000 bufp = &symbuf[symbuf_idx++];
1001
1002 /*
1003 * Special case to speed up readin.
1004 */
1005 if (bufp->n_type == (unsigned char)N_SLINE) continue;
1006
7d9884b9 1007 SWAP_SYMBOL (bufp, abfd);
bd5635a1
RP
1008
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:
1013
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.
1019 */
1020
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. */
9342ecb9
JG
1024
1025/*FIXME: Too many adds and indirections in here for the inner loop. */
bd5635a1 1026#define SET_NAMESTRING()\
9342ecb9
JG
1027 if (((unsigned)bufp->n_strx + file_string_table_offset) >= \
1028 DBX_STRINGTAB_SIZE (objfile)) { \
51b80b00 1029 complain (&string_table_offset_complaint, symnum); \
bd5635a1
RP
1030 namestring = "foo"; \
1031 } else \
9342ecb9
JG
1032 namestring = bufp->n_strx + file_string_table_offset + \
1033 DBX_STRINGTAB (objfile)
bd5635a1 1034
7e258d18
PB
1035#define CUR_SYMBOL_TYPE bufp->n_type
1036#define CUR_SYMBOL_VALUE bufp->n_value
1037#define DBXREAD_ONLY
2af231b8
JG
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)
7e258d18
PB
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)
aab77d5f 1042
7e258d18 1043#include "partial-stab.h"
bd5635a1
RP
1044 }
1045
1046 /* If there's stuff to be cleaned up, clean it up. */
e0ba1d14 1047#ifndef GDB_TARGET_IS_HPPA
3624c875 1048 if (DBX_SYMCOUNT (objfile) > 0 /* We have some syms */
9342ecb9
JG
1049/*FIXME, does this have a bug at start address 0? */
1050 && last_o_file_start
3624c875
FF
1051 && objfile -> ei.entry_point < bufp->n_value
1052 && objfile -> ei.entry_point >= last_o_file_start)
bd5635a1 1053 {
3624c875
FF
1054 objfile -> ei.entry_file_lowpc = last_o_file_start;
1055 objfile -> ei.entry_file_highpc = bufp->n_value;
bd5635a1 1056 }
7da1e27d 1057#endif
bd5635a1
RP
1058
1059 if (pst)
1060 {
e0ba1d14 1061#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
1062 end_psymtab (pst, psymtab_include_list, includes_used,
1063 symnum * symbol_size, dbsubc_addr,
1064 dependency_list, dependencies_used);
1065#else
bd5635a1 1066 end_psymtab (pst, psymtab_include_list, includes_used,
afe4ca15 1067 symnum * symbol_size, end_of_text_addr,
7e258d18 1068 dependency_list, dependencies_used);
7da1e27d 1069#endif
bd5635a1
RP
1070 }
1071
021959e2 1072 free_bincl_list (objfile);
bd5635a1
RP
1073 discard_cleanups (old_chain);
1074}
1075
4a35d6e9
FF
1076/* Allocate and partially fill a partial symtab. It will be
1077 completely filled at the end of the symbol list.
1078
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
1081 (normal). */
1082
bd5635a1 1083
7e258d18 1084struct partial_symtab *
2af231b8 1085start_psymtab (objfile, section_offsets,
bd5635a1 1086 filename, textlow, ldsymoff, global_syms, static_syms)
7d9884b9 1087 struct objfile *objfile;
2af231b8 1088 struct section_offsets *section_offsets;
bd5635a1
RP
1089 char *filename;
1090 CORE_ADDR textlow;
1091 int ldsymoff;
1092 struct partial_symbol *global_syms;
1093 struct partial_symbol *static_syms;
1094{
1095 struct partial_symtab *result =
2af231b8 1096 start_psymtab_common(objfile, section_offsets,
021959e2 1097 filename, textlow, global_syms, static_syms);
bd5635a1 1098
021959e2
JG
1099 result->read_symtab_private = (char *)
1100 obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc));
1101 LDSYMOFF(result) = ldsymoff;
bd5635a1 1102 result->read_symtab = dbx_psymtab_to_symtab;
9342ecb9
JG
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;
bd5635a1 1107
2af231b8
JG
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,
1111 if successful. */
1112 elfstab_offset_sections (objfile, result);
1113
2e4964ad
FF
1114 /* Deduce the source language from the filename for this psymtab. */
1115 psymtab_language = deduce_language_from_filename (filename);
1116
bd5635a1
RP
1117 return result;
1118}
1119
bd5635a1
RP
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
1124 of psymbols.
1125
1126 The global symbols and static symbols are then seperately sorted.
1127
1128 Then the partial symtab is put on the global list.
1129 *** List variables and peculiarities of same. ***
1130 */
021959e2 1131
7e258d18 1132void
bd5635a1 1133end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
7e258d18 1134 capping_text, dependency_list, number_dependencies)
bd5635a1
RP
1135 struct partial_symtab *pst;
1136 char **include_list;
1137 int num_includes;
1138 int capping_symbol_offset;
1139 CORE_ADDR capping_text;
1140 struct partial_symtab **dependency_list;
1141 int number_dependencies;
7e258d18 1142/* struct partial_symbol *capping_global, *capping_static;*/
bd5635a1
RP
1143{
1144 int i;
9342ecb9 1145 struct partial_symtab *p1;
021959e2 1146 struct objfile *objfile = pst -> objfile;
bd5635a1 1147
7e258d18
PB
1148 if (capping_symbol_offset != -1)
1149 LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
bd5635a1
RP
1150 pst->texthigh = capping_text;
1151
9342ecb9
JG
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.
1159
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.
1166
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
1169 on this situation.
1170
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. */
1174
bcbf9559 1175 if (pst->texthigh == 0 && last_function_name) {
9342ecb9
JG
1176 char *p;
1177 int n;
1178 struct minimal_symbol *minsym;
1179
1180 p = strchr (last_function_name, ':');
1181 if (p == NULL)
1182 p = last_function_name;
1183 n = p - last_function_name;
1184 p = alloca (n + 1);
1185 strncpy (p, last_function_name, n);
1186 p[n] = 0;
1187
1188 minsym = lookup_minimal_symbol (p, objfile);
1189
1190 if (minsym) {
2e4964ad
FF
1191 pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) +
1192 (int) MSYMBOL_INFO (minsym);
9342ecb9
JG
1193 } else {
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.
1209
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. */
1212 }
1213 last_function_name = NULL;
1214 }
1215
1216 /* this test will be true if the last .o file is only data */
1217 if (pst->textlow == 0)
1218 pst->textlow = pst->texthigh;
1219
bcbf9559
JG
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. */
9342ecb9
JG
1225 if (pst->textlow) {
1226 ALL_OBJFILE_PSYMTABS (objfile, p1) {
bcbf9559 1227 if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst) {
9342ecb9
JG
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;
1232 }
1233 }
1234 }
1235
1236 /* End of kludge for patching Solaris textlow and texthigh. */
1237
1238
bd5635a1 1239 pst->n_global_syms =
021959e2 1240 objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
bd5635a1 1241 pst->n_static_syms =
021959e2 1242 objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
bd5635a1
RP
1243
1244 pst->number_of_dependencies = number_dependencies;
1245 if (number_dependencies)
1246 {
1247 pst->dependencies = (struct partial_symtab **)
021959e2 1248 obstack_alloc (&objfile->psymbol_obstack,
bd5635a1 1249 number_dependencies * sizeof (struct partial_symtab *));
7e258d18 1250 memcpy (pst->dependencies, dependency_list,
bd5635a1
RP
1251 number_dependencies * sizeof (struct partial_symtab *));
1252 }
1253 else
1254 pst->dependencies = 0;
1255
1256 for (i = 0; i < num_includes; i++)
1257 {
bd5635a1 1258 struct partial_symtab *subpst =
021959e2 1259 allocate_psymtab (include_list[i], objfile);
7d9884b9 1260
2af231b8 1261 subpst->section_offsets = pst->section_offsets;
021959e2
JG
1262 subpst->read_symtab_private =
1263 (char *) obstack_alloc (&objfile->psymbol_obstack,
1264 sizeof (struct symloc));
4a35d6e9
FF
1265 LDSYMOFF(subpst) =
1266 LDSYMLEN(subpst) =
bd5635a1
RP
1267 subpst->textlow =
1268 subpst->texthigh = 0;
1269
3f83182d
JG
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. */
bd5635a1 1272 subpst->dependencies = (struct partial_symtab **)
021959e2 1273 obstack_alloc (&objfile->psymbol_obstack,
bd5635a1
RP
1274 sizeof (struct partial_symtab *));
1275 subpst->dependencies[0] = pst;
1276 subpst->number_of_dependencies = 1;
1277
1278 subpst->globals_offset =
1279 subpst->n_global_syms =
1280 subpst->statics_offset =
1281 subpst->n_static_syms = 0;
1282
1283 subpst->readin = 0;
9a822037 1284 subpst->symtab = 0;
bd5635a1 1285 subpst->read_symtab = dbx_psymtab_to_symtab;
bd5635a1
RP
1286 }
1287
021959e2 1288 sort_pst_symbols (pst);
bd5635a1 1289
f9623881
JG
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);
1294
7d9884b9
JG
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. */
318bf84f
FF
1301 struct partial_symtab *prev_pst;
1302
1303 /* First, snip it out of the psymtab chain */
1304
1305 if (pst->objfile->psymtabs == pst)
1306 pst->objfile->psymtabs = pst->next;
1307 else
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;
1311
1312 /* Next, put it on a free list for recycling */
1313
1314 pst->next = pst->objfile->free_psymtabs;
1315 pst->objfile->free_psymtabs = pst;
7d9884b9 1316 }
bd5635a1
RP
1317}
1318\f
1319static void
4c07f28d 1320dbx_psymtab_to_symtab_1 (pst)
bd5635a1 1321 struct partial_symtab *pst;
bd5635a1
RP
1322{
1323 struct cleanup *old_chain;
1324 int i;
1325
1326 if (!pst)
1327 return;
1328
1329 if (pst->readin)
1330 {
1331 fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
1332 pst->filename);
1333 return;
1334 }
1335
afe4ca15 1336 /* Read in all partial symtabs on which this one is dependent */
bd5635a1
RP
1337 for (i = 0; i < pst->number_of_dependencies; i++)
1338 if (!pst->dependencies[i]->readin)
1339 {
1340 /* Inform about additional files that need to be read in. */
1341 if (info_verbose)
1342 {
1343 fputs_filtered (" ", stdout);
1344 wrap_here ("");
1345 fputs_filtered ("and ", stdout);
1346 wrap_here ("");
1347 printf_filtered ("%s...", pst->dependencies[i]->filename);
1348 wrap_here (""); /* Flush output */
1349 fflush (stdout);
1350 }
4c07f28d 1351 dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
bd5635a1
RP
1352 }
1353
4a35d6e9 1354 if (LDSYMLEN(pst)) /* Otherwise it's a dummy */
bd5635a1
RP
1355 {
1356 /* Init stuff necessary for reading in symbols */
3416d90b 1357 stabsread_init ();
c0302457 1358 buildsym_init ();
bd5635a1 1359 old_chain = make_cleanup (really_free_pendings, 0);
9342ecb9 1360 file_string_table_offset = FILE_STRING_OFFSET (pst);
e0ba1d14
JG
1361#ifdef GDB_TARGET_IS_HPPA
1362 symbol_size = obj_dbx_symbol_entry_size (pst->objfile->obfd);
7da1e27d 1363#else
4c07f28d 1364 symbol_size = SYMBOL_SIZE (pst);
7da1e27d 1365#endif
4c07f28d
FF
1366
1367 /* Read in this file's symbols */
1368 bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), L_SET);
9404978d 1369 pst->symtab =
3624c875
FF
1370 read_ofile_symtab (pst->objfile, LDSYMOFF(pst), LDSYMLEN(pst),
1371 pst->textlow, pst->texthigh - pst->textlow,
2af231b8 1372 pst->section_offsets);
9404978d 1373 sort_symtab_syms (pst->symtab);
bd5635a1
RP
1374
1375 do_cleanups (old_chain);
1376 }
1377
1378 pst->readin = 1;
1379}
1380
ac88ca20
JG
1381/* Read in all of the symbols for a given psymtab for real.
1382 Be verbose about it if the user wants that. */
1383
bd5635a1
RP
1384static void
1385dbx_psymtab_to_symtab (pst)
1386 struct partial_symtab *pst;
1387{
bd5635a1 1388 bfd *sym_bfd;
bd5635a1
RP
1389
1390 if (!pst)
1391 return;
1392
1393 if (pst->readin)
1394 {
1395 fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
1396 pst->filename);
1397 return;
1398 }
1399
4a35d6e9 1400 if (LDSYMLEN(pst) || pst->number_of_dependencies)
bd5635a1
RP
1401 {
1402 /* Print the message now, before reading the string table,
1403 to avoid disconcerting pauses. */
1404 if (info_verbose)
1405 {
1406 printf_filtered ("Reading in symbols for %s...", pst->filename);
1407 fflush (stdout);
1408 }
1409
7d9884b9 1410 sym_bfd = pst->objfile->obfd;
bd5635a1 1411
aab77d5f
PB
1412 next_symbol_text_func = dbx_next_symbol_text;
1413
4c07f28d 1414 dbx_psymtab_to_symtab_1 (pst);
bd5635a1
RP
1415
1416 /* Match with global symbols. This only needs to be done once,
1417 after all of the symtabs and dependencies have been read in. */
021959e2 1418 scan_file_globals (pst->objfile);
bd5635a1 1419
bd5635a1
RP
1420 /* Finish up the debug error message. */
1421 if (info_verbose)
1422 printf_filtered ("done.\n");
1423 }
1424}
1425
9342ecb9
JG
1426/* Read in a defined section of a specific object file's symbols.
1427
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.
2af231b8 1435 SECTION_OFFSETS are the relocation offsets which get added to each symbol. */
bd5635a1 1436
9404978d 1437static struct symtab *
3624c875 1438read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
2af231b8 1439 section_offsets)
7d9884b9 1440 struct objfile *objfile;
bd5635a1
RP
1441 int sym_offset;
1442 int sym_size;
1443 CORE_ADDR text_offset;
1444 int text_size;
2af231b8 1445 struct section_offsets *section_offsets;
bd5635a1
RP
1446{
1447 register char *namestring;
7d9884b9 1448 register struct internal_nlist *bufp;
bd5635a1 1449 unsigned char type;
afe4ca15 1450 unsigned max_symnum;
7d9884b9 1451 register bfd *abfd;
3416d90b 1452 struct symtab *rtn;
7d9884b9 1453
021959e2 1454 current_objfile = objfile;
3416d90b 1455 subfile_stack = NULL;
bd5635a1 1456
e0ba1d14 1457#ifdef GDB_TARGET_IS_HPPA
7da1e27d
SG
1458 stringtab_global = HP_STRINGTAB (objfile);
1459#else
3624c875 1460 stringtab_global = DBX_STRINGTAB (objfile);
7da1e27d 1461#endif
3416d90b 1462 last_source_file = NULL;
bd5635a1 1463
7d9884b9
JG
1464 abfd = objfile->obfd;
1465 symfile_bfd = objfile->obfd; /* Implicit param to next_text_symbol */
bd5635a1
RP
1466 symbuf_end = symbuf_idx = 0;
1467
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.
1471
1472 Detecting this in read_dbx_symtab
1473 would slow down initial readin, so we look for it here instead. */
9342ecb9 1474 if (!processing_acc_compilation && sym_offset >= (int)symbol_size)
bd5635a1 1475 {
7d9884b9
JG
1476 bfd_seek (symfile_bfd, sym_offset - symbol_size, L_INCR);
1477 fill_symbuf (abfd);
bd5635a1 1478 bufp = &symbuf[symbuf_idx++];
7d9884b9 1479 SWAP_SYMBOL (bufp, abfd);
bd5635a1 1480
afe4ca15 1481 SET_NAMESTRING ();
bd5635a1 1482
1aed6766
SG
1483 processing_gcc_compilation = 0;
1484 if (bufp->n_type == N_TEXT)
1485 {
2e4964ad 1486 if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1aed6766 1487 processing_gcc_compilation = 1;
2e4964ad 1488 else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1aed6766
SG
1489 processing_gcc_compilation = 2;
1490 }
3416d90b
FF
1491
1492 /* Try to select a C++ demangling based on the compilation unit
1493 producer. */
1494
1495 if (processing_gcc_compilation)
1496 {
1497#if 1 /* Works, but is experimental. -fnf */
1aed6766 1498 if (AUTO_DEMANGLING)
3416d90b
FF
1499 {
1500 set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1501 }
1502#endif
1503 }
bd5635a1
RP
1504 }
1505 else
1506 {
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. */
7d9884b9 1510 bfd_seek (symfile_bfd, sym_offset, L_INCR);
bd5635a1
RP
1511 processing_gcc_compilation = 0;
1512 }
1513
1514 if (symbuf_idx == symbuf_end)
7d9884b9 1515 fill_symbuf (abfd);
bd5635a1
RP
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");
1519
afe4ca15
JG
1520 max_symnum = sym_size / symbol_size;
1521
bd5635a1 1522 for (symnum = 0;
afe4ca15 1523 symnum < max_symnum;
bd5635a1
RP
1524 symnum++)
1525 {
1526 QUIT; /* Allow this to be interruptable */
1527 if (symbuf_idx == symbuf_end)
7d9884b9 1528 fill_symbuf(abfd);
bd5635a1 1529 bufp = &symbuf[symbuf_idx++];
7d9884b9 1530 SWAP_SYMBOL (bufp, abfd);
bd5635a1 1531
c0302457 1532 type = bufp->n_type;
bd5635a1 1533
afe4ca15 1534 SET_NAMESTRING ();
bd5635a1 1535
7d9884b9 1536 if (type & N_STAB) {
c55e6167 1537 process_one_symbol (type, bufp->n_desc, bufp->n_value,
2af231b8 1538 namestring, section_offsets, objfile);
7d9884b9 1539 }
bd5635a1
RP
1540 /* We skip checking for a new .o or -l file; that should never
1541 happen in this routine. */
1aed6766 1542 else if (type == N_TEXT)
3416d90b
FF
1543 {
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. */
1aed6766 1549
2e4964ad 1550 if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1aed6766 1551 processing_gcc_compilation = 1;
2e4964ad 1552 else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1aed6766
SG
1553 processing_gcc_compilation = 2;
1554
3416d90b 1555#if 1 /* Works, but is experimental. -fnf */
1aed6766 1556 if (AUTO_DEMANGLING)
3416d90b
FF
1557 {
1558 set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1559 }
1560#endif
1561 }
bd5635a1
RP
1562 else if (type & N_EXT || type == (unsigned char)N_TEXT
1563 || type == (unsigned char)N_NBTEXT
0c4d2cc2 1564 ) {
bd5635a1
RP
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
1573 section. */
1574 ;
0c4d2cc2 1575 }
bd5635a1 1576 }
9404978d 1577
021959e2 1578 current_objfile = NULL;
9342ecb9
JG
1579
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;
1585
3416d90b
FF
1586 rtn = end_symtab (text_offset + text_size, 0, 0, objfile);
1587 end_stabs ();
1588 return (rtn);
bd5635a1 1589}
bd5635a1 1590\f
c55e6167
JG
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.
1593
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.
2af231b8
JG
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.
9342ecb9 1602 OBJFILE is the object file from which we are reading symbols.
c55e6167
JG
1603 It is used in end_symtab. */
1604
7e258d18 1605void
2af231b8 1606process_one_symbol (type, desc, valu, name, section_offsets, objfile)
bd5635a1
RP
1607 int type, desc;
1608 CORE_ADDR valu;
1609 char *name;
2af231b8 1610 struct section_offsets *section_offsets;
9342ecb9 1611 struct objfile *objfile;
bd5635a1
RP
1612{
1613#ifndef SUN_FIXED_LBRAC_BUG
0cf9329b 1614 /* This records the last pc address we've seen. We depend on there being
bd5635a1
RP
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;
1618#endif
1619 register struct context_stack *new;
9342ecb9
JG
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
2af231b8
JG
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. */
9342ecb9 1625 static CORE_ADDR function_start_offset;
bd5635a1
RP
1626 char *colon_pos;
1627
51b80b00
FF
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);
1632#endif
1633
bd5635a1
RP
1634 /* Something is wrong if we see real data before
1635 seeing a source file name. */
1636
3416d90b 1637 if (last_source_file == NULL && type != (unsigned char)N_SO)
bd5635a1
RP
1638 {
1639 /* Currently this ignores N_ENTRY on Gould machines, N_NSYM on machines
1640 where that code is defined. */
1641 if (IGNORE_SYMBOL (type))
1642 return;
1643
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.");
1647 }
1648
1649 switch (type)
1650 {
1651 case N_FUN:
1652 case N_FNAME:
0bd83fd7 1653#if 0
3c03b5de
SG
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
4c7c6bab 1656 stuff straightened out with psymtabs. FIXME. */
0bd83fd7 1657
3c03b5de
SG
1658 case N_GSYM:
1659 case N_STSYM:
0bd83fd7 1660#endif /* 0 */
3c03b5de 1661
2af231b8
JG
1662 /* Relocate for dynamic loading */
1663 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
c55e6167 1664
bd5635a1
RP
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. */
1671
bd5635a1
RP
1672 colon_pos = strchr (name, ':');
1673 if (!colon_pos++
1674 || (*colon_pos != 'f' && *colon_pos != 'F'))
1675 {
9342ecb9 1676 define_symbol (valu, name, desc, type, objfile);
bd5635a1
RP
1677 break;
1678 }
1679
3c03b5de
SG
1680#ifndef SUN_FIXED_LBRAC_BUG
1681 last_pc_address = valu; /* Save for SunOS bug circumcision */
1682#endif
1683
9342ecb9
JG
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. */
8f86a4e4 1690 function_start_offset = valu;
9342ecb9
JG
1691#endif
1692
bd5635a1
RP
1693 within_function = 1;
1694 if (context_stack_depth > 0)
1695 {
7d9884b9 1696 new = pop_context ();
bd5635a1
RP
1697 /* Make a block for the local symbols within. */
1698 finish_block (new->name, &local_symbols, new->old_blocks,
9342ecb9 1699 new->start_addr, valu, objfile);
bd5635a1
RP
1700 }
1701 /* Stack must be empty now. */
1702 if (context_stack_depth != 0)
51b80b00 1703 complain (&lbrac_unmatched_complaint, symnum);
bd5635a1 1704
7d9884b9 1705 new = push_context (0, valu);
9342ecb9 1706 new->name = define_symbol (valu, name, desc, type, objfile);
bd5635a1
RP
1707 break;
1708
bd5635a1
RP
1709 case N_LBRAC:
1710 /* This "symbol" just indicates the start of an inner lexical
1711 context within a function. */
1712
9342ecb9
JG
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;
c55e6167 1716#else
bd5635a1
RP
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;
1720#endif
1721
1722#ifndef SUN_FIXED_LBRAC_BUG
1723 if (valu < last_pc_address) {
1724 /* Patch current LBRAC pc value to match last handy pc value */
51b80b00 1725 complain (&lbrac_complaint);
bd5635a1
RP
1726 valu = last_pc_address;
1727 }
1728#endif
7d9884b9 1729 new = push_context (desc, valu);
bd5635a1
RP
1730 break;
1731
1732 case N_RBRAC:
1733 /* This "symbol" just indicates the end of an inner lexical
1734 context that was started with N_LBRAC. */
1735
9342ecb9
JG
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;
c55e6167 1739#else
bd5635a1
RP
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;
1743#endif
1744
7d9884b9 1745 new = pop_context();
bd5635a1 1746 if (desc != new->depth)
51b80b00 1747 complain (&lbrac_mismatch_complaint, symnum);
bd5635a1
RP
1748
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.
0cf9329b
PB
1752 GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
1753 or the GCC2_COMPILED_SYMBOL. */
bd5635a1
RP
1754#if !defined (VARIABLES_INSIDE_BLOCK)
1755#define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
1756#endif
1757
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;
1762
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.
1766
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
1771 of the function. */
1772 if (local_symbols
1773 && (context_stack_depth
1774 > !VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation)))
1775 {
1776 /* FIXME Muzzle a compiler bug that makes end < start. */
1777 if (new->start_addr > valu)
1778 {
51b80b00 1779 complain (&lbrac_rbrac_complaint);
bd5635a1
RP
1780 new->start_addr = valu;
1781 }
1782 /* Make a block for the local symbols within. */
1783 finish_block (0, &local_symbols, new->old_blocks,
9342ecb9 1784 new->start_addr, valu, objfile);
bd5635a1
RP
1785 }
1786 else
1787 {
1788 within_function = 0;
1789 }
1790 if (VARIABLES_INSIDE_BLOCK(desc, processing_gcc_compilation))
1791 /* Now pop locals of block just finished. */
1792 local_symbols = new->locals;
1793 break;
1794
9bb30452 1795 case N_FN:
6150cc73 1796 case N_FN_SEQ:
9bb30452 1797 /* This kind of symbol indicates the start of an object file. */
2af231b8
JG
1798 /* Relocate for dynamic loading */
1799 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
bd5635a1
RP
1800 break;
1801
1802 case N_SO:
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. */
2af231b8
JG
1807 /* Relocate for dynamic loading */
1808 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
c55e6167 1809
bd5635a1
RP
1810#ifndef SUN_FIXED_LBRAC_BUG
1811 last_pc_address = valu; /* Save for SunOS bug circumcision */
1812#endif
1813
1814#ifdef PCC_SOL_BROKEN
1815 /* pcc bug, occasionally puts out SO for SOL. */
1816 if (context_stack_depth > 0)
1817 {
1818 start_subfile (name, NULL);
1819 break;
1820 }
1821#endif
1822 if (last_source_file)
7e258d18
PB
1823 {
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.
1827 Patch things up. */
c72af089 1828 if (previous_stab_code == N_SO)
7e258d18 1829 {
3416d90b 1830 patch_subfile_names (current_subfile, name);
c72af089 1831 break; /* Ignore repeated SOs */
7e258d18 1832 }
4ed3a9ea 1833 end_symtab (valu, 0, 0, objfile);
3416d90b 1834 end_stabs ();
7e258d18 1835 }
3416d90b 1836 start_stabs ();
bd5635a1
RP
1837 start_symtab (name, NULL, valu);
1838 break;
1839
c55e6167 1840
bd5635a1
RP
1841 case N_SOL:
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.) */
2af231b8
JG
1846 /* Relocate for dynamic loading */
1847 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
784fd92b 1848 start_subfile (name, current_subfile->dirname);
bd5635a1
RP
1849 break;
1850
1851 case N_BINCL:
1852 push_subfile ();
1853 add_new_header_file (name, valu);
784fd92b 1854 start_subfile (name, current_subfile->dirname);
bd5635a1
RP
1855 break;
1856
1857 case N_EINCL:
784fd92b 1858 start_subfile (pop_subfile (), current_subfile->dirname);
bd5635a1
RP
1859 break;
1860
1861 case N_EXCL:
1862 add_old_header_file (name, valu);
1863 break;
1864
1865 case N_SLINE:
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. */
9342ecb9
JG
1869 /* Relocate for dynamic loading and for ELF acc fn-relative syms. */
1870 valu += function_start_offset;
bd5635a1
RP
1871#ifndef SUN_FIXED_LBRAC_BUG
1872 last_pc_address = valu; /* Save for SunOS bug circumcision */
1873#endif
4137c5fc 1874 record_line (current_subfile, desc, valu);
bd5635a1
RP
1875 break;
1876
1877 case N_BCOMM:
1878 if (common_block)
1879 error ("Invalid symbol data: common within common at symtab pos %d",
1880 symnum);
1881 common_block = local_symbols;
1882 common_block_i = local_symbols ? local_symbols->nsyms : 0;
1883 break;
1884
1885 case N_ECOMM:
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
1890 for later fixup. */
1891 {
1892 int i;
1893 struct symbol *sym =
9342ecb9 1894 (struct symbol *) xmmalloc (objfile -> md, sizeof (struct symbol));
4ed3a9ea 1895 memset (sym, 0, sizeof *sym);
bd5635a1
RP
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;
1903 common_block = 0;
1904 break;
1905 }
1906
2af231b8
JG
1907 /* The following symbol types need to have the appropriate offset added
1908 to their value; then we process symbol definitions in the name. */
1909
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). */
1921 {
1922 char *p;
1923 p = strchr (name, ':');
1924 if (p != 0 && p[1] == 'S')
1925 {
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;
1931 }
1932 /* Since it's not the kludge case, re-dispatch to the right handler. */
1933 switch (type) {
1934 case N_STSYM: goto case_N_STSYM;
1935 case N_LCSYM: goto case_N_LCSYM;
1936 case N_ROSYM: goto case_N_ROSYM;
1937 default: abort();
1938 }
1939 }
1940
1941 case_N_STSYM: /* Static symbol in data seg */
c55e6167 1942 case N_DSLINE: /* Source line number, data seg */
2af231b8
JG
1943 valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
1944 goto define_a_symbol;
1945
1946 case_N_LCSYM: /* Static symbol in BSS seg */
c55e6167
JG
1947 case N_BSLINE: /* Source line number, bss seg */
1948 /* N_BROWS: overlaps with N_BSLINE */
2af231b8
JG
1949 valu += ANOFFSET (section_offsets, SECT_OFF_BSS);
1950 goto define_a_symbol;
1951
1952 case_N_ROSYM: /* Static symbol in Read-only data seg */
1953 valu += ANOFFSET (section_offsets, SECT_OFF_RODATA);
1954 goto define_a_symbol;
1955
c55e6167 1956 case N_ENTRY: /* Alternate entry point */
2af231b8
JG
1957 /* Relocate for dynamic loading */
1958 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1959 goto define_a_symbol;
c55e6167
JG
1960
1961 /* The following symbol types don't need the address field relocated,
1962 since it is either unused, or is absolute. */
2af231b8 1963 define_a_symbol:
c55e6167
JG
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 */
1973 if (name)
9342ecb9 1974 define_symbol (valu, name, desc, type, objfile);
bd5635a1
RP
1975 break;
1976
ec8ceca3
JG
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 */
1981 if (name)
1982 {
2e4964ad 1983 if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
3416d90b 1984 {
1aed6766 1985 processing_gcc_compilation = 2;
3416d90b 1986#if 1 /* Works, but is experimental. -fnf */
1aed6766 1987 if (AUTO_DEMANGLING)
3416d90b
FF
1988 {
1989 set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1990 }
1991#endif
1992 }
ec8ceca3
JG
1993 }
1994 break;
1995
bcbf9559
JG
1996 /* The following symbol types can be ignored. */
1997 case N_OBJ: /* Solaris 2: Object file dir and name */
bcbf9559
JG
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. */
4c7c6bab
JG
2001 case N_ENDM: /* Solaris 2: End of module */
2002 case N_MAIN: /* Name of main routine. */
9342ecb9
JG
2003 break;
2004
c55e6167
JG
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. */
bd5635a1 2007 default:
2af231b8 2008 case N_CATCH: /* Exception handler catcher */
c55e6167 2009 case N_EHDECL: /* Exception handler name */
c55e6167
JG
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??? */
2016 case N_NBDATA:
2017 case N_NBBSS:
2018 case N_NBSTS:
2019 case N_NBLCS:
2020 complain (&unknown_symtype_complaint, local_hex_string(type));
bd5635a1 2021 if (name)
9342ecb9 2022 define_symbol (valu, name, desc, type, objfile);
bd5635a1 2023 }
7e258d18
PB
2024
2025 previous_stab_code = type;
bd5635a1
RP
2026}
2027\f
bd5635a1
RP
2028/* Copy a pending list, used to record the contents of a common
2029 block for later fixup. */
2030static struct pending *
2031copy_pending (beg, begi, end)
021959e2 2032 struct pending *beg;
bd5635a1 2033 int begi;
021959e2 2034 struct pending *end;
bd5635a1
RP
2035{
2036 struct pending *new = 0;
2037 struct pending *next;
2038
2039 for (next = beg; next != 0 && (next != end || begi < end->nsyms);
2040 next = next->next, begi = 0)
2041 {
2042 register int j;
2043 for (j = begi; j < next->nsyms; j++)
2044 add_symbol_to_list (next->symbol[j], &new);
2045 }
2046 return new;
2047}
bd5635a1 2048\f
9342ecb9
JG
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.
2052
2053 This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2054 rolled into one.
2055
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
2062 section exists.
2063 STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2064 .stabstr section exists.
2065
2066 This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2067 adjusted for elf details. */
2068
2069void
1aed6766 2070elfstab_build_psymtabs (objfile, section_offsets, mainline,
9342ecb9 2071 staboffset, stabsize,
1aed6766
SG
2072 stabstroffset, stabstrsize)
2073 struct objfile *objfile;
2074 struct section_offsets *section_offsets;
2075 int mainline;
51b80b00 2076 file_ptr staboffset;
1aed6766 2077 unsigned int stabsize;
51b80b00 2078 file_ptr stabstroffset;
1aed6766 2079 unsigned int stabstrsize;
9342ecb9
JG
2080{
2081 int val;
2082 bfd *sym_bfd = objfile->obfd;
2083 char *name = bfd_get_filename (sym_bfd);
2084 struct dbx_symfile_info *info;
2085
2af231b8
JG
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;
9342ecb9
JG
2089
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");
2093
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;
2099
51db2323
FF
2100 if (stabstrsize < 0 /* FIXME: stabstrsize is unsigned; never true! */
2101 || stabstrsize > bfd_get_size (sym_bfd))
9342ecb9
JG
2102 error ("ridiculous string table size: %d bytes", stabstrsize);
2103 DBX_STRINGTAB (objfile) = (char *)
2104 obstack_alloc (&objfile->psymbol_obstack, stabstrsize+1);
2105
2106 /* Now read in the string table in one big gulp. */
2107
2108 val = bfd_seek (sym_bfd, stabstroffset, L_SET);
2109 if (val < 0)
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);
2114
3416d90b 2115 stabsread_new_init ();
9342ecb9
JG
2116 buildsym_new_init ();
2117 free_header_files ();
2118 init_header_files ();
2119 install_minimal_symbols (objfile);
2120
2121 processing_acc_compilation = 1;
2122
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. */
2af231b8
JG
2126 dbx_symfile_read (objfile, section_offsets, 0);
2127}
2128\f
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. */
2131
2132struct section_offsets *
2133dbx_symfile_offsets (objfile, addr)
2134 struct objfile *objfile;
2135 CORE_ADDR addr;
2136{
2137 struct section_offsets *section_offsets;
2138 int i;
2139
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));
2144
2145 for (i = 0; i < SECT_OFF_MAX; i++)
2146 ANOFFSET (section_offsets, i) = addr;
2147
2148 return section_offsets;
9342ecb9
JG
2149}
2150\f
bd5635a1
RP
2151/* Register our willingness to decode symbols for SunOS and a.out and
2152 b.out files handled by BFD... */
80d68b1d
FF
2153static struct sym_fns sunos_sym_fns =
2154{
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 */
2af231b8 2161 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
80d68b1d
FF
2162 NULL /* next: pointer to next struct sym_fns */
2163};
bd5635a1 2164
80d68b1d
FF
2165static struct sym_fns aout_sym_fns =
2166{
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 */
2af231b8 2173 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
80d68b1d
FF
2174 NULL /* next: pointer to next struct sym_fns */
2175};
bd5635a1 2176
80d68b1d
FF
2177static struct sym_fns bout_sym_fns =
2178{
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 */
2af231b8 2185 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
80d68b1d
FF
2186 NULL /* next: pointer to next struct sym_fns */
2187};
bd5635a1 2188
2af231b8
JG
2189/* This is probably a mistake. FIXME. Why can't the HP's use an ordinary
2190 file format name with an -hppa suffix? */
7da1e27d
SG
2191static struct sym_fns hppa_sym_fns =
2192{
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 */
2af231b8 2199 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
7da1e27d
SG
2200 NULL /* next: pointer to next struct sym_fns */
2201};
2202
bd5635a1
RP
2203void
2204_initialize_dbxread ()
2205{
2206 add_symtab_fns(&sunos_sym_fns);
2207 add_symtab_fns(&aout_sym_fns);
2208 add_symtab_fns(&bout_sym_fns);
7da1e27d 2209 add_symtab_fns(&hppa_sym_fns);
bd5635a1 2210}
This page took 0.19932 seconds and 4 git commands to generate.