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