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