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