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