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