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