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