* mipsread.c (parse_partial_symbols, psymtab_to_symtab_1):
[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       psymtab_language = deduce_language_from_filename (fdr_name (fh));
2114
2115       pst->texthigh = pst->textlow;
2116
2117       /* For stabs-in-ecoff files, the second symbol must be @stab.
2118          This symbol is emitted by mips-tfile to signal that the
2119          current object file uses encapsulated stabs instead of mips
2120          ecoff for local symbols.  (It is the second symbol because
2121          the first symbol is the stFile used to signal the start of a
2122          file). */
2123       processing_gcc_compilation = 0;
2124       if (fh->csym >= 2)
2125         {
2126           (*swap_sym_in) (cur_bfd,
2127                           ((char *) ecoff_data (cur_bfd)->external_sym
2128                            + (fh->isymBase + 1) * external_sym_size),
2129                           &sh);
2130           if (STREQ (ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss,
2131                      stabs_symbol))
2132             processing_gcc_compilation = 2;
2133         }
2134
2135       if (processing_gcc_compilation != 0)
2136         {
2137           for (cur_sdx = 2; cur_sdx < fh->csym; cur_sdx++)
2138             {
2139               int type_code;
2140               char *namestring;
2141
2142               (*swap_sym_in) (cur_bfd,
2143                               ((char *) ecoff_data (cur_bfd)->external_sym
2144                                + (fh->isymBase + cur_sdx) * external_sym_size),
2145                               &sh);
2146               type_code = ECOFF_UNMARK_STAB (sh.index);
2147               if (!ECOFF_IS_STAB (&sh))
2148                 {
2149                   if (sh.st == stProc || sh.st == stStaticProc)
2150                     {
2151                       long procaddr = sh.value;
2152                       long isym;
2153
2154
2155                       isym = AUX_GET_ISYM (fh->fBigendian,
2156                                            (ecoff_data (cur_bfd)->external_aux
2157                                             + fh->iauxBase
2158                                             + sh.index));
2159                       (*swap_sym_in) (cur_bfd,
2160                                       (((char *)
2161                                         ecoff_data (cur_bfd)->external_sym)
2162                                        + ((fh->isymBase + isym - 1)
2163                                           * external_sym_size)),
2164                                       &sh);
2165                       if (sh.st == stEnd)
2166                         {
2167                           long high = procaddr + sh.value;
2168                           if (high > pst->texthigh)
2169                             pst->texthigh = high;
2170                         }
2171                     }
2172                   continue;
2173                 }
2174 #define SET_NAMESTRING() \
2175   namestring = ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss
2176 #define CUR_SYMBOL_TYPE type_code
2177 #define CUR_SYMBOL_VALUE sh.value
2178 #define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms)\
2179   pst = save_pst
2180 #define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps) (void)0
2181 #define HANDLE_RBRAC(val) \
2182   if ((val) > save_pst->texthigh) save_pst->texthigh = (val);
2183 #include "partial-stab.h"
2184             }
2185         }
2186       else
2187         {
2188           for (cur_sdx = 0; cur_sdx < fh->csym;)
2189             {
2190               char *name;
2191               enum address_class class;
2192
2193               (*swap_sym_in) (cur_bfd,
2194                               ((char *) ecoff_data (cur_bfd)->external_sym
2195                                + ((fh->isymBase + cur_sdx)
2196                                   * external_sym_size)),
2197                               &sh);
2198
2199               if (ECOFF_IS_STAB (&sh))
2200                 {
2201                   cur_sdx++;
2202                   continue;
2203                 }
2204
2205               /* Non absolute static symbols go into the minimal table.  */
2206               if (sh.sc == scUndefined || sh.sc == scNil
2207                   || (sh.index == indexNil
2208                       && (sh.st != stStatic || sh.sc == scAbs)))
2209                 {
2210                   /* FIXME, premature? */
2211                   cur_sdx++;
2212                   continue;
2213                 }
2214
2215               name = ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss;
2216
2217               switch (sh.st)
2218                 {
2219                   long high;
2220                   long procaddr;
2221                   int new_sdx;
2222
2223                 case stStaticProc:      /* Function */
2224                   /* I believe this is used only for file-local functions.
2225                      The comment in symconst.h ("load time only static procs")
2226                      isn't particularly clear on this point.  */
2227                   prim_record_minimal_symbol (name, sh.value, mst_file_text);
2228                   /* FALLTHROUGH */
2229
2230                 case stProc:    /* Asm labels apparently */
2231                   ADD_PSYMBOL_TO_LIST (name, strlen (name),
2232                                        VAR_NAMESPACE, LOC_BLOCK,
2233                                        objfile->static_psymbols, sh.value,
2234                                        psymtab_language, objfile);
2235                   /* Skip over procedure to next one. */
2236                   if (sh.index >= hdr->iauxMax)
2237                     {
2238                       /* Should not happen, but does when cross-compiling
2239                            with the MIPS compiler.  FIXME -- pull later.  */
2240                       complain (&index_complaint, name);
2241                       new_sdx = cur_sdx + 1;    /* Don't skip at all */
2242                     }
2243                   else
2244                     new_sdx = AUX_GET_ISYM (fh->fBigendian,
2245                                             (ecoff_data (cur_bfd)->external_aux
2246                                              + fh->iauxBase
2247                                              + sh.index));
2248                   procaddr = sh.value;
2249
2250                   if (new_sdx <= cur_sdx)
2251                     {
2252                       /* This should not happen either... FIXME.  */
2253                       complain (&aux_index_complaint, name);
2254                       new_sdx = cur_sdx + 1;    /* Don't skip backward */
2255                     }
2256
2257                   cur_sdx = new_sdx;
2258                   (*swap_sym_in) (cur_bfd,
2259                                   ((char *) ecoff_data (cur_bfd)->external_sym
2260                                    + ((fh->isymBase + cur_sdx - 1)
2261                                       * external_sym_size)),
2262                                   &sh);
2263                   if (sh.st != stEnd)
2264                     continue;
2265                   high = procaddr + sh.value;
2266                   if (high > pst->texthigh)
2267                     pst->texthigh = high;
2268                   continue;
2269
2270                 case stStatic:  /* Variable */
2271                   if (sh.sc == scData || sh.sc == scSData || sh.sc == scRData)
2272                     prim_record_minimal_symbol (name, sh.value, mst_file_data);
2273                   else
2274                     prim_record_minimal_symbol (name, sh.value, mst_file_bss);
2275                   class = LOC_STATIC;
2276                   break;
2277
2278                 case stTypedef:/* Typedef */
2279                   class = LOC_TYPEDEF;
2280                   break;
2281
2282                 case stConstant:        /* Constant decl */
2283                   class = LOC_CONST;
2284                   break;
2285
2286                 case stUnion:
2287                 case stStruct:
2288                 case stEnum:
2289                 case stBlock:   /* { }, str, un, enum*/
2290                   if (sh.sc == scInfo || sh.sc == scCommon)
2291                     {
2292                       ADD_PSYMBOL_TO_LIST (name, strlen (name),
2293                                            STRUCT_NAMESPACE, LOC_TYPEDEF,
2294                                            objfile->static_psymbols,
2295                                            sh.value,
2296                                            psymtab_language, objfile);
2297                     }
2298                   /* Skip over the block */
2299                   new_sdx = sh.index;
2300                   if (new_sdx <= cur_sdx)
2301                     {
2302                       /* This happens with the Ultrix kernel. */
2303                       complain (&block_index_complaint, name);
2304                       new_sdx = cur_sdx + 1;    /* Don't skip backward */
2305                     }
2306                   cur_sdx = new_sdx;
2307                   continue;
2308
2309                 case stFile:    /* File headers */
2310                 case stLabel:   /* Labels */
2311                 case stEnd:     /* Ends of files */
2312                   goto skip;
2313
2314                 case stLocal:   /* Local variables */
2315                   /* Normally these are skipped because we skip over
2316                      all blocks we see.  However, these can occur
2317                      as visible symbols in a .h file that contains code. */
2318                   goto skip;
2319
2320                 default:
2321                   /* Both complaints are valid:  one gives symbol name,
2322                      the other the offending symbol type.  */
2323                   complain (&unknown_sym_complaint, name);
2324                   complain (&unknown_st_complaint, sh.st);
2325                   cur_sdx++;
2326                   continue;
2327                 }
2328               /* Use this gdb symbol */
2329               ADD_PSYMBOL_TO_LIST (name, strlen (name),
2330                                    VAR_NAMESPACE, class,
2331                                    objfile->static_psymbols, sh.value,
2332                                    psymtab_language, objfile);
2333             skip:
2334               cur_sdx++;        /* Go to next file symbol */
2335             }
2336
2337           /* Now do enter the external symbols. */
2338           ext_ptr = &extern_tab[fdr_to_pst[f_idx].globals_offset];
2339           cur_sdx = fdr_to_pst[f_idx].n_globals;
2340           PST_PRIVATE (save_pst)->extern_count = cur_sdx;
2341           PST_PRIVATE (save_pst)->extern_tab = ext_ptr;
2342           for (; --cur_sdx >= 0; ext_ptr++)
2343             {
2344               enum address_class class;
2345               SYMR *psh;
2346               char *name;
2347
2348               if (ext_ptr->ifd != f_idx)
2349                 abort ();
2350               psh = &ext_ptr->asym;
2351               switch (psh->st)
2352                 {
2353                 case stProc:
2354                   class = LOC_BLOCK;
2355                   break;
2356                 case stLabel:
2357                   class = LOC_LABEL;
2358                   break;
2359                 default:
2360                   complain (&unknown_ext_complaint,
2361                             ecoff_data (cur_bfd)->ssext + psh->iss);
2362                   /* Fall through, pretend it's global.  */
2363                 case stGlobal:
2364                   class = LOC_STATIC;
2365                   break;
2366                 }
2367               name = ecoff_data (cur_bfd)->ssext + psh->iss;
2368               ADD_PSYMBOL_ADDR_TO_LIST (name, strlen (name),
2369                                         VAR_NAMESPACE, class,
2370                                         objfile->global_psymbols, (CORE_ADDR) psh->value,
2371                                         psymtab_language, objfile);
2372             }
2373         }
2374
2375       end_psymtab (save_pst, psymtab_include_list, includes_used,
2376                    -1, save_pst->texthigh,
2377                    dependency_list, dependencies_used);
2378       if (objfile->ei.entry_point >= save_pst->textlow &&
2379           objfile->ei.entry_point < save_pst->texthigh)
2380         {
2381           objfile->ei.entry_file_lowpc = save_pst->textlow;
2382           objfile->ei.entry_file_highpc = save_pst->texthigh;
2383         }
2384     }
2385
2386   /* Now scan the FDRs for dependencies */
2387   for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++)
2388     {
2389       int s_id0 = 0;
2390       fh = f_idx + ecoff_data (cur_bfd)->fdr;
2391       pst = fdr_to_pst[f_idx].pst;
2392
2393       /* This should catch stabs-in-ecoff. */
2394       if (fh->crfd <= 1)
2395         continue;
2396
2397       if (fh->cpd == 0)
2398         {               /* If there are no functions defined here ... */
2399           /* ...then presumably a .h file: drop reverse depends .h->.c */
2400           for (; s_id0 < fh->crfd; s_id0++)
2401             {
2402               RFDT rh;
2403
2404               (*swap_rfd_in) (cur_bfd,
2405                               ((char *) ecoff_data (cur_bfd)->external_rfd
2406                                + (fh->rfdBase + s_id0) * external_rfd_size),
2407                               &rh);
2408               if (rh == f_idx)
2409                 {
2410                   s_id0++;      /* Skip self-dependency */
2411                   break;
2412                 }
2413             }
2414         }
2415       pst->number_of_dependencies = fh->crfd - s_id0;
2416       pst->dependencies =
2417         ((struct partial_symtab **)
2418          obstack_alloc (&objfile->psymbol_obstack,
2419                         (pst->number_of_dependencies
2420                          * sizeof (struct partial_symtab *))));
2421       for (s_idx = s_id0; s_idx < fh->crfd; s_idx++)
2422         {
2423           RFDT rh;
2424
2425           (*swap_rfd_in) (cur_bfd,
2426                           ((char *) ecoff_data (cur_bfd)->external_rfd
2427                            + (fh->rfdBase + s_idx) * external_rfd_size),
2428                           &rh);
2429           if (rh < 0 || rh >= hdr->ifdMax)
2430             complain (&bad_file_number_complaint, rh);
2431           else
2432             pst->dependencies[s_idx - s_id0] = fdr_to_pst[rh].pst;
2433         }
2434     }
2435   do_cleanups (old_chain);
2436 }
2437
2438
2439 #if 0
2440 /* Do the initial analisys of the F_IDX-th file descriptor.
2441    Allocates a partial symtab for it, and builds the list
2442    of dependent files by recursion. LEV says at which level
2443    of recursion we are called (to pretty up debug traces) */
2444
2445 static struct partial_symtab *
2446 parse_fdr (f_idx, lev, objfile)
2447      int f_idx;
2448      int lev;
2449      struct objfile *objfile;
2450 {
2451   const bfd_size_type external_rfd_size
2452     = ecoff_backend (cur_bfd)->external_rfd_size;
2453   void (* const swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *))
2454     = ecoff_backend (cur_bfd)->swap_rfd_in;
2455   register FDR *fh;
2456   register struct partial_symtab *pst;
2457   int s_idx, s_id0;
2458
2459   fh = ecoff_data (cur_bfd)->fdr + f_idx;
2460
2461   /* Use this to indicate into which symtab this file was parsed */
2462   if (fh->ioptBase)
2463     return (struct partial_symtab *) fh->ioptBase;
2464
2465   /* Debuggability level */
2466   if (compare_glevel (max_glevel, fh->glevel) < 0)
2467     max_glevel = fh->glevel;
2468
2469   /* Make a new partial_symtab */
2470   pst = new_psymtab (fdr_name (fh), objfile);
2471   if (fh->cpd == 0)
2472     {
2473       pst->textlow = 0;
2474       pst->texthigh = 0;
2475     }
2476   else
2477     {
2478       pst->textlow = fh->adr;
2479       pst->texthigh = fh->cpd;  /* To be fixed later */
2480     }
2481
2482   /* Make everything point to everything. */
2483   FDR_IDX (pst) = f_idx;
2484   fdr_to_pst[f_idx].pst = pst;
2485   fh->ioptBase = (int) pst;
2486
2487   /* Analyze its dependencies */
2488   if (fh->crfd <= 1)
2489     return pst;
2490
2491   s_id0 = 0;
2492   if (fh->cpd == 0)
2493     {                           /* If there are no functions defined here ... */
2494       /* ...then presumably a .h file: drop reverse depends .h->.c */
2495       for (; s_id0 < fh->crfd; s_id0++)
2496         {
2497           RFDT rh;
2498
2499           (*swap_rfd_in) (cur_bfd,
2500                           ((char *) ecoff_data (cur_bfd)->external_rfd
2501                            + (fh->rfdBase + s_id0) * external_rfd_size),
2502                           &rh);
2503           if (rh == f_idx)
2504             {
2505               s_id0++;          /* Skip self-dependency */
2506               break;
2507             }
2508         }
2509     }
2510   pst->number_of_dependencies = fh->crfd - s_id0;
2511   pst->dependencies = ((struct partial_symtab **)
2512                        obstack_alloc (&objfile->psymbol_obstack,
2513                                       (pst->number_of_dependencies
2514                                        * sizeof (struct partial_symtab *))));
2515   for (s_idx = s_id0; s_idx < fh->crfd; s_idx++)
2516     {
2517       RFDT rh;
2518
2519       (*swap_rfd_in) (cur_bfd,
2520                       ((char *) ecoff_data (cur_bfd)->external_rfd
2521                        + (fh->rfdBase + s_idx) * external_rfd_size),
2522                       &rh);
2523       pst->dependencies[s_idx - s_id0] = parse_fdr (rh, lev + 1, objfile);
2524     }
2525
2526   return pst;
2527 }
2528
2529 #endif
2530
2531 static char *
2532 mips_next_symbol_text ()
2533 {
2534   SYMR sh;
2535
2536   cur_sdx++;
2537   (*ecoff_backend (cur_bfd)->swap_sym_in)
2538     (cur_bfd,
2539      ((char *) ecoff_data (cur_bfd)->external_sym
2540       + ((cur_fdr->isymBase + cur_sdx)
2541          * ecoff_backend (cur_bfd)->external_sym_size)),
2542      &sh);
2543   return ecoff_data (cur_bfd)->ss + cur_fdr->issBase + sh.iss;
2544 }
2545
2546 /* Ancillary function to psymtab_to_symtab().  Does all the work
2547    for turning the partial symtab PST into a symtab, recurring
2548    first on all dependent psymtabs.  The argument FILENAME is
2549    only passed so we can see in debug stack traces what file
2550    is being read.
2551
2552    This function has a split personality, based on whether the
2553    symbol table contains ordinary ecoff symbols, or stabs-in-ecoff.
2554    The flow of control and even the memory allocation differs.  FIXME.  */
2555
2556 static void
2557 psymtab_to_symtab_1 (pst, filename)
2558      struct partial_symtab *pst;
2559      char *filename;
2560 {
2561   const bfd_size_type external_sym_size
2562     = ecoff_backend (cur_bfd)->external_sym_size;
2563   const bfd_size_type external_pdr_size
2564     = ecoff_backend (cur_bfd)->external_pdr_size;
2565   void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
2566     = ecoff_backend (cur_bfd)->swap_sym_in;
2567   void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR))
2568     = ecoff_backend (cur_bfd)->swap_sym_out;
2569   void (* const swap_pdr_in) PARAMS ((bfd *, PTR, PDR *))
2570     = ecoff_backend (cur_bfd)->swap_pdr_in;
2571   int i;
2572   struct symtab *st;
2573   FDR *fh;
2574   struct linetable *lines;
2575
2576   if (pst->readin)
2577     return;
2578   pst->readin = 1;
2579
2580   /* Read in all partial symbtabs on which this one is dependent.
2581      NOTE that we do have circular dependencies, sigh.  We solved
2582      that by setting pst->readin before this point.  */
2583
2584   for (i = 0; i < pst->number_of_dependencies; i++)
2585     if (!pst->dependencies[i]->readin)
2586       {
2587         /* Inform about additional files to be read in.  */
2588         if (info_verbose)
2589           {
2590             fputs_filtered (" ", stdout);
2591             wrap_here ("");
2592             fputs_filtered ("and ", stdout);
2593             wrap_here ("");
2594             printf_filtered ("%s...",
2595                              pst->dependencies[i]->filename);
2596             wrap_here ("");     /* Flush output */
2597             fflush (stdout);
2598           }
2599         /* We only pass the filename for debug purposes */
2600         psymtab_to_symtab_1 (pst->dependencies[i],
2601                              pst->dependencies[i]->filename);
2602       }
2603
2604   /* Do nothing if this is a dummy psymtab.  */
2605
2606   if (pst->n_global_syms == 0 && pst->n_static_syms == 0
2607       && pst->textlow == 0 && pst->texthigh == 0)
2608     return;
2609
2610   /* Now read the symbols for this symtab */
2611
2612   cur_bfd = CUR_BFD (pst);
2613   current_objfile = pst->objfile;
2614   cur_fd = FDR_IDX (pst);
2615   fh = (cur_fd == -1) ? (FDR *) NULL : ecoff_data (cur_bfd)->fdr + cur_fd;
2616   cur_fdr = fh;
2617
2618   /* See comment in parse_partial_symbols about the @stabs sentinel. */
2619   processing_gcc_compilation = 0;
2620   if (fh != (FDR *) NULL && fh->csym >= 2)
2621     {
2622       SYMR sh;
2623
2624       (*swap_sym_in) (cur_bfd,
2625                       ((char *) ecoff_data (cur_bfd)->external_sym
2626                        + (fh->isymBase + 1) * external_sym_size),
2627                       &sh);
2628       if (STREQ (ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss,
2629                  stabs_symbol))
2630         {
2631           /* We indicate that this is a GCC compilation so that certain
2632              features will be enabled in stabsread/dbxread.  */
2633           processing_gcc_compilation = 2;
2634         }
2635     }
2636
2637   if (processing_gcc_compilation != 0)
2638     {
2639       char *pdr_ptr;
2640       char *pdr_end;
2641       int first_pdr;
2642       unsigned long first_off;
2643
2644       /* This symbol table contains stabs-in-ecoff entries.  */
2645
2646       /* Parse local symbols first */
2647
2648       if (fh->csym <= 2)        /* FIXME, this blows psymtab->symtab ptr */
2649         {
2650           current_objfile = NULL;
2651           return;
2652         }
2653       for (cur_sdx = 2; cur_sdx < fh->csym; cur_sdx++)
2654         {
2655           SYMR sh;
2656           char *name;
2657           CORE_ADDR valu;
2658
2659           (*swap_sym_in) (cur_bfd,
2660                           ((char *) ecoff_data (cur_bfd)->external_sym
2661                            + (fh->isymBase + cur_sdx) * external_sym_size),
2662                           &sh);
2663           name = ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss;
2664           valu = sh.value;
2665           if (ECOFF_IS_STAB (&sh))
2666             {
2667               int type_code = ECOFF_UNMARK_STAB (sh.index);
2668               process_one_symbol (type_code, 0, valu, name,
2669                                   pst->section_offsets, pst->objfile);
2670               if (type_code == N_FUN)
2671                 {
2672                   /* Make up special symbol to contain
2673                      procedure specific info */
2674                   struct mips_extra_func_info *e =
2675                     ((struct mips_extra_func_info *)
2676                      obstack_alloc (&current_objfile->symbol_obstack,
2677                                     sizeof (struct mips_extra_func_info)));
2678                   struct symbol *s = new_symbol (MIPS_EFI_SYMBOL_NAME);
2679                   SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
2680                   SYMBOL_CLASS (s) = LOC_CONST;
2681                   SYMBOL_TYPE (s) = builtin_type_void;
2682                   SYMBOL_VALUE (s) = (int) e;
2683                   add_symbol_to_list (s, &local_symbols);
2684                 }
2685             }
2686           else if (sh.st == stLabel && sh.index != indexNil)
2687             {
2688               /* Handle encoded stab line number. */
2689               record_line (current_subfile, sh.index, valu);
2690             }
2691           else if (sh.st == stProc || sh.st == stStaticProc || sh.st == stEnd)
2692             /* These are generated by gcc-2.x, do not complain */
2693             ;
2694           else
2695             complain (&stab_unknown_complaint, name);
2696         }
2697       st = end_symtab (pst->texthigh, 0, 0, pst->objfile, SECT_OFF_TEXT);
2698       end_stabs ();
2699
2700       /* Sort the symbol table now, we are done adding symbols to it.
2701          We must do this before parse_procedure calls lookup_symbol.  */
2702       sort_symtab_syms (st);
2703
2704       /* This may not be necessary for stabs symtabs.  FIXME.  */
2705       sort_blocks (st);
2706
2707       /* Fill in procedure info next.  */
2708       first_pdr = 1;
2709       pdr_ptr = ((char *) ecoff_data (cur_bfd)->external_pdr
2710                  + fh->ipdFirst * external_pdr_size);
2711       pdr_end = pdr_ptr + fh->cpd * external_pdr_size;
2712       for (; pdr_ptr < pdr_end; pdr_ptr += external_pdr_size)
2713         {
2714           PDR pr;
2715
2716           (*swap_pdr_in) (cur_bfd, pdr_ptr, &pr);
2717           if (first_pdr)
2718             {
2719               first_off = pr.adr;
2720               first_pdr = 0;
2721             }
2722           parse_procedure (&pr, st, first_off);
2723         }
2724     }
2725   else
2726     {
2727       /* This symbol table contains ordinary ecoff entries.  */
2728
2729       /* FIXME:  doesn't use pst->section_offsets.  */
2730
2731       int f_max;
2732       int maxlines;
2733       EXTR *ext_ptr;
2734
2735       /* How many symbols will we need */
2736       /* FIXME, this does not count enum values. */
2737       f_max = pst->n_global_syms + pst->n_static_syms;
2738       if (fh == 0)
2739         {
2740           maxlines = 0;
2741           st = new_symtab ("unknown", f_max, 0, pst->objfile);
2742         }
2743       else
2744         {
2745           f_max += fh->csym + fh->cpd;
2746           maxlines = 2 * fh->cline;
2747           st = new_symtab (pst->filename, 2 * f_max, maxlines, pst->objfile);
2748         }
2749
2750       psymtab_language = st->language;
2751
2752       lines = LINETABLE (st);
2753       pending_list = PST_PRIVATE (pst)->pending_list;
2754       if (pending_list == 0)
2755         {
2756           pending_list = ((struct mips_pending **)
2757                           xzalloc (ecoff_data (cur_bfd)->symbolic_header.ifdMax
2758                                    * sizeof (struct mips_pending *)));
2759           PST_PRIVATE (pst)->pending_list = pending_list;
2760         }
2761
2762       /* Get a new lexical context */
2763
2764       push_parse_stack ();
2765       top_stack->cur_st = st;
2766       top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (st),
2767                                                 STATIC_BLOCK);
2768       BLOCK_START (top_stack->cur_block) = fh ? fh->adr : 0;
2769       BLOCK_END (top_stack->cur_block) = 0;
2770       top_stack->blocktype = stFile;
2771       top_stack->maxsyms = 2 * f_max;
2772       top_stack->cur_type = 0;
2773       top_stack->procadr = 0;
2774       top_stack->numargs = 0;
2775
2776       if (fh)
2777         {
2778           char *sym_ptr;
2779           char *sym_end;
2780
2781           /* Parse local symbols first */
2782           sym_ptr = ((char *) ecoff_data (cur_bfd)->external_sym
2783                      + fh->isymBase * external_sym_size);
2784           sym_end = sym_ptr + fh->csym * external_sym_size;
2785           while (sym_ptr < sym_end)
2786             {
2787               SYMR sh;
2788               int c;
2789
2790               (*swap_sym_in) (cur_bfd, sym_ptr, &sh);
2791               c = parse_symbol (&sh,
2792                                 (ecoff_data (cur_bfd)->external_aux
2793                                  + fh->iauxBase),
2794                                 sym_ptr, fh->fBigendian);
2795               /* FIXME: We must swap the modified symbol back out,
2796                  although we would rather not.  See parse_symbol.  */
2797               (*swap_sym_out) (cur_bfd, &sh, sym_ptr);
2798               sym_ptr += c * external_sym_size;
2799             }
2800
2801           /* Linenumbers.  At the end, check if we can save memory.
2802              parse_lines has to look ahead an arbitrary number of PDR
2803              structures, so we swap them all first.  */
2804           if (fh->cpd > 0)
2805             {
2806               PDR *pr_block;
2807               struct cleanup *old_chain;
2808               char *pdr_ptr;
2809               char *pdr_end;
2810               PDR *pdr_in;
2811               PDR *pdr_in_end;
2812
2813               pr_block = (PDR *) xmalloc (fh->cpd * sizeof (PDR));
2814
2815               old_chain = make_cleanup (free, pr_block);
2816
2817               pdr_ptr = ((char *) ecoff_data (cur_bfd)->external_pdr
2818                          + fh->ipdFirst * external_pdr_size);
2819               pdr_end = pdr_ptr + fh->cpd * external_pdr_size;
2820               pdr_in = pr_block;
2821               for (;
2822                    pdr_ptr < pdr_end;
2823                    pdr_ptr += external_pdr_size, pdr_in++)
2824                 (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
2825
2826               parse_lines (fh, pr_block, lines);
2827               if (lines->nitems < fh->cline)
2828                 lines = shrink_linetable (lines);
2829
2830               /* Fill in procedure info next.  */
2831               pdr_in = pr_block;
2832               pdr_in_end = pdr_in + fh->cpd;
2833               for (; pdr_in < pdr_in_end; pdr_in++)
2834                 parse_procedure (pdr_in, 0, pr_block->adr);
2835
2836               do_cleanups (old_chain);
2837             }
2838         }
2839
2840       LINETABLE (st) = lines;
2841
2842       /* .. and our share of externals.
2843          XXX use the global list to speed up things here. how?
2844          FIXME, Maybe quit once we have found the right number of ext's? */
2845       top_stack->cur_st = st;
2846       top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (top_stack->cur_st),
2847                                                 GLOBAL_BLOCK);
2848       top_stack->blocktype = stFile;
2849       top_stack->maxsyms = (ecoff_data (cur_bfd)->symbolic_header.isymMax
2850                             + ecoff_data (cur_bfd)->symbolic_header.ipdMax
2851                             + ecoff_data (cur_bfd)->symbolic_header.iextMax);
2852
2853       ext_ptr = PST_PRIVATE (pst)->extern_tab;
2854       for (i = PST_PRIVATE (pst)->extern_count; --i >= 0; ext_ptr++)
2855         parse_external (ext_ptr, 1, fh->fBigendian);
2856
2857       /* If there are undefined, tell the user */
2858       if (n_undef_symbols)
2859         {
2860           printf_filtered ("File %s contains %d unresolved references:",
2861                            st->filename, n_undef_symbols);
2862           printf_filtered ("\n\t%4d variables\n\t%4d procedures\n\t%4d labels\n",
2863                            n_undef_vars, n_undef_procs, n_undef_labels);
2864           n_undef_symbols = n_undef_labels = n_undef_vars = n_undef_procs = 0;
2865
2866         }
2867       pop_parse_stack ();
2868
2869       /* Sort the symbol table now, we are done adding symbols to it.*/
2870       sort_symtab_syms (st);
2871
2872       sort_blocks (st);
2873     }
2874
2875   /* Now link the psymtab and the symtab.  */
2876   pst->symtab = st;
2877
2878   current_objfile = NULL;
2879 }
2880 \f
2881 /* Ancillary parsing procedures. */
2882
2883 /* Lookup the type at relative index RN.  Return it in TPP
2884    if found and in any event come up with its name PNAME.
2885    BIGEND says whether aux symbols are big-endian or not (from fh->fBigendian).
2886    Return value says how many aux symbols we ate. */
2887
2888 static int
2889 cross_ref (ax, tpp, type_code, pname, bigend)
2890      union aux_ext *ax;
2891      struct type **tpp;
2892      enum type_code type_code;  /* Use to alloc new type if none is found. */
2893      char **pname;
2894      int bigend;
2895 {
2896   RNDXR rn[1];
2897   unsigned int rf;
2898   int result = 1;
2899
2900   ecoff_swap_rndx_in (bigend, &ax->a_rndx, rn);
2901
2902   /* Escape index means 'the next one' */
2903   if (rn->rfd == 0xfff)
2904     {
2905       result++;
2906       rf = AUX_GET_ISYM (bigend, ax + 1);
2907     }
2908   else
2909     {
2910       rf = rn->rfd;
2911     }
2912
2913   if (rf == -1)
2914     {
2915       /* Ooops */
2916       *pname = "<undefined>";
2917     }
2918   else
2919     {
2920       /*
2921        * Find the relative file descriptor and the symbol in it
2922        */
2923       FDR *fh = get_rfd (cur_fd, rf);
2924       char *esh;
2925       SYMR sh;
2926       struct type *t;
2927
2928       if (rn->index >= fh->csym)
2929         {
2930           /* File indirect entry is corrupt.  */
2931           *tpp = (struct type *)NULL;
2932           *pname = "<illegal>";
2933           complain (&bad_rfd_entry_complaint,
2934                     fh - ecoff_data (cur_bfd)->fdr, rn->index);
2935           return result;
2936         }
2937
2938       /* If we have processed this symbol then we left a forwarding
2939          pointer to the corresponding GDB symbol.  If not, we`ll put
2940          it in a list of pending symbols, to be processed later when
2941          the file will be.  In any event, we collect the name for the
2942          type here.  Which is why we made a first pass at strings.  */
2943
2944       esh = ((char *) ecoff_data (cur_bfd)->external_sym
2945              + ((fh->isymBase + rn->index)
2946                 * ecoff_backend (cur_bfd)->external_sym_size));
2947       (*ecoff_backend (cur_bfd)->swap_sym_in) (cur_bfd, esh, &sh);
2948
2949       /* Careful, we might be looking at .o files */
2950       if (sh.iss == 0)
2951         *pname = "<undefined>";
2952       else if (rn->rfd == 0xfff && rn->index == 0)
2953         /* For structs, unions and enums, rn->rfd is 0xfff and the index
2954            is a relative symbol number for the type, but an index of 0
2955            seems to mean that we don't know.  This is said to fix a problem
2956            with "info func opendir" on an SGI showing
2957            "struct BSDopendir.c *BSDopendir();".  */
2958         {
2959           *tpp = (struct type *)NULL;
2960           *pname = "<unknown>";
2961           return result;
2962         }
2963       else if ((sh.st != stBlock && sh.st != stTypedef && sh.st != stParsed)
2964                || sh.sc != scInfo)
2965         {
2966           /* File indirect entry is corrupt.  */
2967           *tpp = (struct type *)NULL;
2968           *pname = "<illegal>";
2969           complain (&bad_rfd_entry_complaint,
2970                     fh - ecoff_data (cur_bfd)->fdr, rn->index);
2971           return result;
2972         }
2973       else
2974         *pname = ecoff_data (cur_bfd)->ss + fh->issBase + sh.iss;
2975
2976       /* Have we parsed it ? */
2977       if (sh.value != 0 && sh.st == stParsed)
2978         {
2979           t = (struct type *) sh.value;
2980           *tpp = t;
2981         }
2982       else
2983         {
2984           /* Avoid duplicates */
2985           struct mips_pending *p = is_pending_symbol (fh, esh);
2986           if (p)
2987             *tpp = p->t;
2988           else
2989             {
2990               *tpp = init_type (type_code, 0, 0, (char *) NULL,
2991                                 (struct objfile *) NULL);
2992               add_pending (fh, esh, *tpp);
2993             }
2994         }
2995     }
2996
2997   /* We used one auxent normally, two if we got a "next one" rf. */
2998   return result;
2999 }
3000
3001
3002 /* Quick&dirty lookup procedure, to avoid the MI ones that require
3003    keeping the symtab sorted */
3004
3005 static struct symbol *
3006 mylookup_symbol (name, block, namespace, class)
3007      char *name;
3008      register struct block *block;
3009      enum namespace namespace;
3010      enum address_class class;
3011 {
3012   register int bot, top, inc;
3013   register struct symbol *sym;
3014
3015   bot = 0;
3016   top = BLOCK_NSYMS (block);
3017   inc = name[0];
3018   while (bot < top)
3019     {
3020       sym = BLOCK_SYM (block, bot);
3021       if (SYMBOL_NAME (sym)[0] == inc
3022           && SYMBOL_NAMESPACE (sym) == namespace
3023           && SYMBOL_CLASS (sym) == class
3024           && strcmp (SYMBOL_NAME (sym), name) == 0)
3025         return sym;
3026       bot++;
3027     }
3028   block = BLOCK_SUPERBLOCK (block);
3029   if (block)
3030     return mylookup_symbol (name, block, namespace, class);
3031   return 0;
3032 }
3033
3034
3035 /* Add a new symbol S to a block B.
3036    Infrequently, we will need to reallocate the block to make it bigger.
3037    We only detect this case when adding to top_stack->cur_block, since
3038    that's the only time we know how big the block is.  FIXME.  */
3039
3040 static void
3041 add_symbol (s, b)
3042      struct symbol *s;
3043      struct block *b;
3044 {
3045   int nsyms = BLOCK_NSYMS (b)++;
3046   struct block *origb;
3047   struct parse_stack *stackp;
3048
3049   if (b == top_stack->cur_block &&
3050       nsyms >= top_stack->maxsyms)
3051     {
3052       complain (&block_overflow_complaint, SYMBOL_NAME (s));
3053       /* In this case shrink_block is actually grow_block, since
3054                    BLOCK_NSYMS(b) is larger than its current size.  */
3055       origb = b;
3056       b = shrink_block (top_stack->cur_block, top_stack->cur_st);
3057
3058       /* Now run through the stack replacing pointers to the
3059          original block.  shrink_block has already done this
3060          for the blockvector and BLOCK_FUNCTION.  */
3061       for (stackp = top_stack; stackp; stackp = stackp->next)
3062         {
3063           if (stackp->cur_block == origb)
3064             {
3065               stackp->cur_block = b;
3066               stackp->maxsyms = BLOCK_NSYMS (b);
3067             }
3068         }
3069     }
3070   BLOCK_SYM (b, nsyms) = s;
3071 }
3072
3073 /* Add a new block B to a symtab S */
3074
3075 static void
3076 add_block (b, s)
3077      struct block *b;
3078      struct symtab *s;
3079 {
3080   struct blockvector *bv = BLOCKVECTOR (s);
3081
3082   bv = (struct blockvector *) xrealloc ((PTR) bv,
3083                                         (sizeof (struct blockvector)
3084                                          + BLOCKVECTOR_NBLOCKS (bv)
3085                                          * sizeof (bv->block)));
3086   if (bv != BLOCKVECTOR (s))
3087     BLOCKVECTOR (s) = bv;
3088
3089   BLOCKVECTOR_BLOCK (bv, BLOCKVECTOR_NBLOCKS (bv)++) = b;
3090 }
3091
3092 /* Add a new linenumber entry (LINENO,ADR) to a linevector LT.
3093    MIPS' linenumber encoding might need more than one byte
3094    to describe it, LAST is used to detect these continuation lines.
3095
3096    Combining lines with the same line number seems like a bad idea.
3097    E.g: There could be a line number entry with the same line number after the
3098    prologue and GDB should not ignore it (this is a better way to find
3099    a prologue than mips_skip_prologue).
3100    But due to the compressed line table format there are line number entries
3101    for the same line which are needed to bridge the gap to the next
3102    line number entry. These entries have a bogus address info with them
3103    and we are unable to tell them from intended duplicate line number
3104    entries.
3105    This is another reason why -ggdb debugging format is preferable.  */
3106
3107 static int
3108 add_line (lt, lineno, adr, last)
3109      struct linetable *lt;
3110      int lineno;
3111      CORE_ADDR adr;
3112      int last;
3113 {
3114   if (last == 0)
3115     last = -2;                  /* make sure we record first line */
3116
3117   if (last == lineno)           /* skip continuation lines */
3118     return lineno;
3119
3120   lt->item[lt->nitems].line = lineno;
3121   lt->item[lt->nitems++].pc = adr << 2;
3122   return lineno;
3123 }
3124 \f
3125 /* Sorting and reordering procedures */
3126
3127 /* Blocks with a smaller low bound should come first */
3128
3129 static int
3130 compare_blocks (arg1, arg2)
3131      const void *arg1, *arg2;
3132 {
3133   register int addr_diff;
3134   struct block **b1 = (struct block **) arg1;
3135   struct block **b2 = (struct block **) arg2;
3136
3137   addr_diff = (BLOCK_START ((*b1))) - (BLOCK_START ((*b2)));
3138   if (addr_diff == 0)
3139     return (BLOCK_END ((*b2))) - (BLOCK_END ((*b1)));
3140   return addr_diff;
3141 }
3142
3143 /* Sort the blocks of a symtab S.
3144    Reorder the blocks in the blockvector by code-address,
3145    as required by some MI search routines */
3146
3147 static void
3148 sort_blocks (s)
3149      struct symtab *s;
3150 {
3151   struct blockvector *bv = BLOCKVECTOR (s);
3152
3153   if (BLOCKVECTOR_NBLOCKS (bv) <= 2)
3154     {
3155       /* Cosmetic */
3156       if (BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) == 0)
3157         BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) = 0;
3158       if (BLOCK_END (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) == 0)
3159         BLOCK_START (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) = 0;
3160       return;
3161     }
3162   /*
3163    * This is very unfortunate: normally all functions are compiled in
3164    * the order they are found, but if the file is compiled -O3 things
3165    * are very different.  It would be nice to find a reliable test
3166    * to detect -O3 images in advance.
3167    */
3168   if (BLOCKVECTOR_NBLOCKS (bv) > 3)
3169     qsort (&BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK),
3170            BLOCKVECTOR_NBLOCKS (bv) - FIRST_LOCAL_BLOCK,
3171            sizeof (struct block *),
3172            compare_blocks);
3173
3174   {
3175     register CORE_ADDR high = 0;
3176     register int i, j = BLOCKVECTOR_NBLOCKS (bv);
3177
3178     for (i = FIRST_LOCAL_BLOCK; i < j; i++)
3179       if (high < BLOCK_END (BLOCKVECTOR_BLOCK (bv, i)))
3180         high = BLOCK_END (BLOCKVECTOR_BLOCK (bv, i));
3181     BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) = high;
3182   }
3183
3184   BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) =
3185     BLOCK_START (BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK));
3186
3187   BLOCK_START (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) =
3188     BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
3189   BLOCK_END (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) =
3190     BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
3191 }
3192 \f
3193
3194 /* Constructor/restructor/destructor procedures */
3195
3196 /* Allocate a new symtab for NAME.  Needs an estimate of how many symbols
3197    MAXSYMS and linenumbers MAXLINES we'll put in it */
3198
3199 static struct symtab *
3200 new_symtab (name, maxsyms, maxlines, objfile)
3201      char *name;
3202      int maxsyms;
3203      int maxlines;
3204      struct objfile *objfile;
3205 {
3206   struct symtab *s = allocate_symtab (name, objfile);
3207
3208   LINETABLE (s) = new_linetable (maxlines);
3209
3210   /* All symtabs must have at least two blocks */
3211   BLOCKVECTOR (s) = new_bvect (2);
3212   BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK) = new_block (maxsyms);
3213   BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK) = new_block (maxsyms);
3214   BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)) =
3215     BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
3216
3217   s->free_code = free_linetable;
3218
3219   return (s);
3220 }
3221
3222 /* Allocate a new partial_symtab NAME */
3223
3224 static struct partial_symtab *
3225 new_psymtab (name, objfile)
3226      char *name;
3227      struct objfile *objfile;
3228 {
3229   struct partial_symtab *psymtab;
3230
3231   psymtab = allocate_psymtab (name, objfile);
3232
3233   /* Keep a backpointer to the file's symbols */
3234
3235   psymtab->read_symtab_private = ((char *)
3236                                   obstack_alloc (&objfile->psymbol_obstack,
3237                                                  sizeof (struct symloc)));
3238   memset ((PTR) psymtab->read_symtab_private, 0, sizeof (struct symloc));
3239   CUR_BFD (psymtab) = cur_bfd;
3240
3241   /* The way to turn this into a symtab is to call... */
3242   psymtab->read_symtab = mipscoff_psymtab_to_symtab;
3243   return (psymtab);
3244 }
3245
3246
3247 /* Allocate a linetable array of the given SIZE.  Since the struct
3248    already includes one item, we subtract one when calculating the
3249    proper size to allocate.  */
3250
3251 static struct linetable *
3252 new_linetable (size)
3253      int size;
3254 {
3255   struct linetable *l;
3256
3257   size = (size - 1) * sizeof (l->item) + sizeof (struct linetable);
3258   l = (struct linetable *) xmalloc (size);
3259   l->nitems = 0;
3260   return l;
3261 }
3262
3263 /* Oops, too big. Shrink it.  This was important with the 2.4 linetables,
3264    I am not so sure about the 3.4 ones.
3265
3266    Since the struct linetable already includes one item, we subtract one when
3267    calculating the proper size to allocate.  */
3268
3269 static struct linetable *
3270 shrink_linetable (lt)
3271      struct linetable *lt;
3272 {
3273
3274   return (struct linetable *) xrealloc ((PTR) lt,
3275                                         (sizeof (struct linetable)
3276                                          + ((lt->nitems - 1)
3277                                             * sizeof (lt->item))));
3278 }
3279
3280 /* Allocate and zero a new blockvector of NBLOCKS blocks. */
3281
3282 static struct blockvector *
3283 new_bvect (nblocks)
3284      int nblocks;
3285 {
3286   struct blockvector *bv;
3287   int size;
3288
3289   size = sizeof (struct blockvector) + nblocks * sizeof (struct block *);
3290   bv = (struct blockvector *) xzalloc (size);
3291
3292   BLOCKVECTOR_NBLOCKS (bv) = nblocks;
3293
3294   return bv;
3295 }
3296
3297 /* Allocate and zero a new block of MAXSYMS symbols */
3298
3299 static struct block *
3300 new_block (maxsyms)
3301      int maxsyms;
3302 {
3303   int size = sizeof (struct block) + (maxsyms - 1) * sizeof (struct symbol *);
3304
3305   return (struct block *) xzalloc (size);
3306 }
3307
3308 /* Ooops, too big. Shrink block B in symtab S to its minimal size.
3309    Shrink_block can also be used by add_symbol to grow a block.  */
3310
3311 static struct block *
3312 shrink_block (b, s)
3313      struct block *b;
3314      struct symtab *s;
3315 {
3316   struct block *new;
3317   struct blockvector *bv = BLOCKVECTOR (s);
3318   int i;
3319
3320   /* Just reallocate it and fix references to the old one */
3321
3322   new = (struct block *) xrealloc ((PTR) b,
3323                                    (sizeof (struct block)
3324                                     + ((BLOCK_NSYMS (b) - 1)
3325                                        * sizeof (struct symbol *))));
3326
3327   /* Should chase pointers to old one.  Fortunately, that`s just
3328            the block`s function and inferior blocks */
3329   if (BLOCK_FUNCTION (new) && SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) == b)
3330     SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) = new;
3331   for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
3332     if (BLOCKVECTOR_BLOCK (bv, i) == b)
3333       BLOCKVECTOR_BLOCK (bv, i) = new;
3334     else if (BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) == b)
3335       BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) = new;
3336   return new;
3337 }
3338
3339 /* Create a new symbol with printname NAME */
3340
3341 static struct symbol *
3342 new_symbol (name)
3343      char *name;
3344 {
3345   struct symbol *s = ((struct symbol *)
3346                       obstack_alloc (&current_objfile->symbol_obstack,
3347                                      sizeof (struct symbol)));
3348
3349   memset ((PTR) s, 0, sizeof (*s));
3350   SYMBOL_NAME (s) = name;
3351   SYMBOL_LANGUAGE (s) = psymtab_language;
3352   SYMBOL_INIT_DEMANGLED_NAME (s, &current_objfile->symbol_obstack);
3353   return s;
3354 }
3355
3356 /* Create a new type with printname NAME */
3357
3358 static struct type *
3359 new_type (name)
3360      char *name;
3361 {
3362   struct type *t;
3363
3364   t = alloc_type (current_objfile);
3365   TYPE_NAME (t) = name;
3366   TYPE_CPLUS_SPECIFIC (t) = (struct cplus_struct_type *) &cplus_struct_default;
3367   return t;
3368 }
3369 \f
3370
3371 /* Things used for calling functions in the inferior.
3372    These functions are exported to our companion
3373    mips-tdep.c file and are here because they play
3374    with the symbol-table explicitly. */
3375
3376 /* Sigtramp: make sure we have all the necessary information
3377    about the signal trampoline code. Since the official code
3378    from MIPS does not do so, we make up that information ourselves.
3379    If they fix the library (unlikely) this code will neutralize itself. */
3380
3381 static void
3382 fixup_sigtramp ()
3383 {
3384   struct symbol *s;
3385   struct symtab *st;
3386   struct block *b, *b0;
3387
3388   sigtramp_address = -1;
3389
3390   /* We have to handle the following cases here:
3391      a) The Mips library has a sigtramp label within sigvec.
3392      b) Irix has a _sigtramp which we want to use, but it also has sigvec.  */
3393   s = lookup_symbol ("sigvec", 0, VAR_NAMESPACE, 0, NULL);
3394   if (s != 0)
3395     {
3396       b0 = SYMBOL_BLOCK_VALUE (s);
3397       s = lookup_symbol ("sigtramp", b0, VAR_NAMESPACE, 0, NULL);
3398     }
3399   if (s == 0)
3400     {
3401       /* No sigvec or no sigtramp inside sigvec, try _sigtramp.  */
3402       s = lookup_symbol ("_sigtramp", 0, VAR_NAMESPACE, 0, NULL);
3403     }
3404
3405   /* But maybe this program uses its own version of sigvec */
3406   if (s == 0)
3407     return;
3408
3409   /* Did we or MIPSco fix the library ? */
3410   if (SYMBOL_CLASS (s) == LOC_BLOCK)
3411     {
3412       sigtramp_address = BLOCK_START (SYMBOL_BLOCK_VALUE (s));
3413       sigtramp_end = BLOCK_END (SYMBOL_BLOCK_VALUE (s));
3414       return;
3415     }
3416
3417   sigtramp_address = SYMBOL_VALUE (s);
3418   sigtramp_end = sigtramp_address + 0x88;       /* black magic */
3419
3420   /* But what symtab does it live in ? */
3421   st = find_pc_symtab (SYMBOL_VALUE (s));
3422
3423   /*
3424    * Ok, there goes the fix: turn it into a procedure, with all the
3425    * needed info.  Note we make it a nested procedure of sigvec,
3426    * which is the way the (assembly) code is actually written.
3427    */
3428   SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
3429   SYMBOL_CLASS (s) = LOC_BLOCK;
3430   SYMBOL_TYPE (s) = init_type (TYPE_CODE_FUNC, 4, 0, (char *) NULL,
3431                                (struct objfile *) NULL);
3432   TYPE_TARGET_TYPE (SYMBOL_TYPE (s)) = builtin_type_void;
3433
3434   /* Need a block to allocate MIPS_EFI_SYMBOL_NAME in */
3435   b = new_block (1);
3436   SYMBOL_BLOCK_VALUE (s) = b;
3437   BLOCK_START (b) = sigtramp_address;
3438   BLOCK_END (b) = sigtramp_end;
3439   BLOCK_FUNCTION (b) = s;
3440   BLOCK_SUPERBLOCK (b) = BLOCK_SUPERBLOCK (b0);
3441   add_block (b, st);
3442   sort_blocks (st);
3443
3444   /* Make a MIPS_EFI_SYMBOL_NAME entry for it */
3445   {
3446     struct mips_extra_func_info *e =
3447       ((struct mips_extra_func_info *)
3448        xzalloc (sizeof (struct mips_extra_func_info)));
3449
3450     e->numargs = 0;             /* the kernel thinks otherwise */
3451     /* align_longword(sigcontext + SIGFRAME) */
3452     e->pdr.frameoffset = 0x150;
3453     e->pdr.framereg = SP_REGNUM;
3454     /* read_next_frame_reg provides the true pc at the time of signal */
3455     e->pdr.pcreg = PC_REGNUM;
3456     e->pdr.regmask = -2;
3457     e->pdr.regoffset = -(41 * sizeof (int));
3458     e->pdr.fregmask = -1;
3459     e->pdr.fregoffset = -(7 * sizeof (int));
3460     e->pdr.isym = (long) s;
3461     e->pdr.adr = sigtramp_address;
3462
3463     current_objfile = st->objfile;      /* Keep new_symbol happy */
3464     s = new_symbol (MIPS_EFI_SYMBOL_NAME);
3465     SYMBOL_VALUE (s) = (int) e;
3466     SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
3467     SYMBOL_CLASS (s) = LOC_CONST;
3468     SYMBOL_TYPE (s) = builtin_type_void;
3469     current_objfile = NULL;
3470   }
3471
3472   BLOCK_SYM (b, BLOCK_NSYMS (b)++) = s;
3473 }
3474
3475
3476 /* Fake up identical offsets for all sections.  */
3477
3478 struct section_offsets *
3479 mipscoff_symfile_offsets (objfile, addr)
3480      struct objfile *objfile;
3481      CORE_ADDR addr;
3482 {
3483   struct section_offsets *section_offsets;
3484   int i;
3485
3486   section_offsets = ((struct section_offsets *)
3487                      obstack_alloc (&objfile->psymbol_obstack,
3488                                     (sizeof (struct section_offsets)
3489                                      + (sizeof (section_offsets->offsets)
3490                                         * (SECT_OFF_MAX - 1)))));
3491
3492   for (i = 0; i < SECT_OFF_MAX; i++)
3493     ANOFFSET (section_offsets, i) = addr;
3494
3495   return section_offsets;
3496 }
3497 \f
3498 /* Initialization */
3499
3500 static struct sym_fns ecoff_sym_fns =
3501 {
3502   "ecoff",                      /* sym_name: name or name prefix of BFD target type */
3503   5,                            /* sym_namelen: number of significant sym_name chars */
3504   mipscoff_new_init,            /* sym_new_init: init anything gbl to entire symtab */
3505   mipscoff_symfile_init,        /* sym_init: read initial info, setup for sym_read() */
3506   mipscoff_symfile_read,        /* sym_read: read a symbol file into symtab */
3507   mipscoff_symfile_finish,      /* sym_finish: finished with file, cleanup */
3508   mipscoff_symfile_offsets,     /* sym_offsets: dummy FIXME til implem sym reloc */
3509   NULL                          /* next: pointer to next struct sym_fns */
3510 };
3511
3512
3513 void
3514 _initialize_mipsread ()
3515 {
3516   add_symtab_fns (&ecoff_sym_fns);
3517
3518   /* Missing basic types */
3519
3520   builtin_type_string =
3521     init_type (TYPE_CODE_STRING,
3522                TARGET_CHAR_BIT / TARGET_CHAR_BIT,
3523                0, "string",
3524                (struct objfile *) NULL);
3525   builtin_type_complex =
3526     init_type (TYPE_CODE_FLT,
3527                TARGET_COMPLEX_BIT / TARGET_CHAR_BIT,
3528                0, "complex",
3529                (struct objfile *) NULL);
3530   builtin_type_double_complex =
3531     init_type (TYPE_CODE_FLT,
3532                TARGET_DOUBLE_COMPLEX_BIT / TARGET_CHAR_BIT,
3533                0, "double complex",
3534                (struct objfile *) NULL);
3535   builtin_type_fixed_dec =
3536     init_type (TYPE_CODE_INT,
3537                TARGET_INT_BIT / TARGET_CHAR_BIT,
3538                0, "fixed decimal",
3539                (struct objfile *) NULL);
3540   builtin_type_float_dec =
3541     init_type (TYPE_CODE_FLT,
3542                TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
3543                0, "floating decimal",
3544                (struct objfile *) NULL);
3545 }