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