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