* mips-tdep.c, mipsread.c, tm-mips.h: Get rid of ".gdbinfo."
authorStu Grossman <grossman@cygnus>
Thu, 15 Oct 1992 08:36:30 +0000 (08:36 +0000)
committerStu Grossman <grossman@cygnus>
Thu, 15 Oct 1992 08:36:30 +0000 (08:36 +0000)
symbol.  #define MIPS_EFI_SYMBOL_NAME instead.  Use different
value so that demangler won't be invoked.  This greatly speeds up
stepping.
* mips-tdep.c (mips_pop_frame):  Rewrite handling of
linked_proc_info so that it properly deallocates the appropriate
item after it is done with it instead of before.
* Don't pass bogus frame pointer to create_new_frame().  Just
leave it as zero so that lower level code will figure out the
correct value.

gdb/ChangeLog
gdb/mips-tdep.c
gdb/mipsread.c
gdb/tm-mips.h

index 1cdcdd4..0869151 100644 (file)
@@ -1,3 +1,16 @@
+Thu Oct 15 01:27:32 1992  Stu Grossman  (grossman at cygnus.com)
+
+       * mips-tdep.c, mipsread.c, tm-mips.h:  Get rid of ".gdbinfo."
+       symbol.  #define MIPS_EFI_SYMBOL_NAME instead.  Use different
+       value so that demangler won't be invoked.  This greatly speeds up
+       stepping.
+       * mips-tdep.c (mips_pop_frame):  Rewrite handling of
+       linked_proc_info so that it properly deallocates the appropriate
+       item after it is done with it instead of before.
+       * Don't pass bogus frame pointer to create_new_frame().  Just
+       leave it as zero so that lower level code will figure out the
+       correct value.
+
 Wed Oct 14 18:56:28 1992  K. Richard Pixley  (rich@sendai.cygnus.com)
 
        Sony News native support.
index c4bf929..91413dd 100644 (file)
@@ -79,7 +79,7 @@ struct linked_proc_info
 {
   struct mips_extra_func_info info;
   struct linked_proc_info *next;
-} * linked_proc_desc_table = NULL;
+} *linked_proc_desc_table = NULL;
 
 \f
 #define READ_FRAME_REG(fi, regno) read_next_frame_reg((fi)->next, regno)
@@ -231,7 +231,7 @@ find_proc_desc(pc, next_frame)
   mips_extra_func_info_t proc_desc;
   struct block *b = block_for_pc(pc);
   struct symbol *sym =
-      b ? lookup_symbol(".gdbinfo.", b, LABEL_NAMESPACE, 0, NULL) : NULL;
+      b ? lookup_symbol(MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, 0, NULL) : NULL;
 
   if (sym)
     {
@@ -330,7 +330,7 @@ init_extra_frame_info(fci)
           fci->frame = read_register (SP_REGNUM);
         else
          fci->frame = READ_FRAME_REG(fci, PROC_FRAME_REG(proc_desc))
-                                        + PROC_FRAME_OFFSET(proc_desc);
+                      + PROC_FRAME_OFFSET(proc_desc);
       }
 
       if (proc_desc == &temp_proc_desc)
@@ -525,35 +525,57 @@ mips_push_dummy_frame()
 
 void
 mips_pop_frame()
-{ register int regnum;
+{
+  register int regnum;
   FRAME frame = get_current_frame ();
   CORE_ADDR new_sp = frame->frame;
+
   mips_extra_func_info_t proc_desc = frame->proc_desc;
+
+  write_register (PC_REGNUM, FRAME_SAVED_PC(frame));
+  if (proc_desc)
+    {
+      for (regnum = 32; --regnum >= 0; )
+       if (PROC_REG_MASK(proc_desc) & (1 << regnum))
+         write_register (regnum,
+                         read_memory_integer (frame->saved_regs->regs[regnum],
+                                              4));
+      for (regnum = 32; --regnum >= 0; )
+       if (PROC_FREG_MASK(proc_desc) & (1 << regnum))
+         write_register (regnum + FP0_REGNUM,
+                         read_memory_integer (frame->saved_regs->regs[regnum + FP0_REGNUM], 4));
+    }
+  write_register (SP_REGNUM, new_sp);
+  flush_cached_frames ();
+  /* We let mips_init_extra_frame_info figure out the frame pointer */
+  set_current_frame (create_new_frame (0, read_pc ()));
+
   if (PROC_DESC_IS_DUMMY(proc_desc))
     {
-      struct linked_proc_info **ptr = &linked_proc_desc_table;;
-      for (; &ptr[0]->info != proc_desc; ptr = &ptr[0]->next )
-         if (ptr[0] == NULL) abort();
-      *ptr = ptr[0]->next;
-      free (ptr[0]);
+      struct linked_proc_info *pi_ptr, *prev_ptr;
+
+      for (pi_ptr = linked_proc_desc_table, prev_ptr = NULL;
+          pi_ptr != NULL;
+          prev_ptr = pi_ptr, pi_ptr = pi_ptr->next)
+       {
+         if (&pi_ptr->info == proc_desc)
+           break;
+       }
+
+      if (pi_ptr == NULL)
+       error ("Can't locate dummy extra frame info\n");
+
+      if (prev_ptr != NULL)
+       prev_ptr->next = pi_ptr->next;
+      else
+       linked_proc_desc_table = pi_ptr->next;
+
+      free (pi_ptr);
+
       write_register (HI_REGNUM, read_memory_integer(new_sp - 8, 4));
       write_register (LO_REGNUM, read_memory_integer(new_sp - 12, 4));
       write_register (FCRCS_REGNUM, read_memory_integer(new_sp - 16, 4));
     }
-  write_register (PC_REGNUM, FRAME_SAVED_PC(frame));
-  if (frame->proc_desc) {
-    for (regnum = 32; --regnum >= 0; )
-      if (PROC_REG_MASK(proc_desc) & (1 << regnum))
-       write_register (regnum,
-                 read_memory_integer (frame->saved_regs->regs[regnum], 4));
-    for (regnum = 32; --regnum >= 0; )
-      if (PROC_FREG_MASK(proc_desc) & (1 << regnum))
-       write_register (regnum + FP0_REGNUM,
-                 read_memory_integer (frame->saved_regs->regs[regnum + FP0_REGNUM], 4));
-  }
-  write_register (SP_REGNUM, new_sp);
-  flush_cached_frames ();
-  set_current_frame (create_new_frame (new_sp, read_pc ()));
 }
 
 static void
@@ -709,7 +731,7 @@ mips_skip_prologue(pc)
     b = block_for_pc(pc);
     if (!b) return pc;
 
-    f = lookup_symbol(".gdbinfo.", b, LABEL_NAMESPACE, 0, NULL);
+    f = lookup_symbol(MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, 0, NULL);
     if (!f) return pc;
     /* Ideally, I would like to use the adjusted info
        from mips_frame_info(), but for all practical
index 90dd8af..dd0d9b9 100644 (file)
@@ -57,6 +57,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "objfiles.h"
 #include "obstack.h"
 #include "buildsym.h"
+#include "stabsread.h"
 
 #ifdef USG
 #include <sys/types.h>
@@ -68,6 +69,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <sys/file.h>
 #include <sys/stat.h>
 
+#include "gdb-stabs.h"
+
 #include "coff/mips.h"         /* COFF-like aspects of ecoff files */
 #include "coff/ecoff-ext.h"    /* External forms of ecoff sym structures */
 
@@ -230,7 +233,7 @@ static void
 fixup_symtab PARAMS ((HDRR *, char *, int, bfd *));
 
 static void
-read_mips_symtab PARAMS ((struct objfile *));
+read_mips_symtab PARAMS ((struct objfile *, struct section_offsets *));
 
 static void
 read_the_mips_symtab PARAMS ((bfd *, CORE_ADDR *));
@@ -239,7 +242,8 @@ static int
 upgrade_type PARAMS ((struct type **, int, union aux_ext *, int));
 
 static void
-parse_partial_symbols PARAMS ((int, struct objfile *));
+parse_partial_symbols PARAMS ((int, struct objfile *,
+                              struct section_offsets *));
 
 static int
 cross_ref PARAMS ((union aux_ext *, struct type **, enum type_code, char **,
@@ -336,9 +340,9 @@ mipscoff_symfile_init (objfile)
 }
 
 static void
-mipscoff_symfile_read (objfile, addr, mainline)
+mipscoff_symfile_read (objfile, section_offsets, mainline)
      struct objfile *objfile;
-     CORE_ADDR addr;
+     struct section_offsets *section_offsets;
      int mainline;
 {
   init_minimal_symbol_collection ();
@@ -347,7 +351,7 @@ mipscoff_symfile_read (objfile, addr, mainline)
   /* Now that the executable file is positioned at symbol table,
      process it and define symbols accordingly.  */
 
-  read_mips_symtab(objfile);
+  read_mips_symtab(objfile, section_offsets);
 
   /* Install any minimal symbols that have been collected as the current
      minimal symbols for this objfile. */
@@ -550,18 +554,18 @@ fixup_symtab (hdr, data, f_ptr, abfd)
        hdr->cbOptOffset = 0;
 
 #define FIX(off) \
-        if (hdr->off) hdr->off = (unsigned int)data + (hdr->off - f_ptr);
-
-        FIX(cbLineOffset);
-        FIX(cbPdOffset);
-        FIX(cbSymOffset);
-        FIX(cbOptOffset);
-        FIX(cbAuxOffset);
-        FIX(cbSsOffset);
-        FIX(cbSsExtOffset);
-        FIX(cbFdOffset);
-        FIX(cbRfdOffset);
-        FIX(cbExtOffset);
+       if (hdr->off) hdr->off = (unsigned int)data + (hdr->off - f_ptr);
+
+       FIX(cbLineOffset);
+       FIX(cbPdOffset);
+       FIX(cbSymOffset);
+       FIX(cbOptOffset);
+       FIX(cbAuxOffset);
+       FIX(cbSsOffset);
+       FIX(cbSsExtOffset);
+       FIX(cbFdOffset);
+       FIX(cbRfdOffset);
+       FIX(cbExtOffset);
 #undef FIX
 
        /* Fix all the RFD's.  */
@@ -654,7 +658,7 @@ fixup_symtab (hdr, data, f_ptr, abfd)
                        /* Relocate address */
                        if (!only_ext)
                                pr->adr += code_offset;
-               }               
+               }
        }
 
        /* External symbols: swap in, and fix string */
@@ -696,19 +700,19 @@ fdr_name(name)
 }
 
 
-/* Read in and parse the symtab of the file DESC. INCREMENTAL says
-   whether we are adding to the general symtab or not.
-   FIXME:  INCREMENTAL is currently always zero, though it should not be. */
+/* Read in and parse the symtab of the file OBJFILE.  Symbols from
+   different sections are relocated via the SECTION_OFFSETS.  */
 
 static void
-read_mips_symtab (objfile)
+read_mips_symtab (objfile, section_offsets)
        struct objfile *objfile;
+       struct section_offsets *section_offsets;
 {
        CORE_ADDR end_of_text_seg;
 
        read_the_mips_symtab(objfile->obfd, &end_of_text_seg);
 
-       parse_partial_symbols(end_of_text_seg, objfile);
+       parse_partial_symbols(end_of_text_seg, objfile, section_offsets);
 
 #if 0
        /*
@@ -1129,7 +1133,7 @@ data:             /* Common code for symbols describing data */
                    }
                    else complain (&block_member_complaint, (char *)tsym->st);
                  }
-               
+
                /* In an stBlock, there is no way to distinguish structs,
                   unions, and enums at this point.  This is a bug in the
                   original design (that has been fixed with the
@@ -1169,7 +1173,7 @@ data:             /* Common code for symbols describing data */
                      type_code = TYPE_CODE_UNION;
                    else
                      type_code = TYPE_CODE_STRUCT;
-               
+
                /* If this type was expected, use its partial definition */
                if (pend)
                    t = is_pending_symbol(cur_fdr, sh)->t;
@@ -1181,9 +1185,8 @@ data:             /* Common code for symbols describing data */
                TYPE_LENGTH(t) = sh->value;
                TYPE_NFIELDS(t) = nfields;
                TYPE_FIELDS(t) = f = (struct field*)
-                 obstack_alloc (&current_objfile -> type_obstack,
-                                nfields * sizeof (struct field));
-               
+                 TYPE_ALLOC (t, nfields * sizeof (struct field));
+
                if (type_code == TYPE_CODE_ENUM) {
                    /* This is a non-empty enum. */
                    for (tsym = sh + 1; tsym->st == stMember; tsym++) {
@@ -1192,7 +1195,7 @@ data:             /* Common code for symbols describing data */
                        f->type = t;
                        f->name = (char*)tsym->iss;
                        f->bitsize = 0;
-                       
+
                        enum_sym = (struct symbol *)
                            obstack_alloc (&current_objfile->symbol_obstack,
                                           sizeof (struct symbol));
@@ -1203,7 +1206,7 @@ data:             /* Common code for symbols describing data */
                        SYMBOL_NAMESPACE (enum_sym) = VAR_NAMESPACE;
                        SYMBOL_VALUE (enum_sym) = tsym->value;
                        add_symbol(enum_sym, top_stack->cur_block);
-                       
+
                        /* Skip the stMembers that we've handled. */
                        count++;
                        f++;
@@ -1250,7 +1253,7 @@ data:             /* Common code for symbols describing data */
 
                    /* Make up special symbol to contain procedure specific
                       info */
-                   s = new_symbol(".gdbinfo.");
+                   s = new_symbol(MIPS_EFI_SYMBOL_NAME);
                    SYMBOL_NAMESPACE(s) = LABEL_NAMESPACE;
                    SYMBOL_CLASS(s) = LOC_CONST;
                    SYMBOL_TYPE(s) = builtin_type_void;
@@ -1281,6 +1284,10 @@ data:            /* Common code for symbols describing data */
                           address of the end of this block. */
                        BLOCK_END(top_stack->cur_block) = sh->value + top_stack->procadr;
                        shrink_block(top_stack->cur_block, top_stack->cur_st);
+               } else if (sh->sc == scText && top_stack->blocktype == stFile) {
+                       /* End of file.  Pop parse stack and ignore.  Higher
+                          level code deals with this.  */
+                       ;
                } else complain (&stEnd_complaint, (char *)sh->sc);
 
                pop_parse_stack();      /* restore previous lexical context */
@@ -1299,7 +1306,7 @@ data:             /* Common code for symbols describing data */
                SYMBOL_NAMESPACE(s) = VAR_NAMESPACE;
                SYMBOL_CLASS(s) = LOC_TYPEDEF;
                SYMBOL_BLOCK_VALUE(s) = top_stack->cur_block;
-               add_symbol(s, top_stack->cur_block);                    
+               add_symbol(s, top_stack->cur_block);
                SYMBOL_TYPE(s) = parse_type(ax + sh->index, 0, bigend);
                sh->value = (long) SYMBOL_TYPE(s);
                break;
@@ -1386,7 +1393,7 @@ parse_type(ax, bs, bigend)
                tp = *map_bt[t->bt];
                fmt = "%s";
        } else {
-               tp = NULL;
+               tp = NULL;
                /* Cannot use builtin types -- build our own */
                switch (t->bt) {
                    case btAdr:
@@ -1473,9 +1480,8 @@ parse_type(ax, bs, bigend)
        /* Deal with range types */
        if (t->bt == btRange) {
                TYPE_NFIELDS (tp) = 2;
-               TYPE_FIELDS (tp) =
-                 (struct field *) obstack_alloc (&current_objfile -> type_obstack,
-                                                 2 * sizeof (struct field));
+               TYPE_FIELDS (tp) = (struct field *)
+                 TYPE_ALLOC (tp, 2 * sizeof (struct field));
                TYPE_FIELD_NAME (tp, 0) = obsavestring ("Low", strlen ("Low"),
                                                        &current_objfile -> type_obstack);
                TYPE_FIELD_BITPOS (tp, 0) = AUX_GET_DNLOW (bigend, ax);
@@ -1619,7 +1625,7 @@ upgrade_type(tpp, tq, ax, bigend)
 
 /* Parse a procedure descriptor record PR.  Note that the procedure
    is parsed _after_ the local symbols, now we just insert the extra
-   information we need into a special ".gdbinfo." symbol that has already
+   information we need into a MIPS_EFI_SYMBOL_NAME symbol that has already
    been placed in the procedure's main block.  Note also that images that
    have been partially stripped (ld -x) have been deprived
    of local symbols, and we have to cope with them here.
@@ -1655,7 +1661,7 @@ parse_procedure (pr, bound, have_stabs)
            complain (&pdr_for_nonsymbol_complaint, sh_name);
 #if 1
        return;
-#else    
+#else
 /* FIXME -- delete.  We can't do symbol allocation now; it's all done.  */
            s = new_symbol(sh_name);
            SYMBOL_NAMESPACE(s) = VAR_NAMESPACE;
@@ -1674,7 +1680,7 @@ parse_procedure (pr, bound, have_stabs)
 #endif
     }
 
-    i = mylookup_symbol(".gdbinfo.", b, LABEL_NAMESPACE, LOC_CONST);
+    i = mylookup_symbol(MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, LOC_CONST);
 
     if (i)
       {
@@ -1824,9 +1830,10 @@ parse_lines(fh, lt)
    the symtab we are reading.  */
 
 static void
-parse_partial_symbols (end_of_text_seg, objfile)
+parse_partial_symbols (end_of_text_seg, objfile, section_offsets)
      int end_of_text_seg;
      struct objfile *objfile;
+     struct section_offsets *section_offsets;
 {
     int                         f_idx, s_idx;
     HDRR               *hdr = cur_hdr;
@@ -1864,7 +1871,7 @@ parse_partial_symbols (end_of_text_seg, objfile)
        (struct partial_symtab **) alloca (dependencies_allocated *
                                           sizeof (struct partial_symtab *));
 
-    last_source_file = 0;
+    last_source_file = NULL;
 
     /*
      * Big plan:
@@ -1936,13 +1943,14 @@ parse_partial_symbols (end_of_text_seg, objfile)
     for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++) {
        struct partial_symtab *save_pst;
        EXTR **ext_ptr;
+
        cur_fdr = fh = f_idx + (FDR *)(cur_hdr->cbFdOffset);
 
        if (fh->csym == 0) {
            fdr_to_pst[f_idx].pst = NULL;
            continue;
        }
-       pst = start_psymtab_common (objfile, 0, (char*)fh->rss,
+       pst = start_psymtab_common (objfile, section_offsets, (char*)fh->rss,
                                    fh->cpd ? fh->adr : 0,
                                    objfile->global_psymbols.next,
                                    objfile->static_psymbols.next);
@@ -1954,23 +1962,15 @@ parse_partial_symbols (end_of_text_seg, objfile)
        FDR_IDX(pst) = f_idx;
        fdr_to_pst[f_idx].pst = pst;
        fh->ioptBase = (int)pst;
-       
+
        CUR_HDR(pst) = cur_hdr;
-       
+
        /* The way to turn this into a symtab is to call... */
        pst->read_symtab = mipscoff_psymtab_to_symtab;
-       
+
        pst->texthigh = pst->textlow;
-       
-#if 0      /* This is done in start_psymtab_common */
-       pst->globals_offset = global_psymbols.next - global_psymbols.list;
-       pst->statics_offset = static_psymbols.next - static_psymbols.list;
-       
-       pst->n_global_syms = 0;
-       pst->n_static_syms = 0;
-#endif
-       
-       /* The second symbol must be @stab.
+
+       /* For stabs-in-ecoff files, the second symbol must be @stab.
           This symbol is emitted by mips-tfile to signal
           that the current object file uses encapsulated stabs
           instead of mips ecoff for local symbols.
@@ -2001,14 +2001,12 @@ parse_partial_symbols (end_of_text_seg, objfile)
 #define SET_NAMESTRING() namestring = (char*)sh->iss
 #define CUR_SYMBOL_TYPE type_code
 #define CUR_SYMBOL_VALUE sh->value
-#define START_PSYMTAB(ofile,addr,fname,low,symoff,global_syms,static_syms)\
+#define START_PSYMTAB(ofile,secoff,fname,low,symoff,global_syms,static_syms)\
   pst = save_pst
 #define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps) (void)0
-#define addr 0         /* FIXME, should be offset of addresses */
 #define HANDLE_RBRAC(val) \
   if ((val) > save_pst->texthigh) save_pst->texthigh = (val);
 #include "partial-stab.h"
-#undef addr
            }
        }
        else {
@@ -2016,7 +2014,7 @@ parse_partial_symbols (end_of_text_seg, objfile)
                char *name;
                enum address_class class;
                sh = cur_sdx + (SYMR *) fh->isymBase;
-               
+
                if (MIPS_IS_STAB(sh)) {
                    cur_sdx++;
                    continue;
@@ -2028,9 +2026,9 @@ parse_partial_symbols (end_of_text_seg, objfile)
                    cur_sdx++;
                    continue;
                }
-               
+
                name = (char *)(sh->iss);
-               
+
                switch (sh->st) {
                    long high;
                    long procaddr;
@@ -2100,6 +2098,12 @@ parse_partial_symbols (end_of_text_seg, objfile)
                  case stEnd:                   /* Ends of files */
                    goto skip;
 
+                 case stLocal:                 /* Local variables */
+                   /* Normally these are skipped because we skip over
+                      all blocks we see.  However, these can occur
+                      as visible symbols in a .h file that contains code. */
+                   goto skip;
+
                  default:
                    /* Both complaints are valid:  one gives symbol name,
                       the other the offending symbol type.  */
@@ -2352,7 +2356,7 @@ psymtab_to_symtab_1(pst, filename)
         */
 
        PDR *pr;
-       
+
        /* Parse local symbols first */
 
        if (fh->csym <= 2)      /* FIXME, this blows psymtab->symtab ptr */
@@ -2366,8 +2370,8 @@ psymtab_to_symtab_1(pst, filename)
            CORE_ADDR valu = sh->value;
            if (MIPS_IS_STAB(sh)) {
                int type_code = MIPS_UNMARK_STAB(sh->index);
-               process_one_symbol (type_code, 0, valu, name, /*FIXME*/ 0,
-                                   pst->objfile);
+               process_one_symbol (type_code, 0, valu, name,
+                                   pst->section_offsets, pst->objfile);
                if (type_code == N_FUN) {
                    /* Make up special symbol to contain
                       procedure specific info */
@@ -2375,7 +2379,7 @@ psymtab_to_symtab_1(pst, filename)
                      (struct mips_extra_func_info *)
                        obstack_alloc(&current_objfile->symbol_obstack,
                                      sizeof(struct mips_extra_func_info));
-                   struct symbol *s = new_symbol(".gdbinfo.");
+                   struct symbol *s = new_symbol(MIPS_EFI_SYMBOL_NAME);
                    SYMBOL_NAMESPACE(s) = LABEL_NAMESPACE;
                    SYMBOL_CLASS(s) = LOC_CONST;
                    SYMBOL_TYPE(s) = builtin_type_void;
@@ -2390,6 +2394,7 @@ psymtab_to_symtab_1(pst, filename)
            else complain (&stab_unknown_complaint, (char *)sh->iss);
        }
        st = end_symtab (pst->texthigh, 0, 0, pst->objfile);
+       end_stabs ();
 
        /* Sort the symbol table now, we are done adding symbols to it.
           We must do this before parse_procedure calls lookup_symbol.  */
@@ -2411,6 +2416,8 @@ psymtab_to_symtab_1(pst, filename)
         * This symbol table contains ordinary ecoff entries.
         */
 
+       /* FIXME:  doesn't use pst->section_offsets.  */
+
        int f_max;
        int maxlines;
        EXTR **ext_ptr;
@@ -2436,7 +2443,7 @@ psymtab_to_symtab_1(pst, filename)
        }
 
        /* Get a new lexical context */
-       
+
        push_parse_stack();
        top_stack->cur_st = st;
        top_stack->cur_block = BLOCKVECTOR_BLOCK(BLOCKVECTOR(st),
@@ -2457,7 +2464,7 @@ psymtab_to_symtab_1(pst, filename)
 
            for (cur_sdx = 0; cur_sdx < fh->csym; ) {
                sh = (SYMR *) (fh->isymBase) + cur_sdx;
-               cur_sdx += parse_symbol(sh, (union aux_ent *)fh->iauxBase,
+               cur_sdx += parse_symbol(sh, (union aux_ext *)fh->iauxBase,
                                        fh->fBigendian);
            }
 
@@ -3001,7 +3008,7 @@ fixup_sigtramp()
                                   (struct objfile *) NULL);
        TYPE_TARGET_TYPE(SYMBOL_TYPE(s)) = builtin_type_void;
 
-       /* Need a block to allocate .gdbinfo. in */
+       /* Need a block to allocate MIPS_EFI_SYMBOL_NAME in */
        b = new_block(1);
        SYMBOL_BLOCK_VALUE(s) = b;
        BLOCK_START(b) = sigtramp_address;
@@ -3011,7 +3018,7 @@ fixup_sigtramp()
        add_block(b, st);
        sort_blocks(st);
 
-       /* Make a .gdbinfo. for it */
+       /* Make a MIPS_EFI_SYMBOL_NAME entry for it */
        {
                struct mips_extra_func_info *e =
                        (struct mips_extra_func_info *)
@@ -3029,7 +3036,7 @@ fixup_sigtramp()
                e->pdr.isym = (long)s;
 
                current_objfile = st->objfile; /* Keep new_symbol happy */
-               s = new_symbol(".gdbinfo.");
+               s = new_symbol(MIPS_EFI_SYMBOL_NAME);
                SYMBOL_VALUE(s) = (int) e;
                SYMBOL_NAMESPACE(s) = LABEL_NAMESPACE;
                SYMBOL_CLASS(s) = LOC_CONST;
@@ -3039,6 +3046,28 @@ fixup_sigtramp()
 
        BLOCK_SYM(b,BLOCK_NSYMS(b)++) = s;
 }
+
+
+/* Fake up identical offsets for all sections.  */
+
+struct section_offsets *
+mipscoff_symfile_offsets (objfile, addr)
+     struct objfile *objfile;
+     CORE_ADDR addr;
+{
+  struct section_offsets *section_offsets;
+  int i;
+
+  section_offsets = (struct section_offsets *)
+    obstack_alloc (&objfile -> psymbol_obstack,
+                  sizeof (struct section_offsets) +
+                         sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
+
+  for (i = 0; i < SECT_OFF_MAX; i++)
+    ANOFFSET (section_offsets, i) = addr;
+
+  return section_offsets;
+}
 \f
 /* Initialization */
 
@@ -3050,6 +3079,7 @@ static struct sym_fns ecoff_sym_fns =
   mipscoff_symfile_init,/* sym_init: read initial info, setup for sym_read() */
   mipscoff_symfile_read,/* sym_read: read a symbol file into symtab */
   mipscoff_symfile_finish,/* sym_finish: finished with file, cleanup */
+  mipscoff_symfile_offsets,/* sym_offsets: dummy FIXME til implem sym reloc */
   NULL                 /* next: pointer to next struct sym_fns */
 };
 
index 0604ddb..6807fca 100644 (file)
@@ -327,6 +327,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
   (prev)->pc = ((fromleaf) ? SAVED_PC_AFTER_CALL ((prev)->next) : \
              (prev)->next ? FRAME_SAVED_PC ((prev)->next) : read_pc ());
 
+/* Special symbol found in blocks associated with routines.  We can hang
+   mips_extra_func_info_t's off of this.  */
+
+#define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__"
+
 /* Specific information about a procedure.
    This overlays the MIPS's PDR records, 
    mipsread.c (ab)uses this to save memory */