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