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