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