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