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