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