* buildsym.c (finish_block): Fix thinko `inner block' complaints.
[deliverable/binutils-gdb.git] / gdb / dbxread.c
1 /* Read dbx symbol tables and convert to internal format, for GDB.
2 Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
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 */
33
34 #include "defs.h"
35 #include <string.h>
36
37 #if defined(USG) || defined(__CYGNUSCLIB__)
38 #include <sys/types.h>
39 #include <fcntl.h>
40 #define L_SET 0
41 #define L_INCR 1
42 #endif
43
44 #ifdef hp9000s800
45 /* We don't want to use HP-UX's nlists. */
46 #define _NLIST_INCLUDED
47 #endif
48
49 #include <obstack.h>
50 #include <sys/param.h>
51 #ifndef NO_SYS_FILE
52 #include <sys/file.h>
53 #endif
54 #include <sys/stat.h>
55 #include <ctype.h>
56 #include "symtab.h"
57 #include "breakpoint.h"
58 #include "command.h"
59 #include "target.h"
60 #include "gdbcore.h" /* for bfd stuff */
61 #include "libbfd.h" /* FIXME Secret internal BFD stuff (bfd_read) */
62 #ifdef hp9000s800
63 #include "libhppa.h"
64 #include "syms.h"
65 #else
66 #include "libaout.h" /* FIXME Secret internal BFD stuff for a.out */
67 #endif
68 #include "symfile.h"
69 #include "objfiles.h"
70 #include "buildsym.h"
71 #include "gdb-stabs.h"
72
73 #include "aout/aout64.h"
74 #include "aout/stab_gnu.h" /* We always use GNU stabs, not native, now */
75
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
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. */
88
89 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
90 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
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)
96
97 struct symloc {
98 int ldsymoff;
99 int ldsymlen;
100 int symbol_size;
101 int symbol_offset;
102 int string_offset;
103 int file_string_offset;
104 };
105
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
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
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
131
132 /* Nonzero means give verbose info on gdb action. From main.c. */
133 extern int info_verbose;
134
135 /* The BFD for this file -- implicit parameter to next_symbol_text. */
136
137 static bfd *symfile_bfd;
138
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
143 static unsigned symbol_size;
144
145 /* This is the offset of the symbol table in the executable file */
146 static unsigned symbol_table_offset;
147
148 /* This is the offset of the string table in the executable file */
149 static 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. */
156 static unsigned int file_string_table_offset;
157 static unsigned int next_file_string_table_offset;
158
159 /* Complaints about the symbols we have encountered. */
160
161 struct complaint lbrac_complaint =
162 {"bad block start address patched", 0, 0};
163
164 struct complaint string_table_offset_complaint =
165 {"bad string table offset in symbol %d", 0, 0};
166
167 struct complaint unknown_symtype_complaint =
168 {"unknown symbol type %s", 0, 0};
169
170 struct complaint lbrac_rbrac_complaint =
171 {"block start larger than block end", 0, 0};
172
173 struct complaint lbrac_unmatched_complaint =
174 {"unmatched N_LBRAC before symtab pos %d", 0, 0};
175
176 struct complaint lbrac_mismatch_complaint =
177 {"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
178
179 struct complaint repeated_header_complaint =
180 {"\"repeated\" header file not previously seen, at symtab pos %d", 0, 0};
181
182 struct complaint repeated_header_name_complaint =
183 {"\"repeated\" header file not previously seen, named %s", 0, 0};
184 \f
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
190 struct 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 */
199 static struct header_file_location *bincl_list, *next_bincl;
200 static int bincls_allocated;
201
202 /* Local function prototypes */
203
204 static void
205 free_header_files PARAMS ((void));
206
207 static void
208 init_header_files PARAMS ((void));
209
210 static struct pending *
211 copy_pending PARAMS ((struct pending *, int, struct pending *));
212
213 static struct symtab *
214 read_ofile_symtab PARAMS ((struct objfile *, int, int, CORE_ADDR, int,
215 struct section_offsets *));
216
217 static void
218 dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *));
219
220 static void
221 dbx_psymtab_to_symtab_1 PARAMS ((struct partial_symtab *));
222
223 static void
224 read_dbx_symtab PARAMS ((struct section_offsets *, struct objfile *,
225 CORE_ADDR, int));
226
227 static void
228 free_bincl_list PARAMS ((struct objfile *));
229
230 static struct partial_symtab *
231 find_corresponding_bincl_psymtab PARAMS ((char *, int));
232
233 static void
234 add_bincl_to_list PARAMS ((struct partial_symtab *, char *, int));
235
236 static void
237 init_bincl_list PARAMS ((int, struct objfile *));
238
239 static void
240 init_psymbol_list PARAMS ((struct objfile *));
241
242 static char *
243 dbx_next_symbol_text PARAMS ((void));
244
245 static void
246 fill_symbuf PARAMS ((bfd *));
247
248 static void
249 dbx_symfile_init PARAMS ((struct objfile *));
250
251 static void
252 dbx_new_init PARAMS ((struct objfile *));
253
254 static void
255 dbx_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
256
257 static void
258 dbx_symfile_finish PARAMS ((struct objfile *));
259
260 static void
261 record_minimal_symbol PARAMS ((char *, CORE_ADDR, int, struct objfile *));
262
263 static void
264 add_new_header_file PARAMS ((char *, int));
265
266 static void
267 add_old_header_file PARAMS ((char *, int));
268
269 static void
270 add_this_object_header_file PARAMS ((int));
271
272 /* Free up old header file tables */
273
274 static void
275 free_header_files ()
276 {
277 register int i;
278
279 if (header_files != NULL)
280 {
281 for (i = 0; i < n_header_files; i++)
282 {
283 free (header_files[i].name);
284 }
285 free ((PTR)header_files);
286 header_files = NULL;
287 n_header_files = 0;
288 }
289 if (this_object_header_files)
290 {
291 free ((PTR)this_object_header_files);
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
300 static void
301 init_header_files ()
302 {
303 n_header_files = 0;
304 n_allocated_header_files = 10;
305 header_files = (struct header_file *)
306 xmalloc (10 * sizeof (struct header_file));
307
308 n_allocated_this_object_header_files = 10;
309 this_object_header_files = (int *) xmalloc (10 * sizeof (int));
310 }
311
312 /* Add header file number I for this object file
313 at the next successive FILENUM. */
314
315 static void
316 add_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
323 = (int *) xrealloc ((char *) this_object_header_files,
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
335 static void
336 add_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 }
349 complain (&repeated_header_complaint, (char *)symnum);
350 complain (&repeated_header_name_complaint, name);
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
364 static void
365 add_new_header_file (name, instance)
366 char *name;
367 int instance;
368 {
369 register int i;
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 *)
377 xrealloc ((char *) header_files,
378 (n_allocated_header_files * sizeof (struct header_file)));
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 *));
389 memset (header_files[i].vector, 0, 10 * sizeof (struct type *));
390
391 add_this_object_header_file (i);
392 }
393
394 #if 0
395 static struct type **
396 explicit_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
413 static void
414 record_minimal_symbol (name, address, type, objfile)
415 char *name;
416 CORE_ADDR address;
417 int type;
418 struct objfile *objfile;
419 {
420 enum minimal_symbol_type ms_type;
421
422 switch (type &~ N_EXT) {
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;
427 #ifdef N_SETV
428 case N_SETV: ms_type = mst_data; break;
429 #endif
430 default: ms_type = mst_unknown; break;
431 }
432
433 prim_record_minimal_symbol (obsavestring (name, strlen (name), &objfile -> symbol_obstack),
434 address, ms_type);
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
439 put all the relevant info into a "struct dbx_symfile_info",
440 hung off the objfile structure.
441
442 SECTION_OFFSETS contains offsets relative to which the symbols in the
443 various sections are (depending where the sections were actually loaded).
444 MAINLINE is true if we are reading the main symbol
445 table (as opposed to a shared lib or dynamically loaded file). */
446
447 static void
448 dbx_symfile_read (objfile, section_offsets, mainline)
449 struct objfile *objfile;
450 struct section_offsets *section_offsets;
451 int mainline; /* FIXME comments above */
452 {
453 bfd *sym_bfd;
454 int val;
455
456 sym_bfd = objfile->obfd;
457 val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), L_SET);
458 if (val < 0)
459 perror_with_name (objfile->name);
460
461 /* If we are reinitializing, or if we have never loaded syms yet, init */
462 if (mainline || objfile->global_psymbols.size == 0 || objfile->static_psymbols.size == 0)
463 init_psymbol_list (objfile);
464
465 #ifdef hp9000s800
466 symbol_size = obj_dbx_symbol_entry_size (sym_bfd);
467 #else
468 symbol_size = DBX_SYMBOL_SIZE (objfile);
469 #endif
470 symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
471
472 pending_blocks = 0;
473 make_cleanup (really_free_pendings, 0);
474
475 init_minimal_symbol_collection ();
476 make_cleanup (discard_minimal_symbols, 0);
477
478 /* Now that the symbol table data of the executable file are all in core,
479 process them and define symbols accordingly. */
480
481 read_dbx_symtab (section_offsets, objfile,
482 bfd_section_vma (sym_bfd, DBX_TEXT_SECT (objfile)),
483 bfd_section_size (sym_bfd, DBX_TEXT_SECT (objfile)));
484
485 /* Install any minimal symbols that have been collected as the current
486 minimal symbols for this objfile. */
487
488 install_minimal_symbols (objfile);
489
490 if (!have_partial_symbols ()) {
491 wrap_here ("");
492 printf_filtered ("(no debugging symbols found)...");
493 wrap_here ("");
494 }
495 }
496
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). */
500
501 static void
502 dbx_new_init (ignore)
503 struct objfile *ignore;
504 {
505 buildsym_new_init ();
506 init_header_files ();
507 }
508
509
510 /* dbx_symfile_init ()
511 is the dbx-specific initialization routine for reading symbols.
512 It is passed a struct objfile which contains, among other things,
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
523 static void
524 dbx_symfile_init (objfile)
525 struct objfile *objfile;
526 {
527 int val;
528 bfd *sym_bfd = objfile->obfd;
529 char *name = bfd_get_filename (sym_bfd);
530 unsigned char size_temp[4];
531
532 /* Allocate struct to keep track of the symfile */
533 objfile->sym_private = (PTR)
534 xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
535
536 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
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
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))
545 #endif
546 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
547
548 DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
549 if (!DBX_TEXT_SECT (objfile))
550 error ("Can't find .text section in symbol file");
551
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
556 DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
557 DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
558 #endif
559 DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
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. */
572
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
577 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
578 if (val < 0)
579 perror_with_name (name);
580
581 val = bfd_read ((PTR)size_temp, sizeof (long), 1, sym_bfd);
582 if (val < 0)
583 perror_with_name (name);
584
585 DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
586 #endif
587
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));
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
604
605 /* Now read in the string table in one big gulp. */
606
607 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
608 if (val < 0)
609 perror_with_name (name);
610 val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
611 sym_bfd);
612 if (val != DBX_STRINGTAB_SIZE (objfile))
613 perror_with_name (name);
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
626 }
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
633 static void
634 dbx_symfile_finish (objfile)
635 struct objfile *objfile;
636 {
637 if (objfile->sym_private != NULL)
638 {
639 mfree (objfile -> md, objfile->sym_private);
640 }
641 free_header_files ();
642 }
643
644 \f
645 /* Buffer for reading the symbol table entries. */
646 static struct internal_nlist symbuf[4096];
647 static int symbuf_idx;
648 static int symbuf_end;
649
650 /* Name of last function encountered. Used in Solaris to approximate
651 object file boundaries. */
652 static char *last_function_name;
653
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. */
659 static 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
667 static void
668 fill_symbuf (sym_bfd)
669 bfd *sym_bfd;
670 {
671 int nbytes = bfd_read ((PTR)symbuf, sizeof (symbuf), 1, sym_bfd);
672 if (nbytes < 0)
673 perror_with_name (bfd_get_filename (sym_bfd));
674 else if (nbytes == 0)
675 error ("Premature end of file reading symbol table");
676 symbuf_end = nbytes / symbol_size;
677 symbuf_idx = 0;
678 }
679 #ifdef hp9000s800
680 /* same as above for the HP symbol table */
681
682 static struct symbol_dictionary_record hp_symbuf[4096];
683 static int hp_symbuf_idx;
684 static int hp_symbuf_end;
685
686 static int
687 fill_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
698
699 #define SWAP_SYMBOL(symp, abfd) \
700 { \
701 (symp)->n_strx = bfd_h_get_32(abfd, \
702 (unsigned char *)&(symp)->n_strx); \
703 (symp)->n_desc = bfd_h_get_16 (abfd, \
704 (unsigned char *)&(symp)->n_desc); \
705 (symp)->n_value = bfd_h_get_32 (abfd, \
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
718 static char *
719 dbx_next_symbol_text ()
720 {
721 if (symbuf_idx == symbuf_end)
722 fill_symbuf (symfile_bfd);
723 symnum++;
724 SWAP_SYMBOL(&symbuf[symbuf_idx], symfile_bfd);
725 return symbuf[symbuf_idx++].n_strx + stringtab_global
726 + file_string_table_offset;
727 }
728 \f
729 /* Initializes storage for all of the partial symbols that will be
730 created by read_dbx_symtab and subsidiaries. */
731
732 static void
733 init_psymbol_list (objfile)
734 struct objfile *objfile;
735 {
736 /* Free any previously allocated psymbol lists. */
737 if (objfile -> global_psymbols.list)
738 mfree (objfile -> md, (PTR)objfile -> global_psymbols.list);
739 if (objfile -> static_psymbols.list)
740 mfree (objfile -> md, (PTR)objfile -> static_psymbols.list);
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 */
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
751 objfile -> global_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
752 objfile -> static_psymbols.size = DBX_SYMCOUNT (objfile) / 10;
753 #endif
754 objfile -> global_psymbols.next = objfile -> global_psymbols.list = (struct partial_symbol *)
755 xmmalloc (objfile -> md, objfile -> global_psymbols.size * sizeof (struct partial_symbol));
756 objfile -> static_psymbols.next = objfile -> static_psymbols.list = (struct partial_symbol *)
757 xmmalloc (objfile -> md, objfile -> static_psymbols.size * sizeof (struct partial_symbol));
758 }
759
760 /* Initialize the list of bincls to contain none and have some
761 allocated. */
762
763 static void
764 init_bincl_list (number, objfile)
765 int number;
766 struct objfile *objfile;
767 {
768 bincls_allocated = number;
769 next_bincl = bincl_list = (struct header_file_location *)
770 xmmalloc (objfile -> md, bincls_allocated * sizeof(struct header_file_location));
771 }
772
773 /* Add a bincl to the list. */
774
775 static void
776 add_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 *)
786 xmrealloc (pst->objfile->md, (char *)bincl_list,
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
799 static struct partial_symtab *
800 find_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
816 static void
817 free_bincl_list (objfile)
818 struct objfile *objfile;
819 {
820 mfree (objfile -> md, (PTR)bincl_list);
821 bincls_allocated = 0;
822 }
823
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
826 which debugging information is available.
827 SYMFILE_NAME is the name of the file we are reading from
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). */
830
831 static void
832 read_dbx_symtab (section_offsets, objfile, text_addr, text_size)
833 struct section_offsets *section_offsets;
834 struct objfile *objfile;
835 CORE_ADDR text_addr;
836 int text_size;
837 {
838 register struct internal_nlist *bufp = 0; /* =0 avoids gcc -Wall glitch */
839 register char *namestring;
840 int nsl;
841 int past_first_source_file = 0;
842 CORE_ADDR last_o_file_start = 0;
843 struct cleanup *old_chain;
844 bfd *abfd;
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
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
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
874 #ifdef hp9000s800
875 stringtab_global = HP_STRINGTAB (objfile);
876 #else
877 stringtab_global = DBX_STRINGTAB (objfile);
878 #endif
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
893 old_chain = make_cleanup (free_objfile, objfile);
894
895 /* Init bincl list */
896 init_bincl_list (20, objfile);
897 make_cleanup (free_bincl_list, objfile);
898
899 last_source_file = 0;
900
901 #ifdef END_OF_TEXT_DEFAULT
902 end_of_text_addr = END_OF_TEXT_DEFAULT;
903 #else
904 end_of_text_addr = text_addr + section_offsets->offsets[SECT_OFF_TEXT]
905 + text_size; /* Relocate */
906 #endif
907
908 symfile_bfd = objfile->obfd; /* For next_text_symbol */
909 abfd = objfile->obfd;
910 symbuf_end = symbuf_idx = 0;
911 next_symbol_text_func = dbx_next_symbol_text;
912
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
982 for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
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)
987 fill_symbuf (abfd);
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
995 SWAP_SYMBOL (bufp, abfd);
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. */
1012
1013 /*FIXME: Too many adds and indirections in here for the inner loop. */
1014 #define SET_NAMESTRING()\
1015 if (((unsigned)bufp->n_strx + file_string_table_offset) >= \
1016 DBX_STRINGTAB_SIZE (objfile)) { \
1017 complain (&string_table_offset_complaint, (char *) symnum); \
1018 namestring = "foo"; \
1019 } else \
1020 namestring = bufp->n_strx + file_string_table_offset + \
1021 DBX_STRINGTAB (objfile)
1022
1023 #define CUR_SYMBOL_TYPE bufp->n_type
1024 #define CUR_SYMBOL_VALUE bufp->n_value
1025 #define DBXREAD_ONLY
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)
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)
1030
1031 #include "partial-stab.h"
1032 }
1033
1034 /* If there's stuff to be cleaned up, clean it up. */
1035 #ifndef hp9000s800
1036 if (DBX_SYMCOUNT (objfile) > 0 /* We have some syms */
1037 /*FIXME, does this have a bug at start address 0? */
1038 && last_o_file_start
1039 && objfile -> ei.entry_point < bufp->n_value
1040 && objfile -> ei.entry_point >= last_o_file_start)
1041 {
1042 objfile -> ei.entry_file_lowpc = last_o_file_start;
1043 objfile -> ei.entry_file_highpc = bufp->n_value;
1044 }
1045 #endif
1046
1047 if (pst)
1048 {
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
1054 end_psymtab (pst, psymtab_include_list, includes_used,
1055 symnum * symbol_size, end_of_text_addr,
1056 dependency_list, dependencies_used);
1057 #endif
1058 }
1059
1060 free_bincl_list (objfile);
1061 discard_cleanups (old_chain);
1062 }
1063
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
1071
1072 struct partial_symtab *
1073 start_psymtab (objfile, section_offsets,
1074 filename, textlow, ldsymoff, global_syms, static_syms)
1075 struct objfile *objfile;
1076 struct section_offsets *section_offsets;
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 =
1084 start_psymtab_common(objfile, section_offsets,
1085 filename, textlow, global_syms, static_syms);
1086
1087 result->read_symtab_private = (char *)
1088 obstack_alloc (&objfile -> psymbol_obstack, sizeof (struct symloc));
1089 LDSYMOFF(result) = ldsymoff;
1090 result->read_symtab = dbx_psymtab_to_symtab;
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;
1095
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
1102 return result;
1103 }
1104
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 */
1116
1117 void
1118 end_psymtab (pst, include_list, num_includes, capping_symbol_offset,
1119 capping_text, dependency_list, number_dependencies)
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;
1127 /* struct partial_symbol *capping_global, *capping_static;*/
1128 {
1129 int i;
1130 struct partial_symtab *p1;
1131 struct objfile *objfile = pst -> objfile;
1132
1133 if (capping_symbol_offset != -1)
1134 LDSYMLEN(pst) = capping_symbol_offset - LDSYMOFF(pst);
1135 pst->texthigh = capping_text;
1136
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
1160 if (pst->texthigh == 0 && last_function_name) {
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
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. */
1209 if (pst->textlow) {
1210 ALL_OBJFILE_PSYMTABS (objfile, p1) {
1211 if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst) {
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
1223 pst->n_global_syms =
1224 objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1225 pst->n_static_syms =
1226 objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1227
1228 pst->number_of_dependencies = number_dependencies;
1229 if (number_dependencies)
1230 {
1231 pst->dependencies = (struct partial_symtab **)
1232 obstack_alloc (&objfile->psymbol_obstack,
1233 number_dependencies * sizeof (struct partial_symtab *));
1234 memcpy (pst->dependencies, dependency_list,
1235 number_dependencies * sizeof (struct partial_symtab *));
1236 }
1237 else
1238 pst->dependencies = 0;
1239
1240 for (i = 0; i < num_includes; i++)
1241 {
1242 struct partial_symtab *subpst =
1243 allocate_psymtab (include_list[i], objfile);
1244
1245 subpst->section_offsets = pst->section_offsets;
1246 subpst->read_symtab_private =
1247 (char *) obstack_alloc (&objfile->psymbol_obstack,
1248 sizeof (struct symloc));
1249 LDSYMOFF(subpst) =
1250 LDSYMLEN(subpst) =
1251 subpst->textlow =
1252 subpst->texthigh = 0;
1253
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. */
1256 subpst->dependencies = (struct partial_symtab **)
1257 obstack_alloc (&objfile->psymbol_obstack,
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;
1268 subpst->symtab = 0;
1269 subpst->read_symtab = dbx_psymtab_to_symtab;
1270 }
1271
1272 sort_pst_symbols (pst);
1273
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
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. */
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;
1300 }
1301 }
1302 \f
1303 static void
1304 dbx_psymtab_to_symtab_1 (pst)
1305 struct partial_symtab *pst;
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
1320 /* Read in all partial symtabs on which this one is dependent */
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 }
1335 dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
1336 }
1337
1338 if (LDSYMLEN(pst)) /* Otherwise it's a dummy */
1339 {
1340 /* Init stuff necessary for reading in symbols */
1341 buildsym_init ();
1342 old_chain = make_cleanup (really_free_pendings, 0);
1343 file_string_table_offset = FILE_STRING_OFFSET (pst);
1344 #ifdef hp9000s800
1345 symbol_size = obj_dbx_symbol_entry_size (sym_bfd);
1346 #else
1347 symbol_size = SYMBOL_SIZE (pst);
1348 #endif
1349
1350 /* Read in this file's symbols */
1351 bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), L_SET);
1352 pst->symtab =
1353 read_ofile_symtab (pst->objfile, LDSYMOFF(pst), LDSYMLEN(pst),
1354 pst->textlow, pst->texthigh - pst->textlow,
1355 pst->section_offsets);
1356 sort_symtab_syms (pst->symtab);
1357
1358 do_cleanups (old_chain);
1359 }
1360
1361 pst->readin = 1;
1362 }
1363
1364 /* Read in all of the symbols for a given psymtab for real.
1365 Be verbose about it if the user wants that. */
1366
1367 static void
1368 dbx_psymtab_to_symtab (pst)
1369 struct partial_symtab *pst;
1370 {
1371 bfd *sym_bfd;
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
1383 if (LDSYMLEN(pst) || pst->number_of_dependencies)
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
1393 sym_bfd = pst->objfile->obfd;
1394
1395 next_symbol_text_func = dbx_next_symbol_text;
1396
1397 dbx_psymtab_to_symtab_1 (pst);
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. */
1401 scan_file_globals (pst->objfile);
1402
1403 /* Finish up the debug error message. */
1404 if (info_verbose)
1405 printf_filtered ("done.\n");
1406 }
1407 }
1408
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.
1418 SECTION_OFFSETS are the relocation offsets which get added to each symbol. */
1419
1420 static struct symtab *
1421 read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
1422 section_offsets)
1423 struct objfile *objfile;
1424 int sym_offset;
1425 int sym_size;
1426 CORE_ADDR text_offset;
1427 int text_size;
1428 struct section_offsets *section_offsets;
1429 {
1430 register char *namestring;
1431 register struct internal_nlist *bufp;
1432 unsigned char type;
1433 unsigned max_symnum;
1434 register bfd *abfd;
1435
1436 current_objfile = objfile;
1437 subfile_stack = 0;
1438
1439 #ifdef hp9000s800
1440 stringtab_global = HP_STRINGTAB (objfile);
1441 #else
1442 stringtab_global = DBX_STRINGTAB (objfile);
1443 #endif
1444 last_source_file = 0;
1445
1446 abfd = objfile->obfd;
1447 symfile_bfd = objfile->obfd; /* Implicit param to next_text_symbol */
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. */
1456 if (!processing_acc_compilation && sym_offset >= (int)symbol_size)
1457 {
1458 bfd_seek (symfile_bfd, sym_offset - symbol_size, L_INCR);
1459 fill_symbuf (abfd);
1460 bufp = &symbuf[symbuf_idx++];
1461 SWAP_SYMBOL (bufp, abfd);
1462
1463 SET_NAMESTRING ();
1464
1465 processing_gcc_compilation =
1466 (bufp->n_type == N_TEXT
1467 && (strcmp (namestring, GCC_COMPILED_FLAG_SYMBOL) == 0
1468 || strcmp(namestring, GCC2_COMPILED_FLAG_SYMBOL) == 0));
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. */
1475 bfd_seek (symfile_bfd, sym_offset, L_INCR);
1476 processing_gcc_compilation = 0;
1477 }
1478
1479 if (symbuf_idx == symbuf_end)
1480 fill_symbuf (abfd);
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
1485 max_symnum = sym_size / symbol_size;
1486
1487 for (symnum = 0;
1488 symnum < max_symnum;
1489 symnum++)
1490 {
1491 QUIT; /* Allow this to be interruptable */
1492 if (symbuf_idx == symbuf_end)
1493 fill_symbuf(abfd);
1494 bufp = &symbuf[symbuf_idx++];
1495 SWAP_SYMBOL (bufp, abfd);
1496
1497 type = bufp->n_type;
1498
1499 SET_NAMESTRING ();
1500
1501 if (type & N_STAB) {
1502 process_one_symbol (type, bufp->n_desc, bufp->n_value,
1503 namestring, section_offsets, objfile);
1504 }
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
1508 && (strcmp (namestring, GCC_COMPILED_FLAG_SYMBOL) == 0
1509 || strcmp (namestring, GCC2_COMPILED_FLAG_SYMBOL) == 0))
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
1518 ) {
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 ;
1529 }
1530 }
1531
1532 current_objfile = NULL;
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);
1541 }
1542 \f
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.
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.
1554 OBJFILE is the object file from which we are reading symbols.
1555 It is used in end_symtab. */
1556
1557 void
1558 process_one_symbol (type, desc, valu, name, section_offsets, objfile)
1559 int type, desc;
1560 CORE_ADDR valu;
1561 char *name;
1562 struct section_offsets *section_offsets;
1563 struct objfile *objfile;
1564 {
1565 #ifndef SUN_FIXED_LBRAC_BUG
1566 /* This records the last pc address we've seen. We depend on there being
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;
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
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. */
1577 static CORE_ADDR function_start_offset;
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:
1599 #if 0
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
1602 stuff straightened out with psymtabs. FIXME. */
1603
1604 case N_GSYM:
1605 case N_STSYM:
1606 #endif /* 0 */
1607
1608 /* Relocate for dynamic loading */
1609 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1610
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
1618 colon_pos = strchr (name, ':');
1619 if (!colon_pos++
1620 || (*colon_pos != 'f' && *colon_pos != 'F'))
1621 {
1622 define_symbol (valu, name, desc, type, objfile);
1623 break;
1624 }
1625
1626 #ifndef SUN_FIXED_LBRAC_BUG
1627 last_pc_address = valu; /* Save for SunOS bug circumcision */
1628 #endif
1629
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. */
1636 function_start_offset = valu;
1637 #else
1638 /* Default on ordinary systems */
1639 function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
1640 #endif
1641
1642 within_function = 1;
1643 if (context_stack_depth > 0)
1644 {
1645 new = pop_context ();
1646 /* Make a block for the local symbols within. */
1647 finish_block (new->name, &local_symbols, new->old_blocks,
1648 new->start_addr, valu, objfile);
1649 }
1650 /* Stack must be empty now. */
1651 if (context_stack_depth != 0)
1652 complain (&lbrac_unmatched_complaint, (char *) symnum);
1653
1654 new = push_context (0, valu);
1655 new->name = define_symbol (valu, name, desc, type, objfile);
1656 break;
1657
1658 case N_LBRAC:
1659 /* This "symbol" just indicates the start of an inner lexical
1660 context within a function. */
1661
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;
1665 #else
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
1678 new = push_context (desc, valu);
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
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;
1688 #else
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
1694 new = pop_context();
1695 if (desc != new->depth)
1696 complain (&lbrac_mismatch_complaint, (char *) symnum);
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.
1701 GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
1702 or the GCC2_COMPILED_SYMBOL. */
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,
1733 new->start_addr, valu, objfile);
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
1744 case N_FN:
1745 case N_FN_SEQ:
1746 /* This kind of symbol indicates the start of an object file. */
1747 /* Relocate for dynamic loading */
1748 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
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. */
1756 /* Relocate for dynamic loading */
1757 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1758
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)
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. */
1777 if (previous_stab_code == N_SO)
1778 {
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 */
1789 }
1790 end_symtab (valu, 0, 0, objfile);
1791 }
1792 start_symtab (name, NULL, valu);
1793 break;
1794
1795
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.) */
1801 /* Relocate for dynamic loading */
1802 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
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. */
1824 /* Relocate for dynamic loading and for ELF acc fn-relative syms. */
1825 valu += function_start_offset;
1826 #ifndef SUN_FIXED_LBRAC_BUG
1827 last_pc_address = valu; /* Save for SunOS bug circumcision */
1828 #endif
1829 record_line (current_subfile, desc, valu);
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 =
1849 (struct symbol *) xmmalloc (objfile -> md, sizeof (struct symbol));
1850 memset (sym, 0, sizeof *sym);
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
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 */
1897 case N_DSLINE: /* Source line number, data seg */
1898 valu += ANOFFSET (section_offsets, SECT_OFF_DATA);
1899 goto define_a_symbol;
1900
1901 case_N_LCSYM: /* Static symbol in BSS seg */
1902 case N_BSLINE: /* Source line number, bss seg */
1903 /* N_BROWS: overlaps with N_BSLINE */
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
1911 case N_ENTRY: /* Alternate entry point */
1912 /* Relocate for dynamic loading */
1913 valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
1914 goto define_a_symbol;
1915
1916 /* The following symbol types don't need the address field relocated,
1917 since it is either unused, or is absolute. */
1918 define_a_symbol:
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)
1929 define_symbol (valu, name, desc, type, objfile);
1930 break;
1931
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
1943 /* The following symbol types can be ignored. */
1944 case N_OBJ: /* Solaris 2: Object file dir and name */
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. */
1948 case N_ENDM: /* Solaris 2: End of module */
1949 case N_MAIN: /* Name of main routine. */
1950 break;
1951
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. */
1954 default:
1955 case N_CATCH: /* Exception handler catcher */
1956 case N_EHDECL: /* Exception handler name */
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));
1968 if (name)
1969 define_symbol (valu, name, desc, type, objfile);
1970 }
1971
1972 previous_stab_code = type;
1973 }
1974 \f
1975 /* Copy a pending list, used to record the contents of a common
1976 block for later fixup. */
1977 static struct pending *
1978 copy_pending (beg, begi, end)
1979 struct pending *beg;
1980 int begi;
1981 struct pending *end;
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 }
1995 \f
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
2016 void
2017 DEFUN(elfstab_build_psymtabs, (objfile, section_offsets, mainline,
2018 staboffset, stabsize,
2019 stabstroffset, stabstrsize),
2020 struct objfile *objfile AND
2021 struct section_offsets *section_offsets AND
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
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;
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
2047 if (stabstrsize < 0) /* FIXME: stabstrsize is unsigned; never true! */
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. */
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
2077 struct section_offsets *
2078 dbx_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;
2094 }
2095 \f
2096 /* Register our willingness to decode symbols for SunOS and a.out and
2097 b.out files handled by BFD... */
2098 static 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 */
2106 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
2107 NULL /* next: pointer to next struct sym_fns */
2108 };
2109
2110 static 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 */
2118 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
2119 NULL /* next: pointer to next struct sym_fns */
2120 };
2121
2122 static 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 */
2130 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
2131 NULL /* next: pointer to next struct sym_fns */
2132 };
2133
2134 /* This is probably a mistake. FIXME. Why can't the HP's use an ordinary
2135 file format name with an -hppa suffix? */
2136 static 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 */
2144 dbx_symfile_offsets, /* sym_offsets: parse user's offsets to internal form */
2145 NULL /* next: pointer to next struct sym_fns */
2146 };
2147
2148 void
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);
2154 add_symtab_fns(&hppa_sym_fns);
2155 }
This page took 0.071461 seconds and 5 git commands to generate.