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