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