* mipsread.c: Many changes for alpha ecoff format:
[deliverable/binutils-gdb.git] / gdb / mipsread.c
CommitLineData
bd5635a1 1/* Read a symbol table in MIPS' format (Third-Eye).
6c2e7392
PS
2 Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993 Free Software
3 Foundation, Inc.
4 Contributed by Alessandro Forin (af@cs.cmu.edu) at CMU. Major work
5 by Per Bothner, John Gilmore and Ian Lance Taylor at Cygnus Support.
bd5635a1
RP
6
7This file is part of GDB.
8
b8c50f09 9This program is free software; you can redistribute it and/or modify
bd5635a1 10it under the terms of the GNU General Public License as published by
b8c50f09
JG
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
bd5635a1 13
b8c50f09 14This program is distributed in the hope that it will be useful,
bd5635a1
RP
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
b8c50f09
JG
20along with this program; if not, write to the Free Software
21Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
bd5635a1 22
3eaebb75 23/* This module provides three functions: mipscoff_symfile_init,
817bc7b8 24 which initializes to read a symbol file; mipscoff_new_init, which
3eaebb75
SG
25 discards existing cached information when all symbols are being
26 discarded; and mipscoff_symfile_read, which reads a symbol table
27 from a file.
28
29 mipscoff_symfile_read only does the minimum work necessary for letting the
30 user "name" things symbolically; it does not read the entire symtab.
31 Instead, it reads the external and static symbols and puts them in partial
32 symbol tables. When more extensive information is requested of a
33 file, the corresponding partial symbol table is mutated into a full
34 fledged symbol table by going back and reading the symbols
35 for real. mipscoff_psymtab_to_symtab() is called indirectly through
d747e0af
MT
36 a pointer in the psymtab to do this.
37
38 ECOFF symbol tables are mostly written in the byte order of the
39 target machine. However, one section of the table (the auxiliary
40 symbol information) is written in the host byte order. There is a
41 bit in the other symbol info which describes which host byte order
42 was used. ECOFF thereby takes the trophy from Intel `b.out' for
43 the most brain-dead adaptation of a file format to byte order.
44
45 This module can read all four of the known byte-order combinations,
6c2e7392 46 on any type of host. */
d747e0af 47
bd5635a1
RP
48#include "defs.h"
49#include "symtab.h"
d747e0af 50#include "gdbtypes.h"
bd5635a1
RP
51#include "gdbcore.h"
52#include "symfile.h"
5e2e79f8 53#include "objfiles.h"
7d9884b9 54#include "obstack.h"
7e258d18 55#include "buildsym.h"
dac4929a 56#include "stabsread.h"
51b80b00 57#include "complaints.h"
817bc7b8 58
ac8cf67d
PS
59/* These are needed if the tm.h file does not contain the necessary
60 mips specific definitions. */
61
62#ifndef MIPS_EFI_SYMBOL_NAME
63#define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__"
64#include "coff/sym.h"
65#include "coff/symconst.h"
66typedef struct mips_extra_func_info {
67 long numargs;
68 PDR pdr;
69} *mips_extra_func_info_t;
70#ifndef RA_REGNUM
71#define RA_REGNUM 0
72#endif
ac8cf67d
PS
73#endif
74
817bc7b8
JG
75#ifdef USG
76#include <sys/types.h>
817bc7b8
JG
77#endif
78
7d9884b9
JG
79#include <sys/param.h>
80#include <sys/file.h>
81#include <sys/stat.h>
85f0a848 82#include <string.h>
fa0bcaa3 83
dac4929a
SG
84#include "gdb-stabs.h"
85
6c2e7392
PS
86#include "bfd.h"
87
88#include "coff/internal.h"
6ac14d25 89#include "coff/ecoff.h" /* COFF-like aspects of ecoff files */
e10a3052 90
6c2e7392
PS
91/* FIXME: coff/internal.h and aout/aout64.h both define N_ABS. We
92 want the definition from aout/aout64.h. */
93#undef N_ABS
6c2e7392
PS
94
95#include "libaout.h" /* Private BFD a.out information. */
7e258d18 96#include "aout/aout64.h"
817bc7b8 97#include "aout/stab_gnu.h" /* STABS information */
6c2e7392
PS
98
99/* FIXME: libcoff.h and libaout.h both define a couple of macros. We
100 don't use them. */
101#undef exec_hdr
102#undef obj_sym_filepos
103
104#include "libcoff.h" /* Private BFD COFF information. */
105#include "libecoff.h" /* Private BFD ECOFF information. */
106
85f0a848
FF
107#include "expression.h"
108#include "language.h" /* Needed inside partial-stab.h */
bd5635a1 109
85999c05
PS
110/* Provide a default mapping from a ecoff register number to a gdb REGNUM. */
111#ifndef ECOFF_REG_TO_REGNUM
112#define ECOFF_REG_TO_REGNUM(num) (num)
113#endif
114
e7e02420
PS
115/* Information is passed among various mipsread routines for accessing
116 symbol files. A pointer to this structure is kept in the sym_private
117 field of the objfile struct. */
118
119struct ecoff_symfile_info {
120 struct mips_pending **pending_list;
121};
122#define ECOFF_SYMFILE_INFO(o) ((struct ecoff_symfile_info *)((o)->sym_private))
123#define ECOFF_PENDING_LIST(o) (ECOFF_SYMFILE_INFO(o)->pending_list)
124
125
6c2e7392
PS
126/* Each partial symbol table entry contains a pointer to private data
127 for the read_symtab() function to use when expanding a partial
128 symbol table entry to a full symbol table entry.
4a35d6e9 129
6c2e7392
PS
130 For mipsread this structure contains the index of the FDR that this
131 psymtab represents and a pointer to the BFD that the psymtab was
132 created from. */
4a35d6e9 133
d4ea2aba
PB
134#define PST_PRIVATE(p) ((struct symloc *)(p)->read_symtab_private)
135#define FDR_IDX(p) (PST_PRIVATE(p)->fdr_idx)
6c2e7392 136#define CUR_BFD(p) (PST_PRIVATE(p)->cur_bfd)
4a35d6e9 137
5f7b2142
ILT
138struct symloc
139{
4a35d6e9 140 int fdr_idx;
6c2e7392
PS
141 bfd *cur_bfd;
142 EXTR *extern_tab; /* Pointer to external symbols for this file. */
143 int extern_count; /* Size of extern_tab. */
cbba020f 144 enum language pst_language;
4a35d6e9
FF
145};
146
bd5635a1
RP
147/* Things we import explicitly from other modules */
148
5f7b2142 149extern int info_verbose;
bd5635a1 150
3eaebb75 151/* Various complaints about symbol reading that don't abort the process */
817bc7b8
JG
152
153struct complaint bad_file_number_complaint =
5f7b2142 154{"bad file number %d", 0, 0};
021959e2 155
817bc7b8 156struct complaint index_complaint =
5f7b2142 157{"bad aux index at symbol %s", 0, 0};
817bc7b8
JG
158
159struct complaint aux_index_complaint =
5f7b2142 160{"bad proc end in aux found from symbol %s", 0, 0};
817bc7b8 161
6edd74ae 162struct complaint block_index_complaint =
5f7b2142 163{"bad aux index at block symbol %s", 0, 0};
6edd74ae 164
817bc7b8 165struct complaint unknown_ext_complaint =
5f7b2142 166{"unknown external symbol %s", 0, 0};
bd5635a1 167
817bc7b8 168struct complaint unknown_sym_complaint =
5f7b2142 169{"unknown local symbol %s", 0, 0};
101f259c 170
817bc7b8 171struct complaint unknown_st_complaint =
5f7b2142 172{"with type %d", 0, 0};
101f259c 173
817bc7b8 174struct complaint block_overflow_complaint =
5f7b2142 175{"block containing %s overfilled", 0, 0};
3eaebb75 176
817bc7b8 177struct complaint basic_type_complaint =
cbba020f 178{"cannot map MIPS basic type 0x%x for %s", 0, 0};
3eaebb75 179
817bc7b8 180struct complaint unknown_type_qual_complaint =
5f7b2142 181{"unknown type qualifier 0x%x", 0, 0};
3eaebb75 182
817bc7b8 183struct complaint array_bitsize_complaint =
5f7b2142 184{"size of array target type not known, assuming %d bits", 0, 0};
3eaebb75 185
817bc7b8 186struct complaint bad_tag_guess_complaint =
5f7b2142 187{"guessed tag type of %s incorrectly", 0, 0};
817bc7b8
JG
188
189struct complaint block_member_complaint =
5f7b2142 190{"declaration block contains unhandled symbol type %d", 0, 0};
817bc7b8
JG
191
192struct complaint stEnd_complaint =
5f7b2142 193{"stEnd with storage class %d not handled", 0, 0};
817bc7b8
JG
194
195struct complaint unknown_mips_symtype_complaint =
5f7b2142 196{"unknown symbol type 0x%x", 0, 0};
817bc7b8
JG
197
198struct complaint stab_unknown_complaint =
5f7b2142 199{"unknown stabs symbol %s", 0, 0};
817bc7b8
JG
200
201struct complaint pdr_for_nonsymbol_complaint =
5f7b2142 202{"PDR for %s, but no symbol", 0, 0};
817bc7b8
JG
203
204struct complaint pdr_static_symbol_complaint =
5f7b2142 205{"can't handle PDR for static proc at 0x%x", 0, 0};
c55e6167 206
e157305c
PS
207struct complaint bad_setjmp_pdr_complaint =
208{"fixing bad setjmp PDR from libc", 0, 0};
209
6ac14d25 210struct complaint bad_fbitfield_complaint =
cbba020f 211{"can't handle TIR fBitfield for %s", 0, 0};
6ac14d25
PS
212
213struct complaint bad_rfd_entry_complaint =
cbba020f 214{"bad rfd entry for %s: file %d, index %d", 0, 0};
6ac14d25
PS
215
216struct complaint unexpected_type_code_complaint =
217{"unexpected type code for %s", 0, 0};
218
85999c05
PS
219struct complaint unable_to_cross_ref_complaint =
220{"unable to cross ref btTypedef for %s", 0, 0};
221
222struct complaint illegal_forward_tq0_complaint =
223{"illegal tq0 in forward typedef for %s", 0, 0};
3eaebb75 224
85999c05
PS
225struct complaint illegal_forward_bt_complaint =
226{"illegal bt %d in forward typedef for %s", 0, 0};
bd5635a1 227
85999c05 228/* Macros and extra defs */
bd5635a1
RP
229
230/* Puns: hard to find whether -g was used and how */
231
232#define MIN_GLEVEL GLEVEL_0
233#define compare_glevel(a,b) \
234 (((a) == GLEVEL_3) ? ((b) < GLEVEL_3) : \
235 ((b) == GLEVEL_3) ? -1 : (int)((b) - (a)))
e072c738
JG
236\f
237/* Things that really are local to this module */
238
c4413e2c
FF
239/* Remember what we deduced to be the source language of this psymtab. */
240
241static enum language psymtab_language = language_unknown;
242
6c2e7392 243/* Current BFD. */
3eaebb75 244
6c2e7392 245static bfd *cur_bfd;
3eaebb75 246
e072c738
JG
247/* Pointer to current file decriptor record, and its index */
248
5f7b2142
ILT
249static FDR *cur_fdr;
250static int cur_fd;
e072c738
JG
251
252/* Index of current symbol */
253
5f7b2142 254static int cur_sdx;
e072c738
JG
255
256/* Note how much "debuggable" this image is. We would like
257 to see at least one FDR with full symbols */
258
259static max_gdbinfo;
260static max_glevel;
261
262/* When examining .o files, report on undefined symbols */
263
264static int n_undef_symbols, n_undef_labels, n_undef_vars, n_undef_procs;
265
7e258d18
PB
266/* Pseudo symbol to use when putting stabs into the symbol table. */
267
c55e6167 268static char stabs_symbol[] = STABS_SYMBOL;
7e258d18 269
e072c738
JG
270/* Extra builtin types */
271
272struct type *builtin_type_complex;
273struct type *builtin_type_double_complex;
274struct type *builtin_type_fixed_dec;
275struct type *builtin_type_float_dec;
276struct type *builtin_type_string;
277
3eaebb75 278/* Forward declarations */
e072c738 279
d747e0af 280static void
dac4929a 281read_mips_symtab PARAMS ((struct objfile *, struct section_offsets *));
84ffdec2
JG
282
283static void
6c2e7392 284read_the_mips_symtab PARAMS ((bfd *));
84ffdec2
JG
285
286static int
85999c05 287upgrade_type PARAMS ((int, struct type **, int, union aux_ext *, int));
84ffdec2
JG
288
289static void
6c2e7392 290parse_partial_symbols PARAMS ((struct objfile *,
dac4929a 291 struct section_offsets *));
d747e0af
MT
292
293static int
85999c05
PS
294cross_ref PARAMS ((int, union aux_ext *, struct type **, enum type_code,
295 char **, int, char *));
84ffdec2
JG
296
297static void
298fixup_sigtramp PARAMS ((void));
299
300static struct symbol *
301new_symbol PARAMS ((char *));
302
303static struct type *
304new_type PARAMS ((char *));
305
306static struct block *
307new_block PARAMS ((int));
308
309static struct symtab *
310new_symtab PARAMS ((char *, int, int, struct objfile *));
311
312static struct linetable *
313new_linetable PARAMS ((int));
314
315static struct blockvector *
316new_bvect PARAMS ((int));
317
85999c05
PS
318static int
319parse_symbol PARAMS ((SYMR *, union aux_ext *, char *, int));
320
84ffdec2 321static struct type *
85999c05 322parse_type PARAMS ((int, union aux_ext *, int *, int, char *));
84ffdec2
JG
323
324static struct symbol *
325mylookup_symbol PARAMS ((char *, struct block *, enum namespace,
326 enum address_class));
327
328static struct block *
329shrink_block PARAMS ((struct block *, struct symtab *));
330
331static PTR
332xzalloc PARAMS ((unsigned int));
d747e0af
MT
333
334static void
84ffdec2 335sort_blocks PARAMS ((struct symtab *));
d747e0af
MT
336
337static int
391ca579 338compare_blocks PARAMS ((const void *, const void *));
84ffdec2
JG
339
340static struct partial_symtab *
341new_psymtab PARAMS ((char *, struct objfile *));
342
d747e0af 343static void
84ffdec2 344psymtab_to_symtab_1 PARAMS ((struct partial_symtab *, char *));
c55e6167 345
84ffdec2
JG
346static void
347add_block PARAMS ((struct block *, struct symtab *));
348
349static void
350add_symbol PARAMS ((struct symbol *, struct block *));
351
352static int
353add_line PARAMS ((struct linetable *, int, CORE_ADDR, int));
354
355static struct linetable *
356shrink_linetable PARAMS ((struct linetable *));
357
358static char *
359mips_next_symbol_text PARAMS ((void));
bd5635a1
RP
360\f
361/* Things we export to other modules */
362
bd5635a1 363/* Address bounds for the signal trampoline in inferior, if any */
101f259c 364/* FIXME: Nothing really seems to use this. Why is it here? */
bd5635a1
RP
365
366CORE_ADDR sigtramp_address, sigtramp_end;
367
4ad1963e 368static void
84ffdec2
JG
369mipscoff_new_init (ignore)
370 struct objfile *ignore;
bd5635a1 371{
e7ff735c 372 sigtramp_address = 0;
0b0d6c3f
PS
373 stabsread_new_init ();
374 buildsym_new_init ();
bd5635a1
RP
375}
376
4ad1963e 377static void
80d68b1d
FF
378mipscoff_symfile_init (objfile)
379 struct objfile *objfile;
bd5635a1 380{
5f7b2142 381 if (objfile->sym_private != NULL)
80d68b1d 382 {
5f7b2142 383 mfree (objfile->md, objfile->sym_private);
80d68b1d 384 }
e7e02420
PS
385 objfile->sym_private = (PTR)
386 xmmalloc (objfile->md, sizeof (struct ecoff_symfile_info));
bd5635a1
RP
387}
388
4ad1963e 389static void
dac4929a 390mipscoff_symfile_read (objfile, section_offsets, mainline)
80d68b1d 391 struct objfile *objfile;
dac4929a 392 struct section_offsets *section_offsets;
bd5635a1
RP
393 int mainline;
394{
6ac14d25
PS
395 struct cleanup * back_to;
396
021959e2 397 init_minimal_symbol_collection ();
6ac14d25 398 back_to = make_cleanup (discard_minimal_symbols, 0);
bd5635a1
RP
399
400 /* Now that the executable file is positioned at symbol table,
401 process it and define symbols accordingly. */
402
5f7b2142 403 read_mips_symtab (objfile, section_offsets);
bd5635a1 404
021959e2
JG
405 /* Install any minimal symbols that have been collected as the current
406 minimal symbols for this objfile. */
bd5635a1 407
80d68b1d 408 install_minimal_symbols (objfile);
6ac14d25
PS
409
410 do_cleanups (back_to);
bd5635a1 411}
817bc7b8 412
80d68b1d
FF
413/* Perform any local cleanups required when we are done with a particular
414 objfile. I.E, we are in the process of discarding all symbol information
415 for an objfile, freeing up all memory held for it, and unlinking the
416 objfile struct from the global list of known objfiles. */
417
418static void
419mipscoff_symfile_finish (objfile)
420 struct objfile *objfile;
421{
5f7b2142 422 if (objfile->sym_private != NULL)
80d68b1d 423 {
5f7b2142 424 mfree (objfile->md, objfile->sym_private);
80d68b1d
FF
425 }
426
6c2e7392 427 cur_bfd = 0;
80d68b1d
FF
428}
429
d747e0af 430/* Allocate zeroed memory */
bd5635a1 431
84ffdec2 432static PTR
5f7b2142 433xzalloc (size)
e10a3052 434 unsigned int size;
bd5635a1 435{
51b57ded 436 PTR p = xmalloc (size);
bd5635a1 437
4ed3a9ea 438 memset (p, 0, size);
51b57ded 439 return p;
bd5635a1
RP
440}
441
442/* Exported procedure: Builds a symtab from the PST partial one.
443 Restores the environment in effect when PST was created, delegates
444 most of the work to an ancillary procedure, and sorts
445 and reorders the symtab list at the end */
446
3eaebb75 447static void
5f7b2142
ILT
448mipscoff_psymtab_to_symtab (pst)
449 struct partial_symtab *pst;
bd5635a1 450{
bd5635a1 451
5f7b2142
ILT
452 if (!pst)
453 return;
bd5635a1 454
5f7b2142
ILT
455 if (info_verbose)
456 {
457 printf_filtered ("Reading in symbols for %s...", pst->filename);
458 fflush (stdout);
459 }
bd5635a1 460
5f7b2142 461 next_symbol_text_func = mips_next_symbol_text;
c55e6167 462
5f7b2142 463 psymtab_to_symtab_1 (pst, pst->filename);
bd5635a1 464
5f7b2142
ILT
465 /* Match with global symbols. This only needs to be done once,
466 after all of the symtabs and dependencies have been read in. */
467 scan_file_globals (pst->objfile);
bd5635a1 468
5f7b2142
ILT
469 if (info_verbose)
470 printf_filtered ("done.\n");
bd5635a1
RP
471}
472
473/* Exported procedure: Is PC in the signal trampoline code */
474
b8c50f09 475int
5f7b2142
ILT
476in_sigtramp (pc, ignore)
477 CORE_ADDR pc;
478 char *ignore; /* function name */
bd5635a1 479{
5f7b2142
ILT
480 if (sigtramp_address == 0)
481 fixup_sigtramp ();
482 return (pc >= sigtramp_address && pc < sigtramp_end);
bd5635a1 483}
bd5635a1
RP
484\f
485/* File-level interface functions */
486
6c2e7392 487/* Read the symtab information from file ABFD into memory. */
d747e0af
MT
488
489static void
6c2e7392 490read_the_mips_symtab (abfd)
5f7b2142 491 bfd *abfd;
bd5635a1 492{
6c2e7392
PS
493 if (ecoff_slurp_symbolic_info (abfd) == false)
494 error ("Error reading symbol table: %s", bfd_errmsg (bfd_error));
bd5635a1
RP
495}
496
bd5635a1
RP
497/* Find a file descriptor given its index RF relative to a file CF */
498
3eaebb75
SG
499static FDR *
500get_rfd (cf, rf)
5f7b2142 501 int cf, rf;
bd5635a1 502{
6c2e7392 503 FDR *fdrs;
5f7b2142 504 register FDR *f;
6c2e7392 505 RFDT rfd;
5f7b2142 506
6c2e7392
PS
507 fdrs = ecoff_data (cur_bfd)->fdr;
508 f = fdrs + cf;
5f7b2142
ILT
509 /* Object files do not have the RFD table, all refs are absolute */
510 if (f->rfdBase == 0)
6c2e7392 511 return fdrs + rf;
6ac14d25
PS
512 (*ecoff_backend (cur_bfd)->swap_rfd_in)
513 (cur_bfd,
514 ((char *) ecoff_data (cur_bfd)->external_rfd
515 + (f->rfdBase + rf) * ecoff_backend (cur_bfd)->external_rfd_size),
516 &rfd);
6c2e7392 517 return fdrs + rfd;
bd5635a1
RP
518}
519
520/* Return a safer print NAME for a file descriptor */
521
3eaebb75 522static char *
6c2e7392
PS
523fdr_name (f)
524 FDR *f;
bd5635a1 525{
6c2e7392 526 if (f->rss == -1)
5f7b2142 527 return "<stripped file>";
6c2e7392 528 if (f->rss == 0)
5f7b2142 529 return "<NFY>";
6c2e7392 530 return ecoff_data (cur_bfd)->ss + f->issBase + f->rss;
bd5635a1
RP
531}
532
533
dac4929a
SG
534/* Read in and parse the symtab of the file OBJFILE. Symbols from
535 different sections are relocated via the SECTION_OFFSETS. */
bd5635a1 536
d747e0af 537static void
dac4929a 538read_mips_symtab (objfile, section_offsets)
5f7b2142
ILT
539 struct objfile *objfile;
540 struct section_offsets *section_offsets;
bd5635a1 541{
6c2e7392 542 cur_bfd = objfile->obfd;
bd5635a1 543
6c2e7392 544 read_the_mips_symtab (objfile->obfd);
bd5635a1 545
6c2e7392 546 parse_partial_symbols (objfile, section_offsets);
bd5635a1 547
7e258d18 548#if 0
6c2e7392
PS
549 /* Check to make sure file was compiled with -g. If not, warn the
550 user of this limitation. */
5f7b2142
ILT
551 if (compare_glevel (max_glevel, GLEVEL_2) < 0)
552 {
553 if (max_gdbinfo == 0)
6c2e7392 554 printf ("\n%s not compiled with -g, debugging support is limited.\n",
5f7b2142 555 objfile->name);
6c2e7392 556 printf ("You should compile with -g2 or -g3 for best debugging support.\n");
5f7b2142
ILT
557 fflush (stdout);
558 }
7e258d18 559#endif
bd5635a1 560}
bd5635a1
RP
561\f
562/* Local utilities */
563
bd5635a1
RP
564/* Map of FDR indexes to partial symtabs */
565
5f7b2142
ILT
566struct pst_map
567{
568 struct partial_symtab *pst; /* the psymtab proper */
85999c05
PS
569 long n_globals; /* exported globals (external symbols) */
570 long globals_offset; /* cumulative */
d4ea2aba 571};
bd5635a1
RP
572
573
574/* Utility stack, used to nest procedures and blocks properly.
575 It is a doubly linked list, to avoid too many alloc/free.
576 Since we might need it quite a few times it is NOT deallocated
577 after use. */
578
5f7b2142
ILT
579static struct parse_stack
580{
581 struct parse_stack *next, *prev;
582 struct symtab *cur_st; /* Current symtab. */
583 struct block *cur_block; /* Block in it. */
584 int blocktype; /* What are we parsing. */
585 int maxsyms; /* Max symbols in this block. */
586 struct type *cur_type; /* Type we parse fields for. */
587 int cur_field; /* Field number in cur_type. */
85999c05 588 CORE_ADDR procadr; /* Start addres of this procedure */
5f7b2142 589 int numargs; /* Its argument count */
6c2e7392
PS
590}
591
592 *top_stack; /* Top stack ptr */
bd5635a1
RP
593
594
595/* Enter a new lexical context */
596
4ad1963e 597static void
5f7b2142 598push_parse_stack ()
bd5635a1 599{
5f7b2142
ILT
600 struct parse_stack *new;
601
602 /* Reuse frames if possible */
603 if (top_stack && top_stack->prev)
604 new = top_stack->prev;
605 else
606 new = (struct parse_stack *) xzalloc (sizeof (struct parse_stack));
607 /* Initialize new frame with previous content */
608 if (top_stack)
609 {
610 register struct parse_stack *prev = new->prev;
bd5635a1 611
5f7b2142
ILT
612 *new = *top_stack;
613 top_stack->prev = new;
614 new->prev = prev;
615 new->next = top_stack;
616 }
617 top_stack = new;
bd5635a1
RP
618}
619
620/* Exit a lexical context */
621
4ad1963e 622static void
5f7b2142 623pop_parse_stack ()
bd5635a1 624{
5f7b2142
ILT
625 if (!top_stack)
626 return;
627 if (top_stack->next)
628 top_stack = top_stack->next;
bd5635a1
RP
629}
630
631
632/* Cross-references might be to things we haven't looked at
633 yet, e.g. type references. To avoid too many type
634 duplications we keep a quick fixup table, an array
635 of lists of references indexed by file descriptor */
636
e7e02420 637struct mips_pending
5f7b2142
ILT
638{
639 struct mips_pending *next; /* link */
6ac14d25 640 char *s; /* the unswapped symbol */
5f7b2142 641 struct type *t; /* its partial type descriptor */
e7e02420 642};
bd5635a1
RP
643
644
85999c05 645/* Check whether we already saw symbol SH in file FH */
bd5635a1 646
4ad1963e 647static struct mips_pending *
5f7b2142
ILT
648is_pending_symbol (fh, sh)
649 FDR *fh;
6ac14d25 650 char *sh;
bd5635a1 651{
6c2e7392 652 int f_idx = fh - ecoff_data (cur_bfd)->fdr;
5f7b2142 653 register struct mips_pending *p;
e7e02420 654 struct mips_pending **pending_list = ECOFF_PENDING_LIST (current_objfile);
5f7b2142
ILT
655
656 /* Linear search is ok, list is typically no more than 10 deep */
657 for (p = pending_list[f_idx]; p; p = p->next)
658 if (p->s == sh)
659 break;
660 return p;
bd5635a1
RP
661}
662
85999c05 663/* Add a new symbol SH of type T */
bd5635a1 664
4ad1963e 665static void
5f7b2142
ILT
666add_pending (fh, sh, t)
667 FDR *fh;
6ac14d25 668 char *sh;
5f7b2142 669 struct type *t;
bd5635a1 670{
6c2e7392 671 int f_idx = fh - ecoff_data (cur_bfd)->fdr;
5f7b2142
ILT
672 struct mips_pending *p = is_pending_symbol (fh, sh);
673
674 /* Make sure we do not make duplicates */
675 if (!p)
676 {
e7e02420
PS
677 struct mips_pending **pending_list = ECOFF_PENDING_LIST (current_objfile);
678
679 p = ((struct mips_pending *)
680 obstack_alloc (&current_objfile->psymbol_obstack,
681 sizeof (struct mips_pending)));
5f7b2142
ILT
682 p->s = sh;
683 p->t = t;
684 p->next = pending_list[f_idx];
685 pending_list[f_idx] = p;
686 }
bd5635a1 687}
bd5635a1 688\f
5f7b2142 689
bd5635a1
RP
690/* Parsing Routines proper. */
691
692/* Parse a single symbol. Mostly just make up a GDB symbol for it.
693 For blocks, procedures and types we open a new lexical context.
6c2e7392
PS
694 This is basically just a big switch on the symbol's type. Argument
695 AX is the base pointer of aux symbols for this file (fh->iauxBase).
696 EXT_SH points to the unswapped symbol, which is needed for struct,
697 union, etc., types; it is NULL for an EXTR. BIGEND says whether
698 aux symbols are big-endian or little-endian. Return count of
85999c05 699 SYMR's handled (normally one). */
bd5635a1 700
7e258d18 701static int
6c2e7392 702parse_symbol (sh, ax, ext_sh, bigend)
5f7b2142
ILT
703 SYMR *sh;
704 union aux_ext *ax;
6ac14d25 705 char *ext_sh;
5f7b2142 706 int bigend;
bd5635a1 707{
6ac14d25
PS
708 const bfd_size_type external_sym_size
709 = ecoff_backend (cur_bfd)->external_sym_size;
710 void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *)) =
711 ecoff_backend (cur_bfd)->swap_sym_in;
5f7b2142
ILT
712 char *name;
713 struct symbol *s;
714 struct block *b;
6c2e7392 715 struct mips_pending *pend;
5f7b2142
ILT
716 struct type *t;
717 struct field *f;
718 int count = 1;
5f7b2142
ILT
719 enum address_class class;
720 TIR tir;
85999c05 721 long svalue = sh->value;
5f7b2142 722
6ac14d25 723 if (ext_sh == (char *) NULL)
6c2e7392
PS
724 name = ecoff_data (cur_bfd)->ssext + sh->iss;
725 else
726 name = ecoff_data (cur_bfd)->ss + cur_fdr->issBase + sh->iss;
727
5f7b2142
ILT
728 switch (sh->st)
729 {
5f7b2142
ILT
730 case stNil:
731 break;
732
733 case stGlobal: /* external symbol, goes into global block */
734 class = LOC_STATIC;
735 b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (top_stack->cur_st),
736 GLOBAL_BLOCK);
6c2e7392 737 s = new_symbol (name);
5f7b2142
ILT
738 SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
739 goto data;
740
741 case stStatic: /* static data, goes into current block. */
742 class = LOC_STATIC;
743 b = top_stack->cur_block;
6c2e7392 744 s = new_symbol (name);
e7ff735c
JK
745 if (sh->sc == scCommon)
746 {
747 /* It is a FORTRAN common block. At least for SGI Fortran the
748 address is not in the symbol; we need to fix it later in
749 scan_file_globals. */
750 int bucket = hashname (SYMBOL_NAME (s));
751 SYMBOL_VALUE_CHAIN (s) = global_sym_chain[bucket];
752 global_sym_chain[bucket] = s;
753 }
754 else
755 SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
5f7b2142
ILT
756 goto data;
757
758 case stLocal: /* local variable, goes into current block */
759 if (sh->sc == scRegister)
760 {
761 class = LOC_REGISTER;
85999c05 762 svalue = ECOFF_REG_TO_REGNUM (svalue);
5f7b2142
ILT
763 }
764 else
765 class = LOC_LOCAL;
766 b = top_stack->cur_block;
6c2e7392 767 s = new_symbol (name);
85999c05 768 SYMBOL_VALUE (s) = svalue;
5f7b2142
ILT
769
770 data: /* Common code for symbols describing data */
771 SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
772 SYMBOL_CLASS (s) = class;
773 add_symbol (s, b);
774
775 /* Type could be missing in a number of cases */
776 if (sh->sc == scUndefined || sh->sc == scNil ||
777 sh->index == 0xfffff)
778 SYMBOL_TYPE (s) = builtin_type_int; /* undefined? */
779 else
85999c05 780 SYMBOL_TYPE (s) = parse_type (cur_fd, ax + sh->index, 0, bigend, name);
5f7b2142
ILT
781 /* Value of a data symbol is its memory address */
782 break;
783
784 case stParam: /* arg to procedure, goes into current block */
785 max_gdbinfo++;
786 top_stack->numargs++;
787
5f7b2142
ILT
788 /* Special GNU C++ name. */
789 if (name[0] == CPLUS_MARKER && name[1] == 't' && name[2] == 0)
790 name = "this"; /* FIXME, not alloc'd in obstack */
791 s = new_symbol (name);
792
793 SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
e7ff735c 794 switch (sh->sc)
5f7b2142 795 {
e7ff735c
JK
796 case scRegister:
797 /* Pass by value in register. */
798 SYMBOL_CLASS(s) = LOC_REGPARM;
85999c05 799 svalue = ECOFF_REG_TO_REGNUM (svalue);
e7ff735c
JK
800 break;
801 case scVar:
802 /* Pass by reference on stack. */
803 SYMBOL_CLASS(s) = LOC_REF_ARG;
804 break;
805 case scVarRegister:
806 /* Pass by reference in register. */
807 SYMBOL_CLASS(s) = LOC_REGPARM_ADDR;
85999c05 808 svalue = ECOFF_REG_TO_REGNUM (svalue);
e7ff735c
JK
809 break;
810 default:
811 /* Pass by value on stack. */
812 SYMBOL_CLASS(s) = LOC_ARG;
813 break;
5f7b2142 814 }
85999c05
PS
815 SYMBOL_VALUE (s) = svalue;
816 SYMBOL_TYPE (s) = parse_type (cur_fd, ax + sh->index, 0, bigend, name);
5f7b2142 817 add_symbol (s, top_stack->cur_block);
0c4d2cc2 818#if 0
5f7b2142
ILT
819 /* FIXME: This has not been tested. See dbxread.c */
820 /* Add the type of this parameter to the function/procedure
0c4d2cc2 821 type of this block. */
5f7b2142 822 add_param_to_type (&top_stack->cur_block->function->type, s);
0c4d2cc2 823#endif
5f7b2142
ILT
824 break;
825
826 case stLabel: /* label, goes into current block */
6c2e7392 827 s = new_symbol (name);
5f7b2142
ILT
828 SYMBOL_NAMESPACE (s) = VAR_NAMESPACE; /* so that it can be used */
829 SYMBOL_CLASS (s) = LOC_LABEL; /* but not misused */
830 SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
831 SYMBOL_TYPE (s) = builtin_type_int;
832 add_symbol (s, top_stack->cur_block);
833 break;
834
835 case stProc: /* Procedure, usually goes into global block */
6ac14d25 836 case stStaticProc: /* Static procedure, goes into current block */
6c2e7392 837 s = new_symbol (name);
5f7b2142
ILT
838 SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
839 SYMBOL_CLASS (s) = LOC_BLOCK;
840 /* Type of the return value */
841 if (sh->sc == scUndefined || sh->sc == scNil)
842 t = builtin_type_int;
843 else
85999c05 844 t = parse_type (cur_fd, ax + sh->index + 1, 0, bigend, name);
5f7b2142
ILT
845 b = top_stack->cur_block;
846 if (sh->st == stProc)
847 {
848 struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
849 /* The next test should normally be true,
0c4d2cc2
JG
850 but provides a hook for nested functions
851 (which we don't want to make global). */
5f7b2142
ILT
852 if (b == BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK))
853 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
854 }
855 add_symbol (s, b);
bd5635a1 856
5f7b2142 857 /* Make a type for the procedure itself */
0c4d2cc2 858#if 0
5f7b2142
ILT
859 /* FIXME: This has not been tested yet! See dbxread.c */
860 /* Generate a template for the type of this function. The
861 types of the arguments will be added as we read the symbol
862 table. */
ade40d31 863 memcpy (lookup_function_type (t), SYMBOL_TYPE (s), sizeof (struct type));
0c4d2cc2 864#else
5f7b2142 865 SYMBOL_TYPE (s) = lookup_function_type (t);
0c4d2cc2 866#endif
bd5635a1 867
5f7b2142
ILT
868 /* Create and enter a new lexical context */
869 b = new_block (top_stack->maxsyms);
870 SYMBOL_BLOCK_VALUE (s) = b;
871 BLOCK_FUNCTION (b) = s;
872 BLOCK_START (b) = BLOCK_END (b) = sh->value;
873 BLOCK_SUPERBLOCK (b) = top_stack->cur_block;
874 add_block (b, top_stack->cur_st);
875
876 /* Not if we only have partial info */
877 if (sh->sc == scUndefined || sh->sc == scNil)
878 break;
879
880 push_parse_stack ();
881 top_stack->cur_block = b;
882 top_stack->blocktype = sh->st;
883 top_stack->cur_type = SYMBOL_TYPE (s);
884 top_stack->cur_field = -1;
885 top_stack->procadr = sh->value;
886 top_stack->numargs = 0;
5f7b2142
ILT
887 break;
888
889 /* Beginning of code for structure, union, and enum definitions.
817bc7b8 890 They all share a common set of local variables, defined here. */
5f7b2142
ILT
891 {
892 enum type_code type_code;
6ac14d25 893 char *ext_tsym;
5f7b2142
ILT
894 int nfields;
895 long max_value;
896 struct field *f;
897
898 case stStruct: /* Start a block defining a struct type */
899 type_code = TYPE_CODE_STRUCT;
900 goto structured_common;
901
902 case stUnion: /* Start a block defining a union type */
903 type_code = TYPE_CODE_UNION;
904 goto structured_common;
905
906 case stEnum: /* Start a block defining an enum type */
907 type_code = TYPE_CODE_ENUM;
908 goto structured_common;
909
910 case stBlock: /* Either a lexical block, or some type */
e7ff735c 911 if (sh->sc != scInfo && sh->sc != scCommon)
5f7b2142
ILT
912 goto case_stBlock_code; /* Lexical block */
913
914 type_code = TYPE_CODE_UNDEF; /* We have a type. */
915
916 /* Common code for handling struct, union, enum, and/or as-yet-
917 unknown-type blocks of info about structured data. `type_code'
918 has been set to the proper TYPE_CODE, if we know it. */
919 structured_common:
920 push_parse_stack ();
921 top_stack->blocktype = stBlock;
922
5f7b2142
ILT
923 /* First count the number of fields and the highest value. */
924 nfields = 0;
925 max_value = 0;
6ac14d25
PS
926 for (ext_tsym = ext_sh + external_sym_size;
927 ;
928 ext_tsym += external_sym_size)
5f7b2142 929 {
6c2e7392
PS
930 SYMR tsym;
931
6ac14d25 932 (*swap_sym_in) (cur_bfd, ext_tsym, &tsym);
6c2e7392 933
1c8961dd 934 switch (tsym.st)
5f7b2142 935 {
1c8961dd
JK
936 case stEnd:
937 goto end_of_fields;
938
939 case stMember:
5f7b2142
ILT
940 if (nfields == 0 && type_code == TYPE_CODE_UNDEF)
941 /* If the type of the member is Nil (or Void),
942 without qualifiers, assume the tag is an
943 enumeration. */
6c2e7392 944 if (tsym.index == indexNil)
5f7b2142
ILT
945 type_code = TYPE_CODE_ENUM;
946 else
947 {
948 ecoff_swap_tir_in (bigend,
6c2e7392 949 &ax[tsym.index].a_ti,
5f7b2142
ILT
950 &tir);
951 if ((tir.bt == btNil || tir.bt == btVoid)
952 && tir.tq0 == tqNil)
953 type_code = TYPE_CODE_ENUM;
817bc7b8 954 }
5f7b2142 955 nfields++;
6c2e7392
PS
956 if (tsym.value > max_value)
957 max_value = tsym.value;
1c8961dd
JK
958 break;
959
1c8961dd
JK
960 case stBlock:
961 case stUnion:
962 case stEnum:
963 case stStruct:
1c8961dd
JK
964 {
965#if 0
966 /* This is a no-op; is it trying to tell us something
967 we should be checking? */
968 if (tsym.sc == scVariant); /*UNIMPLEMENTED*/
969#endif
970 if (tsym.index != 0)
971 {
972 /* This is something like a struct within a
973 struct. Skip over the fields of the inner
974 struct. The -1 is because the for loop will
975 increment ext_tsym. */
6ac14d25
PS
976 ext_tsym = ((char *) ecoff_data (cur_bfd)->external_sym
977 + ((cur_fdr->isymBase + tsym.index - 1)
978 * external_sym_size));
1c8961dd
JK
979 }
980 }
981 break;
982
6ac14d25
PS
983 case stTypedef:
984 /* mips cc puts out a typedef for struct x if it is not yet
985 defined when it encounters
986 struct y { struct x *xp; };
987 Just ignore it. */
988 break;
989
1c8961dd
JK
990 default:
991 complain (&block_member_complaint, tsym.st);
5f7b2142 992 }
5f7b2142 993 }
1c8961dd 994 end_of_fields:;
5f7b2142
ILT
995
996 /* In an stBlock, there is no way to distinguish structs,
997 unions, and enums at this point. This is a bug in the
998 original design (that has been fixed with the recent
999 addition of the stStruct, stUnion, and stEnum symbol
1000 types.) The way you can tell is if/when you see a variable
1001 or field of that type. In that case the variable's type
1002 (in the AUX table) says if the type is struct, union, or
1003 enum, and points back to the stBlock here. So you can
1004 patch the tag kind up later - but only if there actually is
1005 a variable or field of that type.
1006
1007 So until we know for sure, we will guess at this point.
1008 The heuristic is:
1009 If the first member has index==indexNil or a void type,
1010 assume we have an enumeration.
1011 Otherwise, if there is more than one member, and all
1012 the members have offset 0, assume we have a union.
1013 Otherwise, assume we have a struct.
1014
1015 The heuristic could guess wrong in the case of of an
1016 enumeration with no members or a union with one (or zero)
1017 members, or when all except the last field of a struct have
1018 width zero. These are uncommon and/or illegal situations,
1019 and in any case guessing wrong probably doesn't matter
1020 much.
1021
1022 But if we later do find out we were wrong, we fixup the tag
1023 kind. Members of an enumeration must be handled
1024 differently from struct/union fields, and that is harder to
1025 patch up, but luckily we shouldn't need to. (If there are
1026 any enumeration members, we can tell for sure it's an enum
1027 here.) */
1028
1029 if (type_code == TYPE_CODE_UNDEF)
1030 if (nfields > 1 && max_value == 0)
1031 type_code = TYPE_CODE_UNION;
1032 else
1033 type_code = TYPE_CODE_STRUCT;
1034
85999c05 1035 /* Create a new type or use the pending type. */
6c2e7392 1036 pend = is_pending_symbol (cur_fdr, ext_sh);
85999c05
PS
1037 if (pend == (struct mips_pending *) NULL)
1038 {
1039 t = new_type (NULL);
1040 add_pending (cur_fdr, ext_sh, t);
1041 }
1042 else
6c2e7392 1043 t = pend->t;
85999c05
PS
1044
1045 /* Alpha cc unnamed structs do not get a tag name. */
1046 if (sh->iss == 0)
1047 TYPE_TAG_NAME (t) = NULL;
5f7b2142 1048 else
85999c05
PS
1049 TYPE_TAG_NAME (t) = obconcat (&current_objfile->symbol_obstack,
1050 "", "", name);
5f7b2142
ILT
1051
1052 TYPE_CODE (t) = type_code;
1053 TYPE_LENGTH (t) = sh->value;
1054 TYPE_NFIELDS (t) = nfields;
6c2e7392
PS
1055 TYPE_FIELDS (t) = f = ((struct field *)
1056 TYPE_ALLOC (t,
1057 nfields * sizeof (struct field)));
5f7b2142
ILT
1058
1059 if (type_code == TYPE_CODE_ENUM)
1060 {
1061 /* This is a non-empty enum. */
6ac14d25
PS
1062 for (ext_tsym = ext_sh + external_sym_size;
1063 ;
1064 ext_tsym += external_sym_size)
5f7b2142 1065 {
6c2e7392 1066 SYMR tsym;
5f7b2142 1067 struct symbol *enum_sym;
6c2e7392 1068
6ac14d25 1069 (*swap_sym_in) (cur_bfd, ext_tsym, &tsym);
6c2e7392
PS
1070
1071 if (tsym.st != stMember)
1072 break;
1073
1074 f->bitpos = tsym.value;
5f7b2142 1075 f->type = t;
6c2e7392
PS
1076 f->name = (ecoff_data (cur_bfd)->ss
1077 + cur_fdr->issBase
1078 + tsym.iss);
5f7b2142
ILT
1079 f->bitsize = 0;
1080
1081 enum_sym = ((struct symbol *)
817bc7b8 1082 obstack_alloc (&current_objfile->symbol_obstack,
5f7b2142
ILT
1083 sizeof (struct symbol)));
1084 memset ((PTR) enum_sym, 0, sizeof (struct symbol));
1085 SYMBOL_NAME (enum_sym) = f->name;
1086 SYMBOL_CLASS (enum_sym) = LOC_CONST;
1087 SYMBOL_TYPE (enum_sym) = t;
1088 SYMBOL_NAMESPACE (enum_sym) = VAR_NAMESPACE;
6c2e7392 1089 SYMBOL_VALUE (enum_sym) = tsym.value;
5f7b2142
ILT
1090 add_symbol (enum_sym, top_stack->cur_block);
1091
1092 /* Skip the stMembers that we've handled. */
1093 count++;
1094 f++;
1095 }
1096 }
5f7b2142
ILT
1097 /* make this the current type */
1098 top_stack->cur_type = t;
1099 top_stack->cur_field = 0;
85999c05
PS
1100
1101 /* Do not create a symbol for alpha cc unnamed structs. */
1102 if (sh->iss == 0)
1103 break;
1104 s = new_symbol (name);
1105 SYMBOL_NAMESPACE (s) = STRUCT_NAMESPACE;
1106 SYMBOL_CLASS (s) = LOC_TYPEDEF;
1107 SYMBOL_VALUE (s) = 0;
1108 SYMBOL_TYPE (s) = t;
1109
1110 /* gcc puts out an empty struct for an opaque struct definitions. */
1111 if (TYPE_NFIELDS (t) == 0)
1112 {
1113 TYPE_FLAGS (t) |= TYPE_FLAG_STUB;
1114 SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
1115 }
1116 add_symbol (s, top_stack->cur_block);
5f7b2142
ILT
1117 break;
1118
1119 /* End of local variables shared by struct, union, enum, and
1120 block (as yet unknown struct/union/enum) processing. */
1121 }
817bc7b8 1122
5f7b2142
ILT
1123 case_stBlock_code:
1124 /* beginnning of (code) block. Value of symbol
1125 is the displacement from procedure start */
1126 push_parse_stack ();
1127 top_stack->blocktype = stBlock;
1128 b = new_block (top_stack->maxsyms);
1129 BLOCK_START (b) = sh->value + top_stack->procadr;
1130 BLOCK_SUPERBLOCK (b) = top_stack->cur_block;
1131 top_stack->cur_block = b;
1132 add_block (b, top_stack->cur_st);
1133 break;
1134
1135 case stEnd: /* end (of anything) */
e7ff735c 1136 if (sh->sc == scInfo || sh->sc == scCommon)
5f7b2142
ILT
1137 {
1138 /* Finished with type */
1139 top_stack->cur_type = 0;
1140 }
6c2e7392
PS
1141 else if (sh->sc == scText &&
1142 (top_stack->blocktype == stProc ||
1143 top_stack->blocktype == stStaticProc))
5f7b2142
ILT
1144 {
1145 /* Finished with procedure */
1146 struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
1147 struct mips_extra_func_info *e;
1148 struct block *b;
1149 int i;
1150
1151 BLOCK_END (top_stack->cur_block) += sh->value; /* size */
1152
1153 /* Make up special symbol to contain procedure specific info */
1154 s = new_symbol (MIPS_EFI_SYMBOL_NAME);
1155 SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
1156 SYMBOL_CLASS (s) = LOC_CONST;
1157 SYMBOL_TYPE (s) = builtin_type_void;
1158 e = ((struct mips_extra_func_info *)
1159 obstack_alloc (&current_objfile->symbol_obstack,
1160 sizeof (struct mips_extra_func_info)));
85999c05 1161 SYMBOL_VALUE (s) = (long) e;
5f7b2142
ILT
1162 e->numargs = top_stack->numargs;
1163 add_symbol (s, top_stack->cur_block);
1164
1165 /* Reallocate symbols, saving memory */
1166 b = shrink_block (top_stack->cur_block, top_stack->cur_st);
1167
1168 /* f77 emits proc-level with address bounds==[0,0],
6c2e7392 1169 So look for such child blocks, and patch them. */
5f7b2142
ILT
1170 for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
1171 {
1172 struct block *b_bad = BLOCKVECTOR_BLOCK (bv, i);
1173 if (BLOCK_SUPERBLOCK (b_bad) == b
1174 && BLOCK_START (b_bad) == top_stack->procadr
1175 && BLOCK_END (b_bad) == top_stack->procadr)
1176 {
1177 BLOCK_START (b_bad) = BLOCK_START (b);
1178 BLOCK_END (b_bad) = BLOCK_END (b);
1179 }
1180 }
1181 }
1182 else if (sh->sc == scText && top_stack->blocktype == stBlock)
1183 {
6c2e7392
PS
1184 /* End of (code) block. The value of the symbol is the
1185 displacement from the procedure`s start address of the
1186 end of this block. */
5f7b2142
ILT
1187 BLOCK_END (top_stack->cur_block) = sh->value + top_stack->procadr;
1188 shrink_block (top_stack->cur_block, top_stack->cur_st);
1189 }
1190 else if (sh->sc == scText && top_stack->blocktype == stFile)
1191 {
1192 /* End of file. Pop parse stack and ignore. Higher
6c2e7392 1193 level code deals with this. */
5f7b2142 1194 ;
bd5635a1 1195 }
5f7b2142
ILT
1196 else
1197 complain (&stEnd_complaint, sh->sc);
1198
1199 pop_parse_stack (); /* restore previous lexical context */
1200 break;
1201
1202 case stMember: /* member of struct or union */
1203 f = &TYPE_FIELDS (top_stack->cur_type)[top_stack->cur_field++];
6c2e7392 1204 f->name = name;
5f7b2142
ILT
1205 f->bitpos = sh->value;
1206 f->bitsize = 0;
85999c05 1207 f->type = parse_type (cur_fd, ax + sh->index, &f->bitsize, bigend, name);
5f7b2142
ILT
1208 break;
1209
1210 case stTypedef: /* type definition */
85999c05
PS
1211 /* Typedefs for forward declarations and opaque structs from alpha cc
1212 are handled by cross_ref, skip them. */
1213 if (sh->iss == 0)
1214 break;
1215
1216 /* Parse the type or use the pending type. */
1217 pend = is_pending_symbol (cur_fdr, ext_sh);
1218 if (pend == (struct mips_pending *) NULL)
1219 {
1220 t = parse_type (cur_fd, ax + sh->index, (int *)NULL, bigend, name);
1221 add_pending (cur_fdr, ext_sh, t);
1222 }
1223 else
1224 t = pend->t;
1225
1226 /* mips cc puts out a typedef with the name of the struct for forward
1227 declarations. These should not go into the symbol table and
1228 TYPE_NAME should not be set for them.
1229 They can't be distinguished from an intentional typedef to
1230 the same name however:
1231 x.h:
1232 struct x { int ix; int jx; };
1233 struct xx;
1234 x.c:
1235 typedef struct x x;
1236 struct xx {int ixx; int jxx; };
1237 generates a cross referencing stTypedef for x and xx.
1238 The user visible effect of this is that the type of a pointer
1239 to struct foo sometimes is given as `foo *' instead of `struct foo *'.
1240 The problem is fixed with alpha cc. */
1241
6c2e7392 1242 s = new_symbol (name);
5f7b2142
ILT
1243 SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
1244 SYMBOL_CLASS (s) = LOC_TYPEDEF;
1245 SYMBOL_BLOCK_VALUE (s) = top_stack->cur_block;
85999c05 1246 SYMBOL_TYPE (s) = t;
5f7b2142 1247 add_symbol (s, top_stack->cur_block);
85999c05 1248
6ac14d25
PS
1249 /* Incomplete definitions of structs should not get a name. */
1250 if (TYPE_NAME (SYMBOL_TYPE (s)) == NULL
1251 && (TYPE_NFIELDS (SYMBOL_TYPE (s)) != 0
1252 || (TYPE_CODE (SYMBOL_TYPE (s)) != TYPE_CODE_STRUCT
1253 && TYPE_CODE (SYMBOL_TYPE (s)) != TYPE_CODE_UNION)))
1254 {
1255 if (TYPE_CODE (SYMBOL_TYPE (s)) == TYPE_CODE_PTR
1256 || TYPE_CODE (SYMBOL_TYPE (s)) == TYPE_CODE_FUNC)
1257 {
1258 /* If we are giving a name to a type such as "pointer to
1259 foo" or "function returning foo", we better not set
1260 the TYPE_NAME. If the program contains "typedef char
1261 *caddr_t;", we don't want all variables of type char
1262 * to print as caddr_t. This is not just a
1263 consequence of GDB's type management; CC and GCC (at
1264 least through version 2.4) both output variables of
1265 either type char * or caddr_t with the type
1266 refering to the stTypedef symbol for caddr_t. If a future
1267 compiler cleans this up it GDB is not ready for it
1268 yet, but if it becomes ready we somehow need to
1269 disable this check (without breaking the PCC/GCC2.4
1270 case).
1271
1272 Sigh.
1273
1274 Fortunately, this check seems not to be necessary
1275 for anything except pointers or functions. */
1276 }
1277 else
1278 TYPE_NAME (SYMBOL_TYPE (s)) = SYMBOL_NAME (s);
1279 }
5f7b2142
ILT
1280 break;
1281
1282 case stFile: /* file name */
1283 push_parse_stack ();
1284 top_stack->blocktype = sh->st;
1285 break;
1286
1287 /* I`ve never seen these for C */
1288 case stRegReloc:
1289 break; /* register relocation */
1290 case stForward:
1291 break; /* forwarding address */
1292 case stConstant:
1293 break; /* constant */
1294 default:
1295 complain (&unknown_mips_symtype_complaint, sh->st);
1296 break;
1297 }
6c2e7392 1298
5f7b2142 1299 return count;
bd5635a1
RP
1300}
1301
d747e0af
MT
1302/* Parse the type information provided in the raw AX entries for
1303 the symbol SH. Return the bitfield size in BS, in case.
1304 We must byte-swap the AX entries before we use them; BIGEND says whether
1305 they are big-endian or little-endian (from fh->fBigendian). */
bd5635a1 1306
84ffdec2 1307static struct type *
85999c05
PS
1308parse_type (fd, ax, bs, bigend, sym_name)
1309 int fd;
5f7b2142
ILT
1310 union aux_ext *ax;
1311 int *bs;
1312 int bigend;
cbba020f 1313 char *sym_name;
bd5635a1 1314{
5f7b2142
ILT
1315 /* Null entries in this map are treated specially */
1316 static struct type **map_bt[] =
1317 {
1318 &builtin_type_void, /* btNil */
1319 0, /* btAdr */
1320 &builtin_type_char, /* btChar */
1321 &builtin_type_unsigned_char,/* btUChar */
1322 &builtin_type_short, /* btShort */
1323 &builtin_type_unsigned_short, /* btUShort */
1324 &builtin_type_int, /* btInt */
1325 &builtin_type_unsigned_int, /* btUInt */
1326 &builtin_type_long, /* btLong */
1327 &builtin_type_unsigned_long,/* btULong */
1328 &builtin_type_float, /* btFloat */
1329 &builtin_type_double, /* btDouble */
1330 0, /* btStruct */
1331 0, /* btUnion */
1332 0, /* btEnum */
1333 0, /* btTypedef */
1334 0, /* btRange */
1335 0, /* btSet */
1336 &builtin_type_complex, /* btComplex */
1337 &builtin_type_double_complex, /* btDComplex */
1338 0, /* btIndirect */
1339 &builtin_type_fixed_dec, /* btFixedDec */
1340 &builtin_type_float_dec, /* btFloatDec */
1341 &builtin_type_string, /* btString */
1342 0, /* btBit */
1343 0, /* btPicture */
1344 &builtin_type_void, /* btVoid */
85999c05
PS
1345 0, /* DEC C++: Pointer to member */
1346 0, /* DEC C++: Virtual function table */
1347 0, /* DEC C++: Class (Record) */
1348 &builtin_type_long, /* btLong64 */
1349 &builtin_type_unsigned_long, /* btULong64 */
1350 &builtin_type_long_long, /* btLongLong64 */
1351 &builtin_type_unsigned_long_long, /* btULongLong64 */
1352 &builtin_type_unsigned_long, /* btAdr64 */
1353 &builtin_type_long, /* btInt64 */
1354 &builtin_type_unsigned_long, /* btUInt64 */
5f7b2142
ILT
1355 };
1356
1357 TIR t[1];
1358 struct type *tp = 0;
5f7b2142 1359 union aux_ext *tax;
6c2e7392 1360 enum type_code type_code = TYPE_CODE_UNDEF;
5f7b2142
ILT
1361
1362 /* Use aux as a type information record, map its basic type. */
1363 tax = ax;
1364 ecoff_swap_tir_in (bigend, &tax->a_ti, t);
cbba020f 1365 if (t->bt >= (sizeof (map_bt) / sizeof (*map_bt)))
5f7b2142 1366 {
cbba020f 1367 complain (&basic_type_complaint, t->bt, sym_name);
5f7b2142
ILT
1368 return builtin_type_int;
1369 }
1370 if (map_bt[t->bt])
1371 {
1372 tp = *map_bt[t->bt];
5f7b2142
ILT
1373 }
1374 else
1375 {
1376 tp = NULL;
1377 /* Cannot use builtin types -- build our own */
1378 switch (t->bt)
bd5635a1 1379 {
5f7b2142
ILT
1380 case btAdr:
1381 tp = lookup_pointer_type (builtin_type_void);
5f7b2142
ILT
1382 break;
1383 case btStruct:
1384 type_code = TYPE_CODE_STRUCT;
5f7b2142
ILT
1385 break;
1386 case btUnion:
1387 type_code = TYPE_CODE_UNION;
5f7b2142
ILT
1388 break;
1389 case btEnum:
1390 type_code = TYPE_CODE_ENUM;
5f7b2142
ILT
1391 break;
1392 case btRange:
1393 type_code = TYPE_CODE_RANGE;
5f7b2142
ILT
1394 break;
1395 case btSet:
1396 type_code = TYPE_CODE_SET;
5f7b2142
ILT
1397 break;
1398 case btTypedef:
85999c05
PS
1399 /* alpha cc uses this for typedefs. The true type will be
1400 obtained by crossreferencing below. */
1401 type_code = TYPE_CODE_ERROR;
1402 break;
5f7b2142 1403 default:
cbba020f 1404 complain (&basic_type_complaint, t->bt, sym_name);
5f7b2142 1405 return builtin_type_int;
bd5635a1 1406 }
5f7b2142 1407 }
bd5635a1 1408
5f7b2142
ILT
1409 /* Skip over any further type qualifiers (FIXME). */
1410 if (t->continued)
1411 {
1412 /* This is the way it would work if the compiler worked */
1413 TIR t1[1];
1414 do
1415 {
1416 ax++;
6c2e7392 1417 ecoff_swap_tir_in (bigend, &ax->a_ti, t1);
bd5635a1 1418 }
5f7b2142
ILT
1419 while (t1->continued);
1420 }
bd5635a1 1421
5f7b2142
ILT
1422 /* Move on to next aux */
1423 ax++;
d747e0af 1424
5f7b2142
ILT
1425 if (t->fBitfield)
1426 {
6ac14d25
PS
1427 /* Inhibit core dumps with some cfront generated objects that
1428 corrupt the TIR. */
1429 if (bs == (int *)NULL)
1430 {
cbba020f 1431 complain (&bad_fbitfield_complaint, sym_name);
6ac14d25
PS
1432 return builtin_type_int;
1433 }
5f7b2142
ILT
1434 *bs = AUX_GET_WIDTH (bigend, ax);
1435 ax++;
1436 }
bd5635a1 1437
5f7b2142
ILT
1438 /* All these types really point to some (common) MIPS type
1439 definition, and only the type-qualifiers fully identify
1440 them. We'll make the same effort at sharing. */
e7ff735c 1441 if (t->bt == btStruct ||
5f7b2142
ILT
1442 t->bt == btUnion ||
1443 t->bt == btEnum ||
e7ff735c
JK
1444
1445 /* btSet (I think) implies that the name is a tag name, not a typedef
1446 name. This apparently is a MIPS extension for C sets. */
5f7b2142
ILT
1447 t->bt == btSet)
1448 {
e7ff735c
JK
1449 char *name;
1450
85999c05
PS
1451 /* Try to cross reference this type, build new type on failure. */
1452 ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
e7ff735c 1453 if (tp == (struct type *) NULL)
85999c05 1454 tp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
e7ff735c 1455
6ac14d25
PS
1456 /* Make sure that TYPE_CODE(tp) has an expected type code.
1457 Any type may be returned from cross_ref if file indirect entries
1458 are corrupted. */
1459 if (TYPE_CODE (tp) != TYPE_CODE_STRUCT
1460 && TYPE_CODE (tp) != TYPE_CODE_UNION
1461 && TYPE_CODE (tp) != TYPE_CODE_ENUM)
e7ff735c 1462 {
cbba020f 1463 complain (&unexpected_type_code_complaint, sym_name);
6ac14d25
PS
1464 }
1465 else
1466 {
1467
1468 /* Usually, TYPE_CODE(tp) is already type_code. The main
1469 exception is if we guessed wrong re struct/union/enum. */
1470 if (TYPE_CODE (tp) != type_code)
1471 {
cbba020f 1472 complain (&bad_tag_guess_complaint, sym_name);
6ac14d25
PS
1473 TYPE_CODE (tp) = type_code;
1474 }
1475 /* Do not set the tag name if it is a compiler generated tag name
1476 (.Fxx or .xxfake or empty) for unnamed struct/union/enums. */
1477 if (name[0] == '.' || name[0] == '\0')
1478 TYPE_TAG_NAME (tp) = NULL;
1479 else if (TYPE_TAG_NAME (tp) == NULL
1480 || !STREQ (TYPE_TAG_NAME (tp), name))
1481 TYPE_TAG_NAME (tp) = obsavestring (name, strlen (name),
1482 &current_objfile->type_obstack);
e7ff735c 1483 }
e7ff735c
JK
1484 }
1485
1486 /* All these types really point to some (common) MIPS type
1487 definition, and only the type-qualifiers fully identify
6ac14d25
PS
1488 them. We'll make the same effort at sharing.
1489 FIXME: btIndirect cannot happen here as it is handled by the
1490 switch t->bt above. And we are not doing any guessing on range types. */
e7ff735c
JK
1491 if (t->bt == btIndirect ||
1492 t->bt == btRange)
1493 {
1494 char *name;
5f7b2142 1495
85999c05
PS
1496 /* Try to cross reference this type, build new type on failure. */
1497 ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
6c2e7392 1498 if (tp == (struct type *) NULL)
85999c05 1499 tp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
5f7b2142 1500
6ac14d25
PS
1501 /* Make sure that TYPE_CODE(tp) has an expected type code.
1502 Any type may be returned from cross_ref if file indirect entries
1503 are corrupted. */
1504 if (TYPE_CODE (tp) != TYPE_CODE_RANGE)
1505 {
cbba020f 1506 complain (&unexpected_type_code_complaint, sym_name);
6ac14d25
PS
1507 }
1508 else
5f7b2142 1509 {
6ac14d25
PS
1510 /* Usually, TYPE_CODE(tp) is already type_code. The main
1511 exception is if we guessed wrong re struct/union/enum. */
1512 if (TYPE_CODE (tp) != type_code)
1513 {
cbba020f 1514 complain (&bad_tag_guess_complaint, sym_name);
6ac14d25
PS
1515 TYPE_CODE (tp) = type_code;
1516 }
1517 if (TYPE_NAME (tp) == NULL || !STREQ (TYPE_NAME (tp), name))
1518 TYPE_NAME (tp) = obsavestring (name, strlen (name),
1519 &current_objfile->type_obstack);
bd5635a1 1520 }
5f7b2142 1521 }
85999c05
PS
1522 if (t->bt == btTypedef)
1523 {
1524 char *name;
1525
1526 /* Try to cross reference this type, it should succeed. */
1527 ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
1528 if (tp == (struct type *) NULL)
1529 {
1530 complain (&unable_to_cross_ref_complaint, sym_name);
1531 tp = builtin_type_int;
1532 }
1533 }
bd5635a1 1534
5f7b2142
ILT
1535 /* Deal with range types */
1536 if (t->bt == btRange)
1537 {
1538 TYPE_NFIELDS (tp) = 2;
1539 TYPE_FIELDS (tp) = ((struct field *)
1540 TYPE_ALLOC (tp, 2 * sizeof (struct field)));
1541 TYPE_FIELD_NAME (tp, 0) = obsavestring ("Low", strlen ("Low"),
1542 &current_objfile->type_obstack);
1543 TYPE_FIELD_BITPOS (tp, 0) = AUX_GET_DNLOW (bigend, ax);
1544 ax++;
1545 TYPE_FIELD_NAME (tp, 1) = obsavestring ("High", strlen ("High"),
1546 &current_objfile->type_obstack);
1547 TYPE_FIELD_BITPOS (tp, 1) = AUX_GET_DNHIGH (bigend, ax);
1548 ax++;
1549 }
bd5635a1 1550
5f7b2142 1551 /* Parse all the type qualifiers now. If there are more
6c2e7392 1552 than 6 the game will continue in the next aux */
bd5635a1
RP
1553
1554#define PARSE_TQ(tq) \
85999c05 1555 if (t->tq != tqNil) ax += upgrade_type(fd, &tp, t->tq, ax, bigend);
bd5635a1 1556
5f7b2142
ILT
1557again:PARSE_TQ (tq0);
1558 PARSE_TQ (tq1);
1559 PARSE_TQ (tq2);
1560 PARSE_TQ (tq3);
1561 PARSE_TQ (tq4);
1562 PARSE_TQ (tq5);
bd5635a1
RP
1563#undef PARSE_TQ
1564
5f7b2142
ILT
1565 if (t->continued)
1566 {
1567 tax++;
1568 ecoff_swap_tir_in (bigend, &tax->a_ti, t);
1569 goto again;
1570 }
1571 return tp;
bd5635a1
RP
1572}
1573
1574/* Make up a complex type from a basic one. Type is passed by
1575 reference in TPP and side-effected as necessary. The type
1576 qualifier TQ says how to handle the aux symbols at AX for
d747e0af
MT
1577 the symbol SX we are currently analyzing. BIGEND says whether
1578 aux symbols are big-endian or little-endian.
bd5635a1
RP
1579 Returns the number of aux symbols we parsed. */
1580
3eaebb75 1581static int
85999c05
PS
1582upgrade_type (fd, tpp, tq, ax, bigend)
1583 int fd;
5f7b2142
ILT
1584 struct type **tpp;
1585 int tq;
1586 union aux_ext *ax;
1587 int bigend;
bd5635a1 1588{
5f7b2142
ILT
1589 int off;
1590 struct type *t;
1591
1592 /* Used in array processing */
1593 int rf, id;
1594 FDR *fh;
1595 struct type *range;
1596 struct type *indx;
1597 int lower, upper;
1598 RNDXR rndx;
1599
1600 switch (tq)
1601 {
1602 case tqPtr:
1603 t = lookup_pointer_type (*tpp);
1604 *tpp = t;
1605 return 0;
1606
1607 case tqProc:
1608 t = lookup_function_type (*tpp);
1609 *tpp = t;
1610 return 0;
1611
1612 case tqArray:
1613 off = 0;
1614
1615 /* Determine and record the domain type (type of index) */
6c2e7392 1616 ecoff_swap_rndx_in (bigend, &ax->a_rndx, &rndx);
5f7b2142
ILT
1617 id = rndx.index;
1618 rf = rndx.rfd;
1619 if (rf == 0xfff)
1620 {
1621 ax++;
1622 rf = AUX_GET_ISYM (bigend, ax);
1623 off++;
1624 }
85999c05 1625 fh = get_rfd (fd, rf);
5f7b2142 1626
85999c05
PS
1627 indx = parse_type (fd,
1628 (ecoff_data (cur_bfd)->external_aux
6c2e7392
PS
1629 + fh->iauxBase
1630 + id),
cbba020f 1631 (int *) NULL, bigend, "<array index>");
5f7b2142
ILT
1632
1633 /* Get the bounds, and create the array type. */
1634 ax++;
1635 lower = AUX_GET_DNLOW (bigend, ax);
1636 ax++;
1637 upper = AUX_GET_DNHIGH (bigend, ax);
1638 ax++;
1639 rf = AUX_GET_WIDTH (bigend, ax); /* bit size of array element */
1640
1641 range = create_range_type ((struct type *) NULL, indx,
1642 lower, upper);
1643
1644 t = create_array_type ((struct type *) NULL, *tpp, range);
1645
1646 /* Check whether supplied array element bit size matches
1647 the known size of the element type. If this complaint
1648 ends up not happening, we can remove this code. It's
1649 here because we aren't sure we understand this *&%&$
1650 symbol format. */
1651 id = TYPE_LENGTH (TYPE_TARGET_TYPE (t)) << 3; /* bitsize */
1652 if (id == 0)
1653 {
1654 /* Most likely an undefined type */
1655 id = rf;
1656 TYPE_LENGTH (TYPE_TARGET_TYPE (t)) = id >> 3;
1657 }
1658 if (id != rf)
1659 complain (&array_bitsize_complaint, rf);
3eaebb75 1660
5f7b2142
ILT
1661 *tpp = t;
1662 return 4 + off;
bd5635a1 1663
5f7b2142
ILT
1664 case tqVol:
1665 /* Volatile -- currently ignored */
1666 return 0;
3eaebb75 1667
5f7b2142
ILT
1668 case tqConst:
1669 /* Const -- currently ignored */
1670 return 0;
817bc7b8 1671
5f7b2142
ILT
1672 default:
1673 complain (&unknown_type_qual_complaint, tq);
1674 return 0;
1675 }
bd5635a1
RP
1676}
1677
1678
6c2e7392
PS
1679/* Parse a procedure descriptor record PR. Note that the procedure is
1680 parsed _after_ the local symbols, now we just insert the extra
1681 information we need into a MIPS_EFI_SYMBOL_NAME symbol that has
1682 already been placed in the procedure's main block. Note also that
1683 images that have been partially stripped (ld -x) have been deprived
1684 of local symbols, and we have to cope with them here. FIRST_OFF is
1685 the offset of the first procedure for this FDR; we adjust the
b5d4d6d7
JK
1686 address by this amount, but I don't know why. SEARCH_SYMTAB is the symtab
1687 to look for the function which contains the MIPS_EFI_SYMBOL_NAME symbol
1688 in question, or NULL to use top_stack->cur_block. */
9adb88b7 1689
b5d4d6d7 1690static void parse_procedure PARAMS ((PDR *, struct symtab *, unsigned long));
bd5635a1 1691
d1bb1d41 1692static void
b5d4d6d7 1693parse_procedure (pr, search_symtab, first_off)
5f7b2142 1694 PDR *pr;
b5d4d6d7 1695 struct symtab *search_symtab;
6c2e7392 1696 unsigned long first_off;
bd5635a1 1697{
b5d4d6d7 1698 struct symbol *s, *i;
5f7b2142
ILT
1699 struct block *b;
1700 struct mips_extra_func_info *e;
1701 char *sh_name;
1702
6c2e7392
PS
1703 /* Simple rule to find files linked "-x" */
1704 if (cur_fdr->rss == -1)
5f7b2142 1705 {
6c2e7392
PS
1706 if (pr->isym == -1)
1707 {
1708 /* Static procedure at address pr->adr. Sigh. */
1709 complain (&pdr_static_symbol_complaint, pr->adr);
1710 return;
1711 }
1712 else
1713 {
1714 /* external */
1715 EXTR she;
1716
6ac14d25
PS
1717 (*ecoff_backend (cur_bfd)->swap_ext_in)
1718 (cur_bfd,
1719 ((char *) ecoff_data (cur_bfd)->external_ext
1720 + pr->isym * ecoff_backend (cur_bfd)->external_ext_size),
1721 &she);
6c2e7392
PS
1722 sh_name = ecoff_data (cur_bfd)->ssext + she.asym.iss;
1723 }
5f7b2142 1724 }
6c2e7392
PS
1725 else
1726 {
1727 /* Full symbols */
1728 SYMR sh;
1729
6ac14d25
PS
1730 (*ecoff_backend (cur_bfd)->swap_sym_in)
1731 (cur_bfd,
1732 ((char *) ecoff_data (cur_bfd)->external_sym
1733 + ((cur_fdr->isymBase + pr->isym)
1734 * ecoff_backend (cur_bfd)->external_sym_size)),
1735 &sh);
6c2e7392
PS
1736 sh_name = ecoff_data (cur_bfd)->ss + cur_fdr->issBase + sh.iss;
1737 }
1738
b5d4d6d7 1739 if (search_symtab != NULL)
6c2e7392 1740 {
b5d4d6d7
JK
1741#if 0
1742 /* This loses both in the case mentioned (want a static, find a global),
1743 but also if we are looking up a non-mangled name which happens to
1744 match the name of a mangled function. */
1745 /* We have to save the cur_fdr across the call to lookup_symbol.
1746 If the pdr is for a static function and if a global function with
1747 the same name exists, lookup_symbol will eventually read in the symtab
1748 for the global function and clobber cur_fdr. */
1749 FDR *save_cur_fdr = cur_fdr;
1750 s = lookup_symbol (sh_name, NULL, VAR_NAMESPACE, 0, NULL);
1751 cur_fdr = save_cur_fdr;
1752#else
1753 s = mylookup_symbol
1754 (sh_name,
1755 BLOCKVECTOR_BLOCK (BLOCKVECTOR (search_symtab), STATIC_BLOCK),
1756 VAR_NAMESPACE,
1757 LOC_BLOCK);
1758#endif
1759 }
1760 else
1761 s = mylookup_symbol (sh_name, top_stack->cur_block,
1762 VAR_NAMESPACE, LOC_BLOCK);
9adb88b7 1763
b5d4d6d7
JK
1764 if (s != 0)
1765 {
1766 b = SYMBOL_BLOCK_VALUE (s);
1767 }
1768 else
1769 {
1770 complain (&pdr_for_nonsymbol_complaint, sh_name);
b303297a 1771#if 1
b5d4d6d7 1772 return;
dac4929a 1773#else
817bc7b8 1774/* FIXME -- delete. We can't do symbol allocation now; it's all done. */
b5d4d6d7
JK
1775 s = new_symbol (sh_name);
1776 SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
1777 SYMBOL_CLASS (s) = LOC_BLOCK;
1778 /* Donno its type, hope int is ok */
1779 SYMBOL_TYPE (s) = lookup_function_type (builtin_type_int);
1780 add_symbol (s, top_stack->cur_block);
1781 /* Wont have symbols for this one */
1782 b = new_block (2);
1783 SYMBOL_BLOCK_VALUE (s) = b;
1784 BLOCK_FUNCTION (b) = s;
1785 BLOCK_START (b) = pr->adr;
1786 /* BOUND used to be the end of procedure's text, but the
1787 argument is no longer passed in. */
1788 BLOCK_END (b) = bound;
1789 BLOCK_SUPERBLOCK (b) = top_stack->cur_block;
1790 add_block (b, top_stack->cur_st);
817bc7b8 1791#endif
9adb88b7 1792 }
d1bb1d41 1793
b5d4d6d7
JK
1794 i = mylookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, LOC_CONST);
1795
1796 if (i)
5f7b2142 1797 {
b5d4d6d7 1798 e = (struct mips_extra_func_info *) SYMBOL_VALUE (i);
5f7b2142
ILT
1799 e->pdr = *pr;
1800 e->pdr.isym = (long) s;
6c2e7392 1801 e->pdr.adr += cur_fdr->adr - first_off;
e157305c
PS
1802
1803 /* Correct incorrect setjmp procedure descriptor from the library
1804 to make backtrace through setjmp work. */
1805 if (e->pdr.pcreg == 0 && strcmp (sh_name, "setjmp") == 0)
1806 {
1807 complain (&bad_setjmp_pdr_complaint, 0);
1808 e->pdr.pcreg = RA_REGNUM;
1809 e->pdr.regmask = 0x80000000;
1810 e->pdr.regoffset = -4;
1811 }
5f7b2142 1812 }
bd5635a1
RP
1813}
1814
1815/* Parse the external symbol ES. Just call parse_symbol() after
1816 making sure we know where the aux are for it. For procedures,
1817 parsing of the PDRs has already provided all the needed
1818 information, we only parse them if SKIP_PROCEDURES is false,
101f259c 1819 and only if this causes no symbol duplication.
d747e0af 1820 BIGEND says whether aux entries are big-endian or little-endian.
101f259c
JG
1821
1822 This routine clobbers top_stack->cur_block and ->cur_st. */
bd5635a1 1823
4ad1963e 1824static void
5f7b2142
ILT
1825parse_external (es, skip_procedures, bigend)
1826 EXTR *es;
1827 int skip_procedures;
1828 int bigend;
bd5635a1 1829{
5f7b2142 1830 union aux_ext *ax;
bd5635a1 1831
5f7b2142
ILT
1832 if (es->ifd != ifdNil)
1833 {
1834 cur_fd = es->ifd;
6c2e7392
PS
1835 cur_fdr = ecoff_data (cur_bfd)->fdr + cur_fd;
1836 ax = ecoff_data (cur_bfd)->external_aux + cur_fdr->iauxBase;
5f7b2142
ILT
1837 }
1838 else
1839 {
6c2e7392 1840 cur_fdr = ecoff_data (cur_bfd)->fdr;
5f7b2142
ILT
1841 ax = 0;
1842 }
bd5635a1 1843
5f7b2142
ILT
1844 /* Reading .o files */
1845 if (es->asym.sc == scUndefined || es->asym.sc == scNil)
1846 {
1847 char *what;
1848 switch (es->asym.st)
1849 {
1850 case stStaticProc:
bd5635a1 1851 case stProc:
5f7b2142
ILT
1852 what = "procedure";
1853 n_undef_procs++;
1854 break;
bd5635a1 1855 case stGlobal:
5f7b2142
ILT
1856 what = "variable";
1857 n_undef_vars++;
1858 break;
bd5635a1 1859 case stLabel:
5f7b2142
ILT
1860 what = "label";
1861 n_undef_labels++;
1862 break;
1863 default:
1864 what = "symbol";
1865 break;
1866 }
1867 n_undef_symbols++;
1868 /* FIXME: Turn this into a complaint? */
1869 if (info_verbose)
1870 printf_filtered ("Warning: %s `%s' is undefined (in %s)\n",
6c2e7392
PS
1871 what,
1872 ecoff_data (cur_bfd)->ssext + es->asym.iss,
1873 fdr_name (cur_fdr));
5f7b2142
ILT
1874 return;
1875 }
1876
1877 switch (es->asym.st)
1878 {
1879 case stProc:
1880 /* If we have full symbols we do not need more */
1881 if (skip_procedures)
1882 return;
6c2e7392
PS
1883 if (mylookup_symbol (ecoff_data (cur_bfd)->ssext + es->asym.iss,
1884 top_stack->cur_block,
5f7b2142
ILT
1885 VAR_NAMESPACE, LOC_BLOCK))
1886 break;
1887 /* fall through */
1888 case stGlobal:
1889 case stLabel:
6c2e7392
PS
1890 /* Note that the case of a symbol with indexNil must be handled
1891 anyways by parse_symbol(). */
6ac14d25 1892 parse_symbol (&es->asym, ax, (char *) NULL, bigend);
5f7b2142
ILT
1893 break;
1894 default:
1895 break;
1896 }
bd5635a1
RP
1897}
1898
1899/* Parse the line number info for file descriptor FH into
1900 GDB's linetable LT. MIPS' encoding requires a little bit
1901 of magic to get things out. Note also that MIPS' line
1902 numbers can go back and forth, apparently we can live
1903 with that and do not need to reorder our linetables */
1904
4ad1963e 1905static void
6c2e7392 1906parse_lines (fh, pr, lt)
5f7b2142 1907 FDR *fh;
6c2e7392 1908 PDR *pr;
5f7b2142 1909 struct linetable *lt;
bd5635a1 1910{
6c2e7392 1911 unsigned char *base;
5f7b2142
ILT
1912 int j, k;
1913 int delta, count, lineno = 0;
6c2e7392 1914 unsigned long first_off = pr->adr;
5f7b2142 1915
cbba020f 1916 if (fh->cbLine == 0)
5f7b2142
ILT
1917 return;
1918
6c2e7392
PS
1919 base = ecoff_data (cur_bfd)->line + fh->cbLineOffset;
1920
5f7b2142 1921 /* Scan by procedure descriptors */
6c2e7392
PS
1922 k = 0;
1923 for (j = 0; j < fh->cpd; j++, pr++)
5f7b2142 1924 {
85999c05 1925 long l, halt;
6c2e7392 1926 unsigned long adr;
5f7b2142
ILT
1927
1928 /* No code for this one */
1929 if (pr->iline == ilineNil ||
1930 pr->lnLow == -1 || pr->lnHigh == -1)
1931 continue;
6c2e7392
PS
1932
1933 /* Aurgh! To know where to stop expanding we must look-ahead. */
5f7b2142
ILT
1934 for (l = 1; l < (fh->cpd - j); l++)
1935 if (pr[l].iline != -1)
1936 break;
1937 if (l == (fh->cpd - j))
1938 halt = fh->cline;
1939 else
1940 halt = pr[l].iline;
6c2e7392
PS
1941
1942 /* When procedures are moved around the linenumbers are
1943 attributed to the next procedure up. */
5f7b2142
ILT
1944 if (pr->iline >= halt)
1945 continue;
1946
6c2e7392
PS
1947 base = ecoff_data (cur_bfd)->line + fh->cbLineOffset + pr->cbLineOffset;
1948 adr = fh->adr + pr->adr - first_off;
1949 l = adr >> 2; /* in words */
1950 halt += (adr >> 2) - pr->iline;
5f7b2142
ILT
1951 for (lineno = pr->lnLow; l < halt;)
1952 {
1953 count = *base & 0x0f;
1954 delta = *base++ >> 4;
1955 if (delta >= 8)
1956 delta -= 16;
1957 if (delta == -8)
1958 {
1959 delta = (base[0] << 8) | base[1];
1960 if (delta >= 0x8000)
1961 delta -= 0x10000;
1962 base += 2;
1963 }
1964 lineno += delta; /* first delta is 0 */
1965 k = add_line (lt, lineno, l, k);
1966 l += count + 1;
bd5635a1 1967 }
5f7b2142 1968 }
bd5635a1 1969}
101f259c
JG
1970\f
1971/* Master parsing procedure for first-pass reading of file symbols
6c2e7392 1972 into a partial_symtab. */
bd5635a1 1973
d747e0af 1974static void
6c2e7392 1975parse_partial_symbols (objfile, section_offsets)
d4ea2aba 1976 struct objfile *objfile;
dac4929a 1977 struct section_offsets *section_offsets;
bd5635a1 1978{
6ac14d25
PS
1979 const struct ecoff_backend_data * const backend = ecoff_backend (cur_bfd);
1980 const bfd_size_type external_sym_size = backend->external_sym_size;
1981 const bfd_size_type external_rfd_size = backend->external_rfd_size;
1982 const bfd_size_type external_ext_size = backend->external_ext_size;
1983 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
1984 = backend->swap_ext_in;
1985 void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
1986 = backend->swap_sym_in;
1987 void (* const swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *))
1988 = backend->swap_rfd_in;
5f7b2142 1989 int f_idx, s_idx;
6c2e7392 1990 HDRR *hdr = &ecoff_data (cur_bfd)->symbolic_header;
5f7b2142
ILT
1991 /* Running pointers */
1992 FDR *fh;
6ac14d25
PS
1993 char *ext_out;
1994 char *ext_out_end;
6c2e7392
PS
1995 EXTR *ext_block;
1996 register EXTR *ext_in;
1997 EXTR *ext_in_end;
1998 SYMR sh;
5f7b2142
ILT
1999 struct partial_symtab *pst;
2000
2001 int past_first_source_file = 0;
2002
2003 /* List of current psymtab's include files */
2004 char **psymtab_include_list;
2005 int includes_allocated;
2006 int includes_used;
6c2e7392 2007 EXTR *extern_tab;
5f7b2142
ILT
2008 struct pst_map *fdr_to_pst;
2009 /* Index within current psymtab dependency list */
2010 struct partial_symtab **dependency_list;
2011 int dependencies_used, dependencies_allocated;
2012 struct cleanup *old_chain;
2013 char *name;
cbba020f 2014 enum language prev_language;
5f7b2142 2015
6c2e7392
PS
2016 extern_tab = (EXTR *) obstack_alloc (&objfile->psymbol_obstack,
2017 sizeof (EXTR) * hdr->iextMax);
5f7b2142
ILT
2018
2019 includes_allocated = 30;
2020 includes_used = 0;
2021 psymtab_include_list = (char **) alloca (includes_allocated *
2022 sizeof (char *));
2023 next_symbol_text_func = mips_next_symbol_text;
2024
2025 dependencies_allocated = 30;
2026 dependencies_used = 0;
2027 dependency_list =
2028 (struct partial_symtab **) alloca (dependencies_allocated *
2029 sizeof (struct partial_symtab *));
2030
2031 last_source_file = NULL;
2032
2033 /*
6c2e7392
PS
2034 * Big plan:
2035 *
2036 * Only parse the Local and External symbols, and the Relative FDR.
2037 * Fixup enough of the loader symtab to be able to use it.
2038 * Allocate space only for the file's portions we need to
2039 * look at. (XXX)
2040 */
817bc7b8 2041
5f7b2142
ILT
2042 max_gdbinfo = 0;
2043 max_glevel = MIN_GLEVEL;
2044
2045 /* Allocate the map FDR -> PST.
2046 Minor hack: -O3 images might claim some global data belongs
2047 to FDR -1. We`ll go along with that */
2048 fdr_to_pst = (struct pst_map *) xzalloc ((hdr->ifdMax + 1) * sizeof *fdr_to_pst);
2049 old_chain = make_cleanup (free, fdr_to_pst);
2050 fdr_to_pst++;
2051 {
2052 struct partial_symtab *pst = new_psymtab ("", objfile);
2053 fdr_to_pst[-1].pst = pst;
2054 FDR_IDX (pst) = -1;
2055 }
2056
e7e02420
PS
2057 /* Allocate the global pending list. */
2058 ECOFF_PENDING_LIST (objfile) =
2059 ((struct mips_pending **)
2060 obstack_alloc (&objfile->psymbol_obstack,
2061 hdr->ifdMax * sizeof (struct mips_pending *)));
2062 memset ((PTR) ECOFF_PENDING_LIST (objfile), 0,
2063 hdr->ifdMax * sizeof (struct mips_pending *));
2064
6c2e7392
PS
2065 /* Pass 0 over external syms: swap them in. */
2066 ext_block = (EXTR *) xmalloc (hdr->iextMax * sizeof (EXTR));
2067 make_cleanup (free, ext_block);
2068
6ac14d25
PS
2069 ext_out = (char *) ecoff_data (cur_bfd)->external_ext;
2070 ext_out_end = ext_out + hdr->iextMax * external_ext_size;
6c2e7392 2071 ext_in = ext_block;
6ac14d25
PS
2072 for (; ext_out < ext_out_end; ext_out += external_ext_size, ext_in++)
2073 (*swap_ext_in) (cur_bfd, ext_out, ext_in);
6c2e7392 2074
5f7b2142 2075 /* Pass 1 over external syms: Presize and partition the list */
6c2e7392
PS
2076 ext_in = ext_block;
2077 ext_in_end = ext_in + hdr->iextMax;
2078 for (; ext_in < ext_in_end; ext_in++)
2079 fdr_to_pst[ext_in->ifd].n_globals++;
817bc7b8 2080
5f7b2142
ILT
2081 /* Pass 1.5 over files: partition out global symbol space */
2082 s_idx = 0;
2083 for (f_idx = -1; f_idx < hdr->ifdMax; f_idx++)
2084 {
2085 fdr_to_pst[f_idx].globals_offset = s_idx;
2086 s_idx += fdr_to_pst[f_idx].n_globals;
2087 fdr_to_pst[f_idx].n_globals = 0;
d4ea2aba 2088 }
bd5635a1 2089
5f7b2142 2090 /* Pass 2 over external syms: fill in external symbols */
6c2e7392
PS
2091 ext_in = ext_block;
2092 ext_in_end = ext_in + hdr->iextMax;
2093 for (; ext_in < ext_in_end; ext_in++)
5f7b2142
ILT
2094 {
2095 enum minimal_symbol_type ms_type = mst_text;
bd5635a1 2096
6c2e7392
PS
2097 extern_tab[fdr_to_pst[ext_in->ifd].globals_offset
2098 + fdr_to_pst[ext_in->ifd].n_globals++] = *ext_in;
d4ea2aba 2099
6c2e7392 2100 if (ext_in->asym.sc == scUndefined || ext_in->asym.sc == scNil)
5f7b2142 2101 continue;
101f259c 2102
6c2e7392
PS
2103 name = ecoff_data (cur_bfd)->ssext + ext_in->asym.iss;
2104 switch (ext_in->asym.st)
5f7b2142 2105 {
817bc7b8 2106 case stProc:
5f7b2142 2107 break;
85999c05
PS
2108 case stStaticProc:
2109 ms_type = mst_file_text;
2110 break;
817bc7b8 2111 case stGlobal:
6ac14d25
PS
2112 if (ext_in->asym.sc == scData
2113 || ext_in->asym.sc == scSData
2114 || ext_in->asym.sc == scRData)
2115 ms_type = mst_data;
2116 else
2117 ms_type = mst_bss;
5f7b2142 2118 break;
817bc7b8 2119 case stLabel:
6ac14d25
PS
2120 if (ext_in->asym.sc == scAbs)
2121 ms_type = mst_abs;
2122 else if (ext_in->asym.sc == scText)
2123 ms_type = mst_text;
2124 else if (ext_in->asym.sc == scData
2125 || ext_in->asym.sc == scSData
2126 || ext_in->asym.sc == scRData)
2127 ms_type = mst_data;
2128 else
2129 ms_type = mst_bss;
5f7b2142 2130 break;
817bc7b8 2131 default:
5f7b2142 2132 ms_type = mst_unknown;
6c2e7392 2133 complain (&unknown_ext_complaint, name);
bd5635a1 2134 }
6c2e7392 2135 prim_record_minimal_symbol (name, ext_in->asym.value, ms_type);
817bc7b8 2136 }
bd5635a1 2137
5f7b2142
ILT
2138 /* Pass 3 over files, over local syms: fill in static symbols */
2139 for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++)
2140 {
2141 struct partial_symtab *save_pst;
6c2e7392 2142 EXTR *ext_ptr;
dac4929a 2143
6c2e7392 2144 cur_fdr = fh = ecoff_data (cur_bfd)->fdr + f_idx;
c55e6167 2145
5f7b2142
ILT
2146 if (fh->csym == 0)
2147 {
2148 fdr_to_pst[f_idx].pst = NULL;
2149 continue;
817bc7b8 2150 }
6c2e7392
PS
2151 pst = start_psymtab_common (objfile, section_offsets,
2152 fdr_name (fh),
5f7b2142
ILT
2153 fh->cpd ? fh->adr : 0,
2154 objfile->global_psymbols.next,
2155 objfile->static_psymbols.next);
2156 pst->read_symtab_private = ((char *)
2157 obstack_alloc (&objfile->psymbol_obstack,
2158 sizeof (struct symloc)));
6c2e7392 2159 memset ((PTR) pst->read_symtab_private, 0, sizeof (struct symloc));
5f7b2142
ILT
2160
2161 save_pst = pst;
5f7b2142 2162 FDR_IDX (pst) = f_idx;
6c2e7392 2163 CUR_BFD (pst) = cur_bfd;
5f7b2142
ILT
2164
2165 /* The way to turn this into a symtab is to call... */
2166 pst->read_symtab = mipscoff_psymtab_to_symtab;
2167
e7e02420
PS
2168 /* Set up language for the pst.
2169 The language from the FDR is used if it is unambigious (e.g. cfront
2170 with native cc and g++ will set the language to C).
2171 Otherwise we have to deduce the language from the filename.
2172 Native ecoff has every header file in a separate FDR, so
2173 deduce_language_from_filename will return language_unknown for
2174 a header file, which is not what we want.
cbba020f
PS
2175 But the FDRs for the header files are after the FDR for the source
2176 file, so we can assign the language of the source file to the
2177 following header files. Then we save the language in the private
2178 pst data so that we can reuse it when building symtabs. */
2179 prev_language = psymtab_language;
e7e02420
PS
2180
2181 switch (fh->lang)
2182 {
2183 case langCplusplusV2:
2184 psymtab_language = language_cplus;
2185 break;
2186 default:
2187 psymtab_language = deduce_language_from_filename (fdr_name (fh));
2188 break;
2189 }
cbba020f
PS
2190 if (psymtab_language == language_unknown)
2191 psymtab_language = prev_language;
2192 PST_PRIVATE (pst)->pst_language = psymtab_language;
018ab14f 2193
5f7b2142
ILT
2194 pst->texthigh = pst->textlow;
2195
2196 /* For stabs-in-ecoff files, the second symbol must be @stab.
6c2e7392
PS
2197 This symbol is emitted by mips-tfile to signal that the
2198 current object file uses encapsulated stabs instead of mips
2199 ecoff for local symbols. (It is the second symbol because
2200 the first symbol is the stFile used to signal the start of a
2201 file). */
2202 processing_gcc_compilation = 0;
2203 if (fh->csym >= 2)
2204 {
6ac14d25
PS
2205 (*swap_sym_in) (cur_bfd,
2206 ((char *) ecoff_data (cur_bfd)->external_sym
2207 + (fh->isymBase + 1) * external_sym_size),
2208 &sh);
6c2e7392
PS
2209 if (STREQ (ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss,
2210 stabs_symbol))
2211 processing_gcc_compilation = 2;
2212 }
2213
2214 if (processing_gcc_compilation != 0)
5f7b2142 2215 {
5f7b2142
ILT
2216 for (cur_sdx = 2; cur_sdx < fh->csym; cur_sdx++)
2217 {
2218 int type_code;
2219 char *namestring;
6c2e7392 2220
6ac14d25
PS
2221 (*swap_sym_in) (cur_bfd,
2222 ((char *) ecoff_data (cur_bfd)->external_sym
2223 + (fh->isymBase + cur_sdx) * external_sym_size),
2224 &sh);
2225 type_code = ECOFF_UNMARK_STAB (sh.index);
2226 if (!ECOFF_IS_STAB (&sh))
5f7b2142 2227 {
6c2e7392 2228 if (sh.st == stProc || sh.st == stStaticProc)
5f7b2142 2229 {
6c2e7392
PS
2230 long procaddr = sh.value;
2231 long isym;
2232
2233
2234 isym = AUX_GET_ISYM (fh->fBigendian,
2235 (ecoff_data (cur_bfd)->external_aux
2236 + fh->iauxBase
2237 + sh.index));
6ac14d25
PS
2238 (*swap_sym_in) (cur_bfd,
2239 (((char *)
2240 ecoff_data (cur_bfd)->external_sym)
2241 + ((fh->isymBase + isym - 1)
2242 * external_sym_size)),
2243 &sh);
6c2e7392 2244 if (sh.st == stEnd)
5f7b2142 2245 {
6c2e7392 2246 long high = procaddr + sh.value;
5f7b2142
ILT
2247 if (high > pst->texthigh)
2248 pst->texthigh = high;
101f259c 2249 }
7e258d18 2250 }
5f7b2142 2251 continue;
817bc7b8 2252 }
6c2e7392
PS
2253#define SET_NAMESTRING() \
2254 namestring = ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss
7e258d18 2255#define CUR_SYMBOL_TYPE type_code
6c2e7392 2256#define CUR_SYMBOL_VALUE sh.value
dac4929a 2257#define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms)\
7e258d18
PB
2258 pst = save_pst
2259#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps) (void)0
7e258d18
PB
2260#define HANDLE_RBRAC(val) \
2261 if ((val) > save_pst->texthigh) save_pst->texthigh = (val);
7e258d18 2262#include "partial-stab.h"
7e258d18 2263 }
817bc7b8 2264 }
5f7b2142
ILT
2265 else
2266 {
5f7b2142
ILT
2267 for (cur_sdx = 0; cur_sdx < fh->csym;)
2268 {
2269 char *name;
2270 enum address_class class;
5f7b2142 2271
6ac14d25
PS
2272 (*swap_sym_in) (cur_bfd,
2273 ((char *) ecoff_data (cur_bfd)->external_sym
2274 + ((fh->isymBase + cur_sdx)
2275 * external_sym_size)),
2276 &sh);
6c2e7392 2277
6ac14d25 2278 if (ECOFF_IS_STAB (&sh))
5f7b2142
ILT
2279 {
2280 cur_sdx++;
2281 continue;
817bc7b8 2282 }
101f259c 2283
6ac14d25
PS
2284 /* Non absolute static symbols go into the minimal table. */
2285 if (sh.sc == scUndefined || sh.sc == scNil
2286 || (sh.index == indexNil
2287 && (sh.st != stStatic || sh.sc == scAbs)))
5f7b2142
ILT
2288 {
2289 /* FIXME, premature? */
2290 cur_sdx++;
2291 continue;
817bc7b8 2292 }
dac4929a 2293
6c2e7392 2294 name = ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss;
817bc7b8 2295
6c2e7392 2296 switch (sh.st)
5f7b2142
ILT
2297 {
2298 long high;
2299 long procaddr;
2300 int new_sdx;
2301
5f7b2142 2302 case stStaticProc: /* Function */
6ac14d25
PS
2303 /* I believe this is used only for file-local functions.
2304 The comment in symconst.h ("load time only static procs")
2305 isn't particularly clear on this point. */
2306 prim_record_minimal_symbol (name, sh.value, mst_file_text);
2307 /* FALLTHROUGH */
2308
2309 case stProc: /* Asm labels apparently */
5f7b2142
ILT
2310 ADD_PSYMBOL_TO_LIST (name, strlen (name),
2311 VAR_NAMESPACE, LOC_BLOCK,
6c2e7392 2312 objfile->static_psymbols, sh.value,
5f7b2142
ILT
2313 psymtab_language, objfile);
2314 /* Skip over procedure to next one. */
6c2e7392 2315 if (sh.index >= hdr->iauxMax)
5f7b2142
ILT
2316 {
2317 /* Should not happen, but does when cross-compiling
2318 with the MIPS compiler. FIXME -- pull later. */
2319 complain (&index_complaint, name);
2320 new_sdx = cur_sdx + 1; /* Don't skip at all */
2321 }
2322 else
2323 new_sdx = AUX_GET_ISYM (fh->fBigendian,
6c2e7392
PS
2324 (ecoff_data (cur_bfd)->external_aux
2325 + fh->iauxBase
2326 + sh.index));
2327 procaddr = sh.value;
5f7b2142
ILT
2328
2329 if (new_sdx <= cur_sdx)
2330 {
2331 /* This should not happen either... FIXME. */
2332 complain (&aux_index_complaint, name);
2333 new_sdx = cur_sdx + 1; /* Don't skip backward */
7e258d18 2334 }
817bc7b8 2335
5f7b2142 2336 cur_sdx = new_sdx;
6ac14d25
PS
2337 (*swap_sym_in) (cur_bfd,
2338 ((char *) ecoff_data (cur_bfd)->external_sym
2339 + ((fh->isymBase + cur_sdx - 1)
2340 * external_sym_size)),
2341 &sh);
6c2e7392 2342 if (sh.st != stEnd)
817bc7b8 2343 continue;
6c2e7392 2344 high = procaddr + sh.value;
5f7b2142
ILT
2345 if (high > pst->texthigh)
2346 pst->texthigh = high;
2347 continue;
2348
2349 case stStatic: /* Variable */
6ac14d25
PS
2350 if (sh.sc == scData || sh.sc == scSData || sh.sc == scRData)
2351 prim_record_minimal_symbol (name, sh.value, mst_file_data);
2352 else
2353 prim_record_minimal_symbol (name, sh.value, mst_file_bss);
5f7b2142
ILT
2354 class = LOC_STATIC;
2355 break;
2356
2357 case stTypedef:/* Typedef */
2358 class = LOC_TYPEDEF;
2359 break;
2360
2361 case stConstant: /* Constant decl */
2362 class = LOC_CONST;
2363 break;
2364
2365 case stUnion:
2366 case stStruct:
2367 case stEnum:
2368 case stBlock: /* { }, str, un, enum*/
e7ff735c 2369 if (sh.sc == scInfo || sh.sc == scCommon)
5f7b2142
ILT
2370 {
2371 ADD_PSYMBOL_TO_LIST (name, strlen (name),
2372 STRUCT_NAMESPACE, LOC_TYPEDEF,
2373 objfile->static_psymbols,
6c2e7392 2374 sh.value,
5f7b2142
ILT
2375 psymtab_language, objfile);
2376 }
2377 /* Skip over the block */
6c2e7392 2378 new_sdx = sh.index;
5f7b2142
ILT
2379 if (new_sdx <= cur_sdx)
2380 {
2381 /* This happens with the Ultrix kernel. */
2382 complain (&block_index_complaint, name);
2383 new_sdx = cur_sdx + 1; /* Don't skip backward */
2384 }
2385 cur_sdx = new_sdx;
2386 continue;
2387
2388 case stFile: /* File headers */
2389 case stLabel: /* Labels */
2390 case stEnd: /* Ends of files */
2391 goto skip;
2392
2393 case stLocal: /* Local variables */
2394 /* Normally these are skipped because we skip over
2395 all blocks we see. However, these can occur
2396 as visible symbols in a .h file that contains code. */
2397 goto skip;
2398
2399 default:
2400 /* Both complaints are valid: one gives symbol name,
2401 the other the offending symbol type. */
6c2e7392
PS
2402 complain (&unknown_sym_complaint, name);
2403 complain (&unknown_st_complaint, sh.st);
5f7b2142
ILT
2404 cur_sdx++;
2405 continue;
101f259c 2406 }
5f7b2142
ILT
2407 /* Use this gdb symbol */
2408 ADD_PSYMBOL_TO_LIST (name, strlen (name),
2409 VAR_NAMESPACE, class,
6c2e7392 2410 objfile->static_psymbols, sh.value,
5f7b2142
ILT
2411 psymtab_language, objfile);
2412 skip:
2413 cur_sdx++; /* Go to next file symbol */
817bc7b8 2414 }
d4ea2aba 2415
5f7b2142
ILT
2416 /* Now do enter the external symbols. */
2417 ext_ptr = &extern_tab[fdr_to_pst[f_idx].globals_offset];
2418 cur_sdx = fdr_to_pst[f_idx].n_globals;
2419 PST_PRIVATE (save_pst)->extern_count = cur_sdx;
2420 PST_PRIVATE (save_pst)->extern_tab = ext_ptr;
2421 for (; --cur_sdx >= 0; ext_ptr++)
2422 {
5f7b2142 2423 enum address_class class;
6c2e7392
PS
2424 SYMR *psh;
2425 char *name;
5f7b2142 2426
6c2e7392 2427 if (ext_ptr->ifd != f_idx)
5f7b2142 2428 abort ();
6c2e7392
PS
2429 psh = &ext_ptr->asym;
2430 switch (psh->st)
5f7b2142
ILT
2431 {
2432 case stProc:
85999c05 2433 case stStaticProc:
5f7b2142
ILT
2434 class = LOC_BLOCK;
2435 break;
2436 case stLabel:
2437 class = LOC_LABEL;
2438 break;
2439 default:
6c2e7392
PS
2440 complain (&unknown_ext_complaint,
2441 ecoff_data (cur_bfd)->ssext + psh->iss);
5f7b2142
ILT
2442 /* Fall through, pretend it's global. */
2443 case stGlobal:
2444 class = LOC_STATIC;
2445 break;
d4ea2aba 2446 }
6c2e7392
PS
2447 name = ecoff_data (cur_bfd)->ssext + psh->iss;
2448 ADD_PSYMBOL_ADDR_TO_LIST (name, strlen (name),
2449 VAR_NAMESPACE, class,
2450 objfile->global_psymbols, (CORE_ADDR) psh->value,
2451 psymtab_language, objfile);
7e258d18 2452 }
bd5635a1
RP
2453 }
2454
cbba020f
PS
2455 /* Link pst to FDR. end_psymtab returns NULL if the psymtab was
2456 empty and put on the free list. */
2457 fdr_to_pst[f_idx].pst = end_psymtab (save_pst,
2458 psymtab_include_list, includes_used,
2459 -1, save_pst->texthigh,
2460 dependency_list, dependencies_used);
5f7b2142
ILT
2461 if (objfile->ei.entry_point >= save_pst->textlow &&
2462 objfile->ei.entry_point < save_pst->texthigh)
2463 {
2464 objfile->ei.entry_file_lowpc = save_pst->textlow;
2465 objfile->ei.entry_file_highpc = save_pst->texthigh;
2466 }
817bc7b8
JG
2467 }
2468
5f7b2142
ILT
2469 /* Now scan the FDRs for dependencies */
2470 for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++)
2471 {
6c2e7392 2472 fh = f_idx + ecoff_data (cur_bfd)->fdr;
5f7b2142
ILT
2473 pst = fdr_to_pst[f_idx].pst;
2474
cbba020f
PS
2475 if (pst == (struct partial_symtab *)NULL)
2476 continue;
2477
5f7b2142
ILT
2478 /* This should catch stabs-in-ecoff. */
2479 if (fh->crfd <= 1)
2480 continue;
2481
e7e02420
PS
2482 /* Skip the first file indirect entry as it is a self dependency
2483 for source files or a reverse .h -> .c dependency for header files. */
cbba020f 2484 pst->number_of_dependencies = 0;
5f7b2142
ILT
2485 pst->dependencies =
2486 ((struct partial_symtab **)
2487 obstack_alloc (&objfile->psymbol_obstack,
e7e02420 2488 ((fh->crfd - 1)
5f7b2142 2489 * sizeof (struct partial_symtab *))));
e7e02420 2490 for (s_idx = 1; s_idx < fh->crfd; s_idx++)
5f7b2142 2491 {
6c2e7392
PS
2492 RFDT rh;
2493
6ac14d25
PS
2494 (*swap_rfd_in) (cur_bfd,
2495 ((char *) ecoff_data (cur_bfd)->external_rfd
2496 + (fh->rfdBase + s_idx) * external_rfd_size),
2497 &rh);
6c2e7392 2498 if (rh < 0 || rh >= hdr->ifdMax)
5f7b2142 2499 {
cbba020f
PS
2500 complain (&bad_file_number_complaint, rh);
2501 continue;
5f7b2142 2502 }
6c2e7392 2503
e7e02420 2504 /* Skip self dependencies of header files. */
cbba020f
PS
2505 if (rh == f_idx)
2506 continue;
bd5635a1 2507
cbba020f
PS
2508 /* Do not add to dependeny list if psymtab was empty. */
2509 if (fdr_to_pst[rh].pst == (struct partial_symtab *)NULL)
2510 continue;
2511 pst->dependencies[pst->number_of_dependencies++] = fdr_to_pst[rh].pst;
2512 }
2513 }
2514 do_cleanups (old_chain);
bd5635a1 2515}
5f7b2142 2516
bd5635a1 2517
5f7b2142 2518static char *
c55e6167 2519mips_next_symbol_text ()
7e258d18 2520{
6c2e7392
PS
2521 SYMR sh;
2522
5f7b2142 2523 cur_sdx++;
6ac14d25
PS
2524 (*ecoff_backend (cur_bfd)->swap_sym_in)
2525 (cur_bfd,
2526 ((char *) ecoff_data (cur_bfd)->external_sym
2527 + ((cur_fdr->isymBase + cur_sdx)
2528 * ecoff_backend (cur_bfd)->external_sym_size)),
2529 &sh);
6c2e7392 2530 return ecoff_data (cur_bfd)->ss + cur_fdr->issBase + sh.iss;
7e258d18 2531}
bd5635a1
RP
2532
2533/* Ancillary function to psymtab_to_symtab(). Does all the work
2534 for turning the partial symtab PST into a symtab, recurring
3eaebb75
SG
2535 first on all dependent psymtabs. The argument FILENAME is
2536 only passed so we can see in debug stack traces what file
817bc7b8
JG
2537 is being read.
2538
2539 This function has a split personality, based on whether the
2540 symbol table contains ordinary ecoff symbols, or stabs-in-ecoff.
2541 The flow of control and even the memory allocation differs. FIXME. */
bd5635a1 2542
e072c738 2543static void
5f7b2142 2544psymtab_to_symtab_1 (pst, filename)
7e258d18
PB
2545 struct partial_symtab *pst;
2546 char *filename;
bd5635a1 2547{
6ac14d25
PS
2548 const bfd_size_type external_sym_size
2549 = ecoff_backend (cur_bfd)->external_sym_size;
2550 const bfd_size_type external_pdr_size
2551 = ecoff_backend (cur_bfd)->external_pdr_size;
2552 void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
2553 = ecoff_backend (cur_bfd)->swap_sym_in;
6ac14d25
PS
2554 void (* const swap_pdr_in) PARAMS ((bfd *, PTR, PDR *))
2555 = ecoff_backend (cur_bfd)->swap_pdr_in;
5f7b2142
ILT
2556 int i;
2557 struct symtab *st;
2558 FDR *fh;
2559 struct linetable *lines;
7e258d18 2560
5f7b2142
ILT
2561 if (pst->readin)
2562 return;
2563 pst->readin = 1;
7e258d18 2564
5f7b2142
ILT
2565 /* Read in all partial symbtabs on which this one is dependent.
2566 NOTE that we do have circular dependencies, sigh. We solved
2567 that by setting pst->readin before this point. */
817bc7b8 2568
5f7b2142
ILT
2569 for (i = 0; i < pst->number_of_dependencies; i++)
2570 if (!pst->dependencies[i]->readin)
2571 {
2572 /* Inform about additional files to be read in. */
2573 if (info_verbose)
2574 {
2575 fputs_filtered (" ", stdout);
2576 wrap_here ("");
2577 fputs_filtered ("and ", stdout);
2578 wrap_here ("");
2579 printf_filtered ("%s...",
2580 pst->dependencies[i]->filename);
2581 wrap_here (""); /* Flush output */
2582 fflush (stdout);
2583 }
2584 /* We only pass the filename for debug purposes */
2585 psymtab_to_symtab_1 (pst->dependencies[i],
2586 pst->dependencies[i]->filename);
2587 }
817bc7b8 2588
ac8cf67d
PS
2589 /* Do nothing if this is a dummy psymtab. */
2590
2591 if (pst->n_global_syms == 0 && pst->n_static_syms == 0
2592 && pst->textlow == 0 && pst->texthigh == 0)
2593 return;
2594
5f7b2142 2595 /* Now read the symbols for this symtab */
817bc7b8 2596
ac8cf67d 2597 cur_bfd = CUR_BFD (pst);
5f7b2142
ILT
2598 current_objfile = pst->objfile;
2599 cur_fd = FDR_IDX (pst);
6c2e7392 2600 fh = (cur_fd == -1) ? (FDR *) NULL : ecoff_data (cur_bfd)->fdr + cur_fd;
5f7b2142 2601 cur_fdr = fh;
817bc7b8 2602
5f7b2142 2603 /* See comment in parse_partial_symbols about the @stabs sentinel. */
6c2e7392
PS
2604 processing_gcc_compilation = 0;
2605 if (fh != (FDR *) NULL && fh->csym >= 2)
5f7b2142 2606 {
6c2e7392
PS
2607 SYMR sh;
2608
6ac14d25
PS
2609 (*swap_sym_in) (cur_bfd,
2610 ((char *) ecoff_data (cur_bfd)->external_sym
2611 + (fh->isymBase + 1) * external_sym_size),
2612 &sh);
6c2e7392
PS
2613 if (STREQ (ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss,
2614 stabs_symbol))
2615 {
2616 /* We indicate that this is a GCC compilation so that certain
2617 features will be enabled in stabsread/dbxread. */
2618 processing_gcc_compilation = 2;
2619 }
2620 }
817bc7b8 2621
6c2e7392
PS
2622 if (processing_gcc_compilation != 0)
2623 {
6ac14d25
PS
2624 char *pdr_ptr;
2625 char *pdr_end;
6c2e7392 2626 int first_pdr;
e7bf1152 2627 unsigned long first_off = 0;
9adb88b7 2628
b5d4d6d7 2629 /* This symbol table contains stabs-in-ecoff entries. */
dac4929a 2630
5f7b2142 2631 /* Parse local symbols first */
817bc7b8 2632
5f7b2142
ILT
2633 if (fh->csym <= 2) /* FIXME, this blows psymtab->symtab ptr */
2634 {
2635 current_objfile = NULL;
2636 return;
2637 }
2638 for (cur_sdx = 2; cur_sdx < fh->csym; cur_sdx++)
2639 {
6c2e7392
PS
2640 SYMR sh;
2641 char *name;
2642 CORE_ADDR valu;
2643
6ac14d25
PS
2644 (*swap_sym_in) (cur_bfd,
2645 ((char *) ecoff_data (cur_bfd)->external_sym
2646 + (fh->isymBase + cur_sdx) * external_sym_size),
2647 &sh);
6c2e7392
PS
2648 name = ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss;
2649 valu = sh.value;
6ac14d25 2650 if (ECOFF_IS_STAB (&sh))
5f7b2142 2651 {
6ac14d25 2652 int type_code = ECOFF_UNMARK_STAB (sh.index);
5f7b2142
ILT
2653 process_one_symbol (type_code, 0, valu, name,
2654 pst->section_offsets, pst->objfile);
2655 if (type_code == N_FUN)
2656 {
2657 /* Make up special symbol to contain
2658 procedure specific info */
2659 struct mips_extra_func_info *e =
6c2e7392
PS
2660 ((struct mips_extra_func_info *)
2661 obstack_alloc (&current_objfile->symbol_obstack,
2662 sizeof (struct mips_extra_func_info)));
5f7b2142
ILT
2663 struct symbol *s = new_symbol (MIPS_EFI_SYMBOL_NAME);
2664 SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
2665 SYMBOL_CLASS (s) = LOC_CONST;
2666 SYMBOL_TYPE (s) = builtin_type_void;
85999c05 2667 SYMBOL_VALUE (s) = (long) e;
5f7b2142 2668 add_symbol_to_list (s, &local_symbols);
817bc7b8
JG
2669 }
2670 }
6c2e7392 2671 else if (sh.st == stLabel && sh.index != indexNil)
5f7b2142
ILT
2672 {
2673 /* Handle encoded stab line number. */
6c2e7392 2674 record_line (current_subfile, sh.index, valu);
817bc7b8 2675 }
0b0d6c3f
PS
2676 else if (sh.st == stProc || sh.st == stStaticProc || sh.st == stEnd)
2677 /* These are generated by gcc-2.x, do not complain */
2678 ;
5f7b2142 2679 else
6c2e7392 2680 complain (&stab_unknown_complaint, name);
817bc7b8 2681 }
0b0d6c3f 2682 st = end_symtab (pst->texthigh, 0, 0, pst->objfile, SECT_OFF_TEXT);
5f7b2142 2683 end_stabs ();
817bc7b8 2684
5f7b2142
ILT
2685 /* Sort the symbol table now, we are done adding symbols to it.
2686 We must do this before parse_procedure calls lookup_symbol. */
2687 sort_symtab_syms (st);
817bc7b8 2688
5f7b2142
ILT
2689 /* This may not be necessary for stabs symtabs. FIXME. */
2690 sort_blocks (st);
817bc7b8 2691
6c2e7392
PS
2692 /* Fill in procedure info next. */
2693 first_pdr = 1;
6ac14d25
PS
2694 pdr_ptr = ((char *) ecoff_data (cur_bfd)->external_pdr
2695 + fh->ipdFirst * external_pdr_size);
2696 pdr_end = pdr_ptr + fh->cpd * external_pdr_size;
2697 for (; pdr_ptr < pdr_end; pdr_ptr += external_pdr_size)
5f7b2142 2698 {
6c2e7392
PS
2699 PDR pr;
2700
6ac14d25 2701 (*swap_pdr_in) (cur_bfd, pdr_ptr, &pr);
6c2e7392
PS
2702 if (first_pdr)
2703 {
2704 first_off = pr.adr;
2705 first_pdr = 0;
2706 }
b5d4d6d7 2707 parse_procedure (&pr, st, first_off);
817bc7b8 2708 }
5f7b2142
ILT
2709 }
2710 else
2711 {
6c2e7392 2712 /* This symbol table contains ordinary ecoff entries. */
817bc7b8 2713
5f7b2142 2714 /* FIXME: doesn't use pst->section_offsets. */
dac4929a 2715
5f7b2142
ILT
2716 int f_max;
2717 int maxlines;
6c2e7392 2718 EXTR *ext_ptr;
85f0a848 2719
5f7b2142
ILT
2720 /* How many symbols will we need */
2721 /* FIXME, this does not count enum values. */
2722 f_max = pst->n_global_syms + pst->n_static_syms;
2723 if (fh == 0)
2724 {
2725 maxlines = 0;
2726 st = new_symtab ("unknown", f_max, 0, pst->objfile);
2727 }
2728 else
2729 {
2730 f_max += fh->csym + fh->cpd;
2731 maxlines = 2 * fh->cline;
2732 st = new_symtab (pst->filename, 2 * f_max, maxlines, pst->objfile);
cbba020f
PS
2733
2734 /* The proper language was already determined when building
2735 the psymtab, use it. */
2736 st->language = PST_PRIVATE (pst)->pst_language;
817bc7b8
JG
2737 }
2738
018ab14f
PS
2739 psymtab_language = st->language;
2740
5f7b2142 2741 lines = LINETABLE (st);
817bc7b8 2742
5f7b2142
ILT
2743 /* Get a new lexical context */
2744
2745 push_parse_stack ();
2746 top_stack->cur_st = st;
2747 top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (st),
2748 STATIC_BLOCK);
2749 BLOCK_START (top_stack->cur_block) = fh ? fh->adr : 0;
2750 BLOCK_END (top_stack->cur_block) = 0;
2751 top_stack->blocktype = stFile;
2752 top_stack->maxsyms = 2 * f_max;
2753 top_stack->cur_type = 0;
2754 top_stack->procadr = 0;
2755 top_stack->numargs = 0;
2756
2757 if (fh)
2758 {
6ac14d25
PS
2759 char *sym_ptr;
2760 char *sym_end;
5f7b2142
ILT
2761
2762 /* Parse local symbols first */
6ac14d25
PS
2763 sym_ptr = ((char *) ecoff_data (cur_bfd)->external_sym
2764 + fh->isymBase * external_sym_size);
2765 sym_end = sym_ptr + fh->csym * external_sym_size;
6c2e7392 2766 while (sym_ptr < sym_end)
5f7b2142 2767 {
6c2e7392
PS
2768 SYMR sh;
2769 int c;
2770
6ac14d25 2771 (*swap_sym_in) (cur_bfd, sym_ptr, &sh);
6c2e7392
PS
2772 c = parse_symbol (&sh,
2773 (ecoff_data (cur_bfd)->external_aux
2774 + fh->iauxBase),
2775 sym_ptr, fh->fBigendian);
6ac14d25 2776 sym_ptr += c * external_sym_size;
7e258d18 2777 }
bd5635a1 2778
6c2e7392
PS
2779 /* Linenumbers. At the end, check if we can save memory.
2780 parse_lines has to look ahead an arbitrary number of PDR
2781 structures, so we swap them all first. */
2782 if (fh->cpd > 0)
5f7b2142 2783 {
6c2e7392
PS
2784 PDR *pr_block;
2785 struct cleanup *old_chain;
6ac14d25
PS
2786 char *pdr_ptr;
2787 char *pdr_end;
6c2e7392
PS
2788 PDR *pdr_in;
2789 PDR *pdr_in_end;
2790
2791 pr_block = (PDR *) xmalloc (fh->cpd * sizeof (PDR));
2792
2793 old_chain = make_cleanup (free, pr_block);
2794
6ac14d25
PS
2795 pdr_ptr = ((char *) ecoff_data (cur_bfd)->external_pdr
2796 + fh->ipdFirst * external_pdr_size);
2797 pdr_end = pdr_ptr + fh->cpd * external_pdr_size;
6c2e7392 2798 pdr_in = pr_block;
6ac14d25
PS
2799 for (;
2800 pdr_ptr < pdr_end;
2801 pdr_ptr += external_pdr_size, pdr_in++)
2802 (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
6c2e7392
PS
2803
2804 parse_lines (fh, pr_block, lines);
2805 if (lines->nitems < fh->cline)
2806 lines = shrink_linetable (lines);
2807
2808 /* Fill in procedure info next. */
2809 pdr_in = pr_block;
2810 pdr_in_end = pdr_in + fh->cpd;
2811 for (; pdr_in < pdr_in_end; pdr_in++)
2812 parse_procedure (pdr_in, 0, pr_block->adr);
2813
2814 do_cleanups (old_chain);
817bc7b8 2815 }
ad142b8e 2816 }
817bc7b8 2817
5f7b2142
ILT
2818 LINETABLE (st) = lines;
2819
2820 /* .. and our share of externals.
2821 XXX use the global list to speed up things here. how?
2822 FIXME, Maybe quit once we have found the right number of ext's? */
2823 top_stack->cur_st = st;
2824 top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (top_stack->cur_st),
2825 GLOBAL_BLOCK);
2826 top_stack->blocktype = stFile;
6c2e7392
PS
2827 top_stack->maxsyms = (ecoff_data (cur_bfd)->symbolic_header.isymMax
2828 + ecoff_data (cur_bfd)->symbolic_header.ipdMax
2829 + ecoff_data (cur_bfd)->symbolic_header.iextMax);
5f7b2142
ILT
2830
2831 ext_ptr = PST_PRIVATE (pst)->extern_tab;
2832 for (i = PST_PRIVATE (pst)->extern_count; --i >= 0; ext_ptr++)
6c2e7392 2833 parse_external (ext_ptr, 1, fh->fBigendian);
5f7b2142
ILT
2834
2835 /* If there are undefined, tell the user */
2836 if (n_undef_symbols)
2837 {
2838 printf_filtered ("File %s contains %d unresolved references:",
2839 st->filename, n_undef_symbols);
2840 printf_filtered ("\n\t%4d variables\n\t%4d procedures\n\t%4d labels\n",
2841 n_undef_vars, n_undef_procs, n_undef_labels);
2842 n_undef_symbols = n_undef_labels = n_undef_vars = n_undef_procs = 0;
bd5635a1 2843
7e258d18 2844 }
5f7b2142 2845 pop_parse_stack ();
817bc7b8 2846
5f7b2142
ILT
2847 /* Sort the symbol table now, we are done adding symbols to it.*/
2848 sort_symtab_syms (st);
817bc7b8 2849
5f7b2142 2850 sort_blocks (st);
7e258d18 2851 }
7e258d18 2852
5f7b2142
ILT
2853 /* Now link the psymtab and the symtab. */
2854 pst->symtab = st;
021959e2 2855
5f7b2142 2856 current_objfile = NULL;
101f259c 2857}
bd5635a1
RP
2858\f
2859/* Ancillary parsing procedures. */
2860
2861/* Lookup the type at relative index RN. Return it in TPP
2862 if found and in any event come up with its name PNAME.
d747e0af
MT
2863 BIGEND says whether aux symbols are big-endian or not (from fh->fBigendian).
2864 Return value says how many aux symbols we ate. */
bd5635a1 2865
d747e0af 2866static int
85999c05
PS
2867cross_ref (fd, ax, tpp, type_code, pname, bigend, sym_name)
2868 int fd;
d747e0af 2869 union aux_ext *ax;
7e258d18 2870 struct type **tpp;
5f7b2142 2871 enum type_code type_code; /* Use to alloc new type if none is found. */
7e258d18 2872 char **pname;
d747e0af 2873 int bigend;
cbba020f 2874 char *sym_name;
bd5635a1 2875{
5f7b2142 2876 RNDXR rn[1];
6ac14d25 2877 unsigned int rf;
5f7b2142 2878 int result = 1;
85999c05
PS
2879 FDR *fh;
2880 char *esh;
2881 SYMR sh;
2882 int xref_fd;
2883 struct mips_pending *pend;
2884
2885 *tpp = (struct type *)NULL;
bd5635a1 2886
6c2e7392 2887 ecoff_swap_rndx_in (bigend, &ax->a_rndx, rn);
5f7b2142
ILT
2888
2889 /* Escape index means 'the next one' */
2890 if (rn->rfd == 0xfff)
2891 {
2892 result++;
2893 rf = AUX_GET_ISYM (bigend, ax + 1);
2894 }
2895 else
2896 {
2897 rf = rn->rfd;
2898 }
2899
85999c05
PS
2900 /* mips cc uses a rf of -1 for opaque struct definitions.
2901 Set TYPE_FLAG_STUB for these types so that check_stub_type will
2902 resolve them if the struct gets defined in another compilation unit. */
5f7b2142
ILT
2903 if (rf == -1)
2904 {
5f7b2142 2905 *pname = "<undefined>";
85999c05
PS
2906 *tpp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
2907 TYPE_FLAGS (*tpp) |= TYPE_FLAG_STUB;
2908 return result;
5f7b2142 2909 }
85999c05
PS
2910
2911 /* mips cc uses an escaped rn->index of 0 for struct return types
2912 of procedures that were compiled without -g. These will always remain
2913 undefined. */
2914 if (rn->rfd == 0xfff && rn->index == 0)
5f7b2142 2915 {
85999c05
PS
2916 *pname = "<undefined>";
2917 return result;
2918 }
5f7b2142 2919
85999c05
PS
2920 /* Find the relative file descriptor and the symbol in it. */
2921 fh = get_rfd (fd, rf);
2922 xref_fd = fh - ecoff_data (cur_bfd)->fdr;
6ac14d25 2923
85999c05
PS
2924 if (rn->index >= fh->csym)
2925 {
2926 /* File indirect entry is corrupt. */
2927 *pname = "<illegal>";
2928 complain (&bad_rfd_entry_complaint,
2929 sym_name, xref_fd, rn->index);
2930 return result;
2931 }
2932
2933 /* If we have processed this symbol then we left a forwarding
2934 pointer to the type in the pending list. If not, we`ll put
2935 it in a list of pending types, to be processed later when
2936 the file will be. In any event, we collect the name for the
2937 type here. */
2938
2939 esh = ((char *) ecoff_data (cur_bfd)->external_sym
2940 + ((fh->isymBase + rn->index)
2941 * ecoff_backend (cur_bfd)->external_sym_size));
2942 (*ecoff_backend (cur_bfd)->swap_sym_in) (cur_bfd, esh, &sh);
2943
2944 /* Make sure that this type of cross reference can be handled. */
2945 if (sh.sc != scInfo
2946 || (sh.st != stBlock && sh.st != stTypedef
2947 && sh.st != stStruct && sh.st != stUnion
2948 && sh.st != stEnum))
2949 {
2950 /* File indirect entry is corrupt. */
2951 *pname = "<illegal>";
2952 complain (&bad_rfd_entry_complaint,
2953 sym_name, xref_fd, rn->index);
2954 return result;
2955 }
2956
2957 *pname = ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss;
2958
2959 pend = is_pending_symbol (fh, esh);
2960 if (pend)
2961 *tpp = pend->t;
2962 else
2963 {
2964 /* We have not yet seen this type. */
2965
2966 if (sh.iss == 0 && sh.st == stTypedef)
6ac14d25 2967 {
85999c05
PS
2968 TIR tir;
2969
2970 /* alpha cc puts out a stTypedef with a sh.iss of zero for
2971 two cases:
2972 a) forward declarations of structs/unions/enums which are not
2973 defined in this compilation unit.
2974 For these the type will be void. This is a bad design decision
2975 as cross referencing across compilation units is impossible
2976 due to the missing name.
2977 b) forward declarations of structs/unions/enums which are defined
2978 later in this file or in another file in the same compilation
2979 unit. Simply cross reference those again to get the
2980 true type.
2981 The forward references are not entered in the pending list and
2982 in the symbol table. */
2983
2984 ecoff_swap_tir_in (bigend,
2985 &(ecoff_data (cur_bfd)->external_aux
2986 + fh->iauxBase + sh.index)->a_ti,
2987 &tir);
2988 if (tir.tq0 != tqNil)
2989 complain (&illegal_forward_tq0_complaint, sym_name);
2990 switch (tir.bt)
2991 {
2992 case btVoid:
2993 *tpp = init_type (type_code, 0, 0, (char *) NULL,
2994 current_objfile);
2995 *pname = "<undefined>";
2996 break;
2997
2998 case btStruct:
2999 case btUnion:
3000 case btEnum:
3001 cross_ref (xref_fd,
3002 (ecoff_data (cur_bfd)->external_aux
3003 + fh->iauxBase + sh.index + 1),
3004 tpp, type_code, pname,
3005 fh->fBigendian, sym_name);
3006 break;
3007
3008 default:
3009 complain (&illegal_forward_bt_complaint, tir.bt, sym_name);
3010 *tpp = init_type (type_code, 0, 0, (char *) NULL,
3011 current_objfile);
3012 break;
3013 }
6ac14d25
PS
3014 return result;
3015 }
85999c05 3016 else if (sh.st == stTypedef)
5f7b2142 3017 {
85999c05
PS
3018 /* Parse the type for a normal typedef. This might recursively call
3019 cross_ref till we get a non typedef'ed type.
3020 FIXME: This is not correct behaviour, but gdb currently
3021 cannot handle typedefs without type copying. But type copying is
3022 impossible as we might have mutual forward references between
3023 two files and the copied type would not get filled in when
3024 we later parse its definition. */
3025 *tpp = parse_type (xref_fd,
3026 (ecoff_data (cur_bfd)->external_aux
3027 + fh->iauxBase + sh.index),
3028 (int *)NULL,
3029 fh->fBigendian,
3030 (ecoff_data (cur_bfd)->ss
3031 + fh->issBase + sh.iss));
bd5635a1 3032 }
5f7b2142
ILT
3033 else
3034 {
85999c05
PS
3035 /* Cross reference to a struct/union/enum which is defined
3036 in another file in the same compilation unit but that file
3037 has not been parsed yet.
3038 Initialize the type only, it will be filled in when
3039 it's definition is parsed. */
3040 *tpp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
5f7b2142 3041 }
85999c05 3042 add_pending (fh, esh, *tpp);
5f7b2142 3043 }
3eaebb75 3044
5f7b2142
ILT
3045 /* We used one auxent normally, two if we got a "next one" rf. */
3046 return result;
bd5635a1
RP
3047}
3048
3049
3050/* Quick&dirty lookup procedure, to avoid the MI ones that require
3051 keeping the symtab sorted */
3052
3053static struct symbol *
3054mylookup_symbol (name, block, namespace, class)
3055 char *name;
3056 register struct block *block;
3057 enum namespace namespace;
3058 enum address_class class;
3059{
5f7b2142
ILT
3060 register int bot, top, inc;
3061 register struct symbol *sym;
3062
3063 bot = 0;
3064 top = BLOCK_NSYMS (block);
3065 inc = name[0];
3066 while (bot < top)
3067 {
3068 sym = BLOCK_SYM (block, bot);
3069 if (SYMBOL_NAME (sym)[0] == inc
3070 && SYMBOL_NAMESPACE (sym) == namespace
3071 && SYMBOL_CLASS (sym) == class
4fb0ff3b 3072 && strcmp (SYMBOL_NAME (sym), name) == 0)
5f7b2142
ILT
3073 return sym;
3074 bot++;
3075 }
3076 block = BLOCK_SUPERBLOCK (block);
3077 if (block)
3078 return mylookup_symbol (name, block, namespace, class);
3079 return 0;
bd5635a1
RP
3080}
3081
3082
3eaebb75
SG
3083/* Add a new symbol S to a block B.
3084 Infrequently, we will need to reallocate the block to make it bigger.
3085 We only detect this case when adding to top_stack->cur_block, since
3086 that's the only time we know how big the block is. FIXME. */
bd5635a1 3087
3eaebb75 3088static void
5f7b2142
ILT
3089add_symbol (s, b)
3090 struct symbol *s;
3091 struct block *b;
bd5635a1 3092{
5f7b2142
ILT
3093 int nsyms = BLOCK_NSYMS (b)++;
3094 struct block *origb;
3095 struct parse_stack *stackp;
3096
3097 if (b == top_stack->cur_block &&
3098 nsyms >= top_stack->maxsyms)
3099 {
3100 complain (&block_overflow_complaint, SYMBOL_NAME (s));
3101 /* In this case shrink_block is actually grow_block, since
3eaebb75 3102 BLOCK_NSYMS(b) is larger than its current size. */
5f7b2142
ILT
3103 origb = b;
3104 b = shrink_block (top_stack->cur_block, top_stack->cur_st);
3105
3106 /* Now run through the stack replacing pointers to the
3107 original block. shrink_block has already done this
3108 for the blockvector and BLOCK_FUNCTION. */
3109 for (stackp = top_stack; stackp; stackp = stackp->next)
3110 {
3111 if (stackp->cur_block == origb)
3112 {
3113 stackp->cur_block = b;
3114 stackp->maxsyms = BLOCK_NSYMS (b);
3115 }
3eaebb75 3116 }
5f7b2142
ILT
3117 }
3118 BLOCK_SYM (b, nsyms) = s;
bd5635a1
RP
3119}
3120
3121/* Add a new block B to a symtab S */
3122
3eaebb75 3123static void
5f7b2142
ILT
3124add_block (b, s)
3125 struct block *b;
3126 struct symtab *s;
bd5635a1 3127{
5f7b2142 3128 struct blockvector *bv = BLOCKVECTOR (s);
bd5635a1 3129
5f7b2142 3130 bv = (struct blockvector *) xrealloc ((PTR) bv,
6c2e7392
PS
3131 (sizeof (struct blockvector)
3132 + BLOCKVECTOR_NBLOCKS (bv)
3133 * sizeof (bv->block)));
5f7b2142
ILT
3134 if (bv != BLOCKVECTOR (s))
3135 BLOCKVECTOR (s) = bv;
bd5635a1 3136
5f7b2142 3137 BLOCKVECTOR_BLOCK (bv, BLOCKVECTOR_NBLOCKS (bv)++) = b;
bd5635a1
RP
3138}
3139
3140/* Add a new linenumber entry (LINENO,ADR) to a linevector LT.
3141 MIPS' linenumber encoding might need more than one byte
e157305c
PS
3142 to describe it, LAST is used to detect these continuation lines.
3143
3144 Combining lines with the same line number seems like a bad idea.
3145 E.g: There could be a line number entry with the same line number after the
3146 prologue and GDB should not ignore it (this is a better way to find
3147 a prologue than mips_skip_prologue).
3148 But due to the compressed line table format there are line number entries
3149 for the same line which are needed to bridge the gap to the next
3150 line number entry. These entries have a bogus address info with them
3151 and we are unable to tell them from intended duplicate line number
3152 entries.
3153 This is another reason why -ggdb debugging format is preferable. */
bd5635a1 3154
3eaebb75 3155static int
5f7b2142
ILT
3156add_line (lt, lineno, adr, last)
3157 struct linetable *lt;
3158 int lineno;
3159 CORE_ADDR adr;
3160 int last;
bd5635a1 3161{
5f7b2142
ILT
3162 if (last == 0)
3163 last = -2; /* make sure we record first line */
bd5635a1 3164
5f7b2142
ILT
3165 if (last == lineno) /* skip continuation lines */
3166 return lineno;
bd5635a1 3167
5f7b2142
ILT
3168 lt->item[lt->nitems].line = lineno;
3169 lt->item[lt->nitems++].pc = adr << 2;
3170 return lineno;
bd5635a1 3171}
bd5635a1 3172\f
84ffdec2 3173/* Sorting and reordering procedures */
bd5635a1 3174
bd5635a1
RP
3175/* Blocks with a smaller low bound should come first */
3176
84ffdec2 3177static int
5f7b2142 3178compare_blocks (arg1, arg2)
391ca579 3179 const void *arg1, *arg2;
bd5635a1 3180{
5f7b2142
ILT
3181 register int addr_diff;
3182 struct block **b1 = (struct block **) arg1;
3183 struct block **b2 = (struct block **) arg2;
3184
3185 addr_diff = (BLOCK_START ((*b1))) - (BLOCK_START ((*b2)));
3186 if (addr_diff == 0)
5f5341a7 3187 return (BLOCK_END ((*b2))) - (BLOCK_END ((*b1)));
5f7b2142 3188 return addr_diff;
bd5635a1
RP
3189}
3190
bd5635a1
RP
3191/* Sort the blocks of a symtab S.
3192 Reorder the blocks in the blockvector by code-address,
3193 as required by some MI search routines */
3194
e072c738 3195static void
5f7b2142
ILT
3196sort_blocks (s)
3197 struct symtab *s;
bd5635a1 3198{
5f7b2142 3199 struct blockvector *bv = BLOCKVECTOR (s);
bd5635a1 3200
5f7b2142
ILT
3201 if (BLOCKVECTOR_NBLOCKS (bv) <= 2)
3202 {
3203 /* Cosmetic */
3204 if (BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) == 0)
3205 BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) = 0;
3206 if (BLOCK_END (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) == 0)
3207 BLOCK_START (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) = 0;
3208 return;
3209 }
3210 /*
3211 * This is very unfortunate: normally all functions are compiled in
3212 * the order they are found, but if the file is compiled -O3 things
3213 * are very different. It would be nice to find a reliable test
3214 * to detect -O3 images in advance.
3215 */
3216 if (BLOCKVECTOR_NBLOCKS (bv) > 3)
3217 qsort (&BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK),
3218 BLOCKVECTOR_NBLOCKS (bv) - FIRST_LOCAL_BLOCK,
3219 sizeof (struct block *),
3220 compare_blocks);
3221
3222 {
3223 register CORE_ADDR high = 0;
3224 register int i, j = BLOCKVECTOR_NBLOCKS (bv);
3225
3226 for (i = FIRST_LOCAL_BLOCK; i < j; i++)
3227 if (high < BLOCK_END (BLOCKVECTOR_BLOCK (bv, i)))
3228 high = BLOCK_END (BLOCKVECTOR_BLOCK (bv, i));
3229 BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) = high;
3230 }
3231
3232 BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) =
3233 BLOCK_START (BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK));
3234
3235 BLOCK_START (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) =
3236 BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
3237 BLOCK_END (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) =
3238 BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
bd5635a1 3239}
bd5635a1 3240\f
5f7b2142 3241
bd5635a1
RP
3242/* Constructor/restructor/destructor procedures */
3243
3244/* Allocate a new symtab for NAME. Needs an estimate of how many symbols
3245 MAXSYMS and linenumbers MAXLINES we'll put in it */
3246
4ad1963e 3247static struct symtab *
5f7b2142
ILT
3248new_symtab (name, maxsyms, maxlines, objfile)
3249 char *name;
3250 int maxsyms;
3251 int maxlines;
3252 struct objfile *objfile;
bd5635a1 3253{
021959e2 3254 struct symtab *s = allocate_symtab (name, objfile);
bd5635a1 3255
5f7b2142 3256 LINETABLE (s) = new_linetable (maxlines);
bd5635a1 3257
021959e2 3258 /* All symtabs must have at least two blocks */
5f7b2142
ILT
3259 BLOCKVECTOR (s) = new_bvect (2);
3260 BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK) = new_block (maxsyms);
3261 BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK) = new_block (maxsyms);
3262 BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)) =
3263 BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
bd5635a1 3264
021959e2 3265 s->free_code = free_linetable;
bd5635a1 3266
021959e2 3267 return (s);
bd5635a1
RP
3268}
3269
bd5635a1
RP
3270/* Allocate a new partial_symtab NAME */
3271
3272static struct partial_symtab *
5f7b2142
ILT
3273new_psymtab (name, objfile)
3274 char *name;
3275 struct objfile *objfile;
bd5635a1 3276{
021959e2 3277 struct partial_symtab *psymtab;
817bc7b8 3278
6c2e7392 3279 psymtab = allocate_psymtab (name, objfile);
817bc7b8 3280
021959e2 3281 /* Keep a backpointer to the file's symbols */
bd5635a1 3282
5f7b2142
ILT
3283 psymtab->read_symtab_private = ((char *)
3284 obstack_alloc (&objfile->psymbol_obstack,
3285 sizeof (struct symloc)));
6c2e7392
PS
3286 memset ((PTR) psymtab->read_symtab_private, 0, sizeof (struct symloc));
3287 CUR_BFD (psymtab) = cur_bfd;
817bc7b8 3288
021959e2
JG
3289 /* The way to turn this into a symtab is to call... */
3290 psymtab->read_symtab = mipscoff_psymtab_to_symtab;
3291 return (psymtab);
bd5635a1
RP
3292}
3293
3294
84ffdec2 3295/* Allocate a linetable array of the given SIZE. Since the struct
817bc7b8 3296 already includes one item, we subtract one when calculating the
84ffdec2 3297 proper size to allocate. */
bd5635a1 3298
7e258d18 3299static struct linetable *
5f7b2142
ILT
3300new_linetable (size)
3301 int size;
bd5635a1 3302{
5f7b2142 3303 struct linetable *l;
bd5635a1 3304
5f7b2142
ILT
3305 size = (size - 1) * sizeof (l->item) + sizeof (struct linetable);
3306 l = (struct linetable *) xmalloc (size);
3307 l->nitems = 0;
3308 return l;
bd5635a1
RP
3309}
3310
3311/* Oops, too big. Shrink it. This was important with the 2.4 linetables,
84ffdec2
JG
3312 I am not so sure about the 3.4 ones.
3313
3314 Since the struct linetable already includes one item, we subtract one when
3315 calculating the proper size to allocate. */
bd5635a1 3316
7e258d18 3317static struct linetable *
5f7b2142
ILT
3318shrink_linetable (lt)
3319 struct linetable *lt;
bd5635a1 3320{
bd5635a1 3321
5f7b2142 3322 return (struct linetable *) xrealloc ((PTR) lt,
6c2e7392
PS
3323 (sizeof (struct linetable)
3324 + ((lt->nitems - 1)
3325 * sizeof (lt->item))));
bd5635a1
RP
3326}
3327
3328/* Allocate and zero a new blockvector of NBLOCKS blocks. */
3329
4ad1963e 3330static struct blockvector *
5f7b2142
ILT
3331new_bvect (nblocks)
3332 int nblocks;
bd5635a1 3333{
5f7b2142
ILT
3334 struct blockvector *bv;
3335 int size;
bd5635a1 3336
5f7b2142
ILT
3337 size = sizeof (struct blockvector) + nblocks * sizeof (struct block *);
3338 bv = (struct blockvector *) xzalloc (size);
bd5635a1 3339
5f7b2142 3340 BLOCKVECTOR_NBLOCKS (bv) = nblocks;
bd5635a1 3341
5f7b2142 3342 return bv;
bd5635a1
RP
3343}
3344
3345/* Allocate and zero a new block of MAXSYMS symbols */
3346
4ad1963e 3347static struct block *
5f7b2142
ILT
3348new_block (maxsyms)
3349 int maxsyms;
bd5635a1 3350{
5f7b2142 3351 int size = sizeof (struct block) + (maxsyms - 1) * sizeof (struct symbol *);
bd5635a1 3352
5f7b2142 3353 return (struct block *) xzalloc (size);
bd5635a1
RP
3354}
3355
3eaebb75
SG
3356/* Ooops, too big. Shrink block B in symtab S to its minimal size.
3357 Shrink_block can also be used by add_symbol to grow a block. */
bd5635a1
RP
3358
3359static struct block *
5f7b2142
ILT
3360shrink_block (b, s)
3361 struct block *b;
3362 struct symtab *s;
bd5635a1 3363{
5f7b2142
ILT
3364 struct block *new;
3365 struct blockvector *bv = BLOCKVECTOR (s);
3366 int i;
bd5635a1 3367
5f7b2142 3368 /* Just reallocate it and fix references to the old one */
bd5635a1 3369
6c2e7392
PS
3370 new = (struct block *) xrealloc ((PTR) b,
3371 (sizeof (struct block)
3372 + ((BLOCK_NSYMS (b) - 1)
3373 * sizeof (struct symbol *))));
bd5635a1 3374
5f7b2142 3375 /* Should chase pointers to old one. Fortunately, that`s just
bd5635a1 3376 the block`s function and inferior blocks */
5f7b2142
ILT
3377 if (BLOCK_FUNCTION (new) && SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) == b)
3378 SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) = new;
3379 for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
3380 if (BLOCKVECTOR_BLOCK (bv, i) == b)
3381 BLOCKVECTOR_BLOCK (bv, i) = new;
3382 else if (BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) == b)
3383 BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) = new;
3384 return new;
bd5635a1
RP
3385}
3386
3387/* Create a new symbol with printname NAME */
3388
4ad1963e 3389static struct symbol *
5f7b2142
ILT
3390new_symbol (name)
3391 char *name;
bd5635a1 3392{
6c2e7392
PS
3393 struct symbol *s = ((struct symbol *)
3394 obstack_alloc (&current_objfile->symbol_obstack,
3395 sizeof (struct symbol)));
bd5635a1 3396
5f7b2142
ILT
3397 memset ((PTR) s, 0, sizeof (*s));
3398 SYMBOL_NAME (s) = name;
018ab14f
PS
3399 SYMBOL_LANGUAGE (s) = psymtab_language;
3400 SYMBOL_INIT_DEMANGLED_NAME (s, &current_objfile->symbol_obstack);
5f7b2142 3401 return s;
bd5635a1
RP
3402}
3403
3404/* Create a new type with printname NAME */
3405
4ad1963e 3406static struct type *
5f7b2142
ILT
3407new_type (name)
3408 char *name;
bd5635a1 3409{
5f7b2142 3410 struct type *t;
bd5635a1 3411
5f7b2142
ILT
3412 t = alloc_type (current_objfile);
3413 TYPE_NAME (t) = name;
6c2e7392 3414 TYPE_CPLUS_SPECIFIC (t) = (struct cplus_struct_type *) &cplus_struct_default;
5f7b2142 3415 return t;
bd5635a1 3416}
bd5635a1 3417\f
5f7b2142 3418
bd5635a1
RP
3419/* Things used for calling functions in the inferior.
3420 These functions are exported to our companion
7e258d18 3421 mips-tdep.c file and are here because they play
bd5635a1
RP
3422 with the symbol-table explicitly. */
3423
bd5635a1
RP
3424/* Sigtramp: make sure we have all the necessary information
3425 about the signal trampoline code. Since the official code
3426 from MIPS does not do so, we make up that information ourselves.
3427 If they fix the library (unlikely) this code will neutralize itself. */
3428
d747e0af 3429static void
5f7b2142 3430fixup_sigtramp ()
bd5635a1 3431{
5f7b2142
ILT
3432 struct symbol *s;
3433 struct symtab *st;
e7bf1152 3434 struct block *b, *b0 = NULL;
bd5635a1 3435
5f7b2142 3436 sigtramp_address = -1;
bd5635a1 3437
7cf92dd2
PS
3438 /* We have to handle the following cases here:
3439 a) The Mips library has a sigtramp label within sigvec.
3440 b) Irix has a _sigtramp which we want to use, but it also has sigvec. */
5f7b2142 3441 s = lookup_symbol ("sigvec", 0, VAR_NAMESPACE, 0, NULL);
7cf92dd2 3442 if (s != 0)
5f7b2142
ILT
3443 {
3444 b0 = SYMBOL_BLOCK_VALUE (s);
5f7b2142
ILT
3445 s = lookup_symbol ("sigtramp", b0, VAR_NAMESPACE, 0, NULL);
3446 }
7cf92dd2
PS
3447 if (s == 0)
3448 {
3449 /* No sigvec or no sigtramp inside sigvec, try _sigtramp. */
3450 s = lookup_symbol ("_sigtramp", 0, VAR_NAMESPACE, 0, NULL);
3451 }
4ad1963e 3452
5f7b2142
ILT
3453 /* But maybe this program uses its own version of sigvec */
3454 if (s == 0)
3455 return;
bd5635a1 3456
5f7b2142
ILT
3457 /* Did we or MIPSco fix the library ? */
3458 if (SYMBOL_CLASS (s) == LOC_BLOCK)
3459 {
3460 sigtramp_address = BLOCK_START (SYMBOL_BLOCK_VALUE (s));
3461 sigtramp_end = BLOCK_END (SYMBOL_BLOCK_VALUE (s));
3462 return;
3463 }
bd5635a1 3464
5f7b2142
ILT
3465 sigtramp_address = SYMBOL_VALUE (s);
3466 sigtramp_end = sigtramp_address + 0x88; /* black magic */
3467
3468 /* But what symtab does it live in ? */
3469 st = find_pc_symtab (SYMBOL_VALUE (s));
3470
3471 /*
3472 * Ok, there goes the fix: turn it into a procedure, with all the
3473 * needed info. Note we make it a nested procedure of sigvec,
3474 * which is the way the (assembly) code is actually written.
3475 */
3476 SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
3477 SYMBOL_CLASS (s) = LOC_BLOCK;
3478 SYMBOL_TYPE (s) = init_type (TYPE_CODE_FUNC, 4, 0, (char *) NULL,
85999c05 3479 st->objfile);
5f7b2142
ILT
3480 TYPE_TARGET_TYPE (SYMBOL_TYPE (s)) = builtin_type_void;
3481
3482 /* Need a block to allocate MIPS_EFI_SYMBOL_NAME in */
3483 b = new_block (1);
3484 SYMBOL_BLOCK_VALUE (s) = b;
3485 BLOCK_START (b) = sigtramp_address;
3486 BLOCK_END (b) = sigtramp_end;
3487 BLOCK_FUNCTION (b) = s;
3488 BLOCK_SUPERBLOCK (b) = BLOCK_SUPERBLOCK (b0);
3489 add_block (b, st);
3490 sort_blocks (st);
3491
3492 /* Make a MIPS_EFI_SYMBOL_NAME entry for it */
3493 {
3494 struct mips_extra_func_info *e =
3495 ((struct mips_extra_func_info *)
3496 xzalloc (sizeof (struct mips_extra_func_info)));
3497
3498 e->numargs = 0; /* the kernel thinks otherwise */
3499 /* align_longword(sigcontext + SIGFRAME) */
3500 e->pdr.frameoffset = 0x150;
3501 e->pdr.framereg = SP_REGNUM;
e157305c
PS
3502 /* read_next_frame_reg provides the true pc at the time of signal */
3503 e->pdr.pcreg = PC_REGNUM;
5f7b2142
ILT
3504 e->pdr.regmask = -2;
3505 e->pdr.regoffset = -(41 * sizeof (int));
3506 e->pdr.fregmask = -1;
e157305c 3507 e->pdr.fregoffset = -(7 * sizeof (int));
5f7b2142 3508 e->pdr.isym = (long) s;
579f0258 3509 e->pdr.adr = sigtramp_address;
5f7b2142
ILT
3510
3511 current_objfile = st->objfile; /* Keep new_symbol happy */
3512 s = new_symbol (MIPS_EFI_SYMBOL_NAME);
85999c05 3513 SYMBOL_VALUE (s) = (long) e;
5f7b2142
ILT
3514 SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
3515 SYMBOL_CLASS (s) = LOC_CONST;
3516 SYMBOL_TYPE (s) = builtin_type_void;
3517 current_objfile = NULL;
3518 }
bd5635a1 3519
5f7b2142 3520 BLOCK_SYM (b, BLOCK_NSYMS (b)++) = s;
bd5635a1 3521}
dac4929a
SG
3522
3523
3524/* Fake up identical offsets for all sections. */
3525
3526struct section_offsets *
3527mipscoff_symfile_offsets (objfile, addr)
3528 struct objfile *objfile;
3529 CORE_ADDR addr;
3530{
3531 struct section_offsets *section_offsets;
3532 int i;
3533
5f7b2142
ILT
3534 section_offsets = ((struct section_offsets *)
3535 obstack_alloc (&objfile->psymbol_obstack,
3536 (sizeof (struct section_offsets)
3537 + (sizeof (section_offsets->offsets)
3538 * (SECT_OFF_MAX - 1)))));
dac4929a
SG
3539
3540 for (i = 0; i < SECT_OFF_MAX; i++)
3541 ANOFFSET (section_offsets, i) = addr;
3542
3543 return section_offsets;
3544}
bd5635a1
RP
3545\f
3546/* Initialization */
3547
80d68b1d
FF
3548static struct sym_fns ecoff_sym_fns =
3549{
5f7b2142
ILT
3550 "ecoff", /* sym_name: name or name prefix of BFD target type */
3551 5, /* sym_namelen: number of significant sym_name chars */
3552 mipscoff_new_init, /* sym_new_init: init anything gbl to entire symtab */
3553 mipscoff_symfile_init, /* sym_init: read initial info, setup for sym_read() */
3554 mipscoff_symfile_read, /* sym_read: read a symbol file into symtab */
3555 mipscoff_symfile_finish, /* sym_finish: finished with file, cleanup */
3556 mipscoff_symfile_offsets, /* sym_offsets: dummy FIXME til implem sym reloc */
3557 NULL /* next: pointer to next struct sym_fns */
80d68b1d
FF
3558};
3559
bd5635a1 3560
4ad1963e 3561void
bd5635a1
RP
3562_initialize_mipsread ()
3563{
5f7b2142
ILT
3564 add_symtab_fns (&ecoff_sym_fns);
3565
3566 /* Missing basic types */
3567
3568 builtin_type_string =
3569 init_type (TYPE_CODE_STRING,
3570 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
3571 0, "string",
3572 (struct objfile *) NULL);
3573 builtin_type_complex =
3574 init_type (TYPE_CODE_FLT,
3575 TARGET_COMPLEX_BIT / TARGET_CHAR_BIT,
3576 0, "complex",
3577 (struct objfile *) NULL);
3578 builtin_type_double_complex =
3579 init_type (TYPE_CODE_FLT,
3580 TARGET_DOUBLE_COMPLEX_BIT / TARGET_CHAR_BIT,
3581 0, "double complex",
3582 (struct objfile *) NULL);
3583 builtin_type_fixed_dec =
3584 init_type (TYPE_CODE_INT,
3585 TARGET_INT_BIT / TARGET_CHAR_BIT,
3586 0, "fixed decimal",
3587 (struct objfile *) NULL);
3588 builtin_type_float_dec =
3589 init_type (TYPE_CODE_FLT,
3590 TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
3591 0, "floating decimal",
3592 (struct objfile *) NULL);
bd5635a1 3593}
This page took 0.330308 seconds and 4 git commands to generate.