* libaout.h (enum machine_type): Change M_SPARCLET from 142 to 131.
[deliverable/binutils-gdb.git] / gdb / mdebugread.c
index 4a1ca9a53651ac127aeb1bb062c823bc79e9f3dd..17e02c6185f68b2b62f2af6ec91825501b378240 100644 (file)
@@ -1,5 +1,5 @@
 /* Read a symbol table in ECOFF format (Third-Eye).
-   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995
+   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
    Free Software Foundation, Inc.
    Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
    CMU.  Major work by Per Bothner, John Gilmore and Ian Lance Taylor
@@ -49,17 +49,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "buildsym.h"
 #include "stabsread.h"
 #include "complaints.h"
-
-#if !defined (SEEK_SET)
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#endif
+#include "demangle.h"
 
 /* These are needed if the tm.h file does not contain the necessary
    mips specific definitions.  */
 
 #ifndef MIPS_EFI_SYMBOL_NAME
 #define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__"
+extern void ecoff_relocate_efi PARAMS ((struct symbol *, CORE_ADDR));
 #include "coff/sym.h"
 #include "coff/symconst.h"
 typedef struct mips_extra_func_info {
@@ -75,8 +72,6 @@ typedef struct mips_extra_func_info {
 #include <sys/types.h>
 #endif
 
-#include <sys/param.h>
-#include <sys/file.h>
 #include "gdb_stat.h"
 #include "gdb_string.h"
 
@@ -259,8 +254,8 @@ static int cur_sdx;
 /* Note how much "debuggable" this image is.  We would like
    to see at least one FDR with full symbols */
 
-static max_gdbinfo;
-static max_glevel;
+static int max_gdbinfo;
+static int max_glevel;
 
 /* When examining .o files, report on undefined symbols */
 
@@ -309,6 +304,24 @@ static int found_ecoff_debugging_info;
 
 /* Forward declarations */
 
+static void
+add_pending PARAMS ((FDR *, char *, struct type *));
+
+static struct mdebug_pending *
+is_pending_symbol PARAMS ((FDR *, char *));
+
+static void
+pop_parse_stack PARAMS ((void));
+
+static void
+push_parse_stack PARAMS ((void));
+
+static char *
+fdr_name PARAMS ((FDR *));
+
+static void
+mdebug_psymtab_to_symtab PARAMS ((struct partial_symtab *));
+
 static int
 upgrade_type PARAMS ((int, struct type **, int, union aux_ext *, int, char *));
 
@@ -351,7 +364,7 @@ static struct type *
 parse_type PARAMS ((int, union aux_ext *, unsigned int, int *, int, char *));
 
 static struct symbol *
-mylookup_symbol PARAMS ((char *, struct block *, enum namespace,
+mylookup_symbol PARAMS ((char *, struct block *, namespace_enum,
                         enum address_class));
 
 static struct block *
@@ -385,10 +398,10 @@ static struct linetable *
 shrink_linetable PARAMS ((struct linetable *));
 
 static void
-handle_psymbol_enumerators PARAMS ((struct objfile *, FDR *, int));
+handle_psymbol_enumerators PARAMS ((struct objfile *, FDR *, int, CORE_ADDR));
 
 static char *
-mdebug_next_symbol_text PARAMS ((void));
+mdebug_next_symbol_text PARAMS ((struct objfile *));
 \f
 /* Address bounds for the signal trampoline in inferior, if any */
 
@@ -708,6 +721,7 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
   switch (sh->sc)
     {
     case scText:
+    case scRConst:
       /* Do not relocate relative values.
         The value of a stEnd symbol is the displacement from the
         corresponding start symbol value.
@@ -777,7 +791,8 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
       add_symbol (s, b);
 
       /* Type could be missing if file is compiled without debugging info.  */
-      if (sh->sc == scUndefined || sh->sc == scNil || sh->index == indexNil)
+      if (sh->sc == scUndefined || sh->sc == scSUndefined
+         || sh->sc == scNil || sh->index == indexNil)
        SYMBOL_TYPE (s) = nodebug_var_symbol_type;
       else
        SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name);
@@ -790,7 +805,7 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
       top_stack->numargs++;
 
       /* Special GNU C++ name.  */
-      if (name[0] == CPLUS_MARKER && name[1] == 't' && name[2] == 0)
+      if (is_cplus_marker (name[0]) && name[1] == 't' && name[2] == 0)
        name = "this";          /* FIXME, not alloc'd in obstack */
       s = new_symbol (name);
 
@@ -836,10 +851,26 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
       SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
       SYMBOL_CLASS (s) = LOC_BLOCK;
       /* Type of the return value */
-      if (sh->sc == scUndefined || sh->sc == scNil)
+      if (sh->sc == scUndefined || sh->sc == scSUndefined || sh->sc == scNil)
        t = mdebug_type_int;
       else
-       t = parse_type (cur_fd, ax, sh->index + 1, 0, bigend, name);
+       {
+         t = parse_type (cur_fd, ax, sh->index + 1, 0, bigend, name);
+         if (STREQ(name, "malloc") && t->code == TYPE_CODE_VOID)
+           {
+             /* I don't know why, but, at least under Linux/Alpha,
+                when linking against a malloc without debugging
+                symbols, its read as a function returning void---this
+                is bad because it means we cannot call functions with
+                string arguments interactively; i.e., "call
+                printf("howdy\n")" would fail with the error message
+                "program has no memory available".  To avoid this, we
+                patch up the type and make it void*
+                instead. (davidm@azstarnet.com)
+                */
+             t = make_pointer_type (t, NULL);
+           }
+       }
       b = top_stack->cur_block;
       if (sh->st == stProc)
        {
@@ -869,7 +900,7 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
       add_block (b, top_stack->cur_st);
 
       /* Not if we only have partial info */
-      if (sh->sc == scUndefined || sh->sc == scNil)
+      if (sh->sc == scUndefined || sh->sc == scSUndefined || sh->sc == scNil)
        break;
 
       push_parse_stack ();
@@ -936,8 +967,11 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
                if (nfields == 0 && type_code == TYPE_CODE_UNDEF)
                  /* If the type of the member is Nil (or Void),
                     without qualifiers, assume the tag is an
-                    enumeration. */
-                 if (tsym.index == indexNil)
+                    enumeration.
+                    Alpha cc -migrate enums are recognized by a zero
+                    index and a zero symbol value.  */
+                 if (tsym.index == indexNil
+                     || (tsym.index == 0 && sh->value == 0))
                    type_code = TYPE_CODE_ENUM;
                  else
                    {
@@ -1099,7 +1133,9 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
                            obstack_alloc (&current_objfile->symbol_obstack,
                                           sizeof (struct symbol)));
                memset ((PTR) enum_sym, 0, sizeof (struct symbol));
-               SYMBOL_NAME (enum_sym) = f->name;
+               SYMBOL_NAME (enum_sym) =
+                 obsavestring (f->name, strlen (f->name),
+                               &current_objfile->symbol_obstack);
                SYMBOL_CLASS (enum_sym) = LOC_CONST;
                SYMBOL_TYPE (enum_sym) = t;
                SYMBOL_NAMESPACE (enum_sym) = VAR_NAMESPACE;
@@ -1782,7 +1818,8 @@ upgrade_type (fd, tpp, tq, ax, bigend, sym_name)
        }
       fh = get_rfd (fd, rf);
 
-      indx = parse_type (fd, debug_info->external_aux + fh->iauxBase,
+      indx = parse_type (fh - debug_info->fdr,
+                        debug_info->external_aux + fh->iauxBase,
                         id, (int *) NULL, bigend, sym_name);
 
       /* The bounds type should be an integer type, but might be anything
@@ -1856,14 +1893,14 @@ upgrade_type (fd, tpp, tq, ax, bigend, sym_name)
    to look for the function which contains the MIPS_EFI_SYMBOL_NAME symbol
    in question, or NULL to use top_stack->cur_block.  */
 
-static void parse_procedure PARAMS ((PDR *, struct symtab *, unsigned long,
+static void parse_procedure PARAMS ((PDR *, struct symtab *, CORE_ADDR,
                                     struct partial_symtab *));
 
 static void
-parse_procedure (pr, search_symtab, first_off, pst)
+parse_procedure (pr, search_symtab, lowest_pdr_addr, pst)
      PDR *pr;
      struct symtab *search_symtab;
-     unsigned long first_off;
+     CORE_ADDR lowest_pdr_addr;
      struct partial_symtab *pst;
 {
   struct symbol *s, *i;
@@ -1969,7 +2006,7 @@ parse_procedure (pr, search_symtab, first_off, pst)
       e = (struct mips_extra_func_info *) SYMBOL_VALUE (i);
       e->pdr = *pr;
       e->pdr.isym = (long) s;
-      e->pdr.adr += pst->textlow - first_off;
+      e->pdr.adr += pst->textlow - lowest_pdr_addr;
 
       /* Correct incorrect setjmp procedure descriptor from the library
         to make backtrace through setjmp work.  */
@@ -2046,7 +2083,8 @@ parse_external (es, bigend, section_offsets)
     }
 
   /* Reading .o files */
-  if (es->asym.sc == scUndefined || es->asym.sc == scNil)
+  if (es->asym.sc == scUndefined || es->asym.sc == scSUndefined
+      || es->asym.sc == scNil)
     {
       char *what;
       switch (es->asym.st)
@@ -2118,20 +2156,20 @@ parse_external (es, bigend, section_offsets)
    with that and do not need to reorder our linetables */
 
 static void parse_lines PARAMS ((FDR *, PDR *, struct linetable *, int,
-                                struct partial_symtab *));
+                                struct partial_symtab *, CORE_ADDR));
 
 static void
-parse_lines (fh, pr, lt, maxlines, pst)
+parse_lines (fh, pr, lt, maxlines, pst, lowest_pdr_addr)
      FDR *fh;
      PDR *pr;
      struct linetable *lt;
      int maxlines;
      struct partial_symtab *pst;
+     CORE_ADDR lowest_pdr_addr;
 {
   unsigned char *base;
   int j, k;
   int delta, count, lineno = 0;
-  unsigned long first_off = pr->adr;
 
   if (fh->cbLine == 0)
     return;
@@ -2140,8 +2178,8 @@ parse_lines (fh, pr, lt, maxlines, pst)
   k = 0;
   for (j = 0; j < fh->cpd; j++, pr++)
     {
-      long l;
-      unsigned long adr;
+      CORE_ADDR l;
+      CORE_ADDR adr;
       unsigned char *halt;
 
       /* No code for this one */
@@ -2158,7 +2196,7 @@ parse_lines (fh, pr, lt, maxlines, pst)
        halt = base + fh->cbLine;
       base += pr->cbLineOffset;
 
-      adr = pst->textlow + pr->adr - first_off;
+      adr = pst->textlow + pr->adr - lowest_pdr_addr;
 
       l = adr >> 2;            /* in words */
       for (lineno = pr->lnLow; base < halt; )
@@ -2217,7 +2255,7 @@ parse_partial_symbols (objfile, section_offsets)
   EXTR *ext_in_end;
   SYMR sh;
   struct partial_symtab *pst;
-
+  int textlow_not_set = 1;
   int past_first_source_file = 0;
 
   /* List of current psymtab's include files */
@@ -2352,7 +2390,8 @@ parse_partial_symbols (objfile, section_offsets)
       extern_tab[fdr_to_pst[ext_in->ifd].globals_offset
                 + fdr_to_pst[ext_in->ifd].n_globals++] = *ext_in;
 
-      if (ext_in->asym.sc == scUndefined || ext_in->asym.sc == scNil)
+      if (ext_in->asym.sc == scUndefined || ext_in->asym.sc == scSUndefined
+         || ext_in->asym.sc == scNil)
        continue;
 
       name = debug_info->ssext + ext_in->asym.iss;
@@ -2413,9 +2452,12 @@ parse_partial_symbols (objfile, section_offsets)
            }
          break;
        case stLocal:
+       case stNil:
          /* The alpha has the section start addresses in stLocal symbols
             whose name starts with a `.'. Skip those but complain for all
-            other stLocal symbols.  */
+            other stLocal symbols.
+            Irix6 puts the section start addresses in stNil symbols, skip
+            those too.  */
          if (name[0] == '.')
            continue;
          /* Fall through.  */
@@ -2532,7 +2574,7 @@ parse_partial_symbols (objfile, section_offsets)
                {
                  if (sh.st == stProc || sh.st == stStaticProc)
                    {
-                     long procaddr;
+                     CORE_ADDR procaddr;
                      long isym;
        
                      sh.value += ANOFFSET (section_offsets, SECT_OFF_TEXT);
@@ -2559,7 +2601,7 @@ parse_partial_symbols (objfile, section_offsets)
                                      &sh);
                      if (sh.st == stEnd)
                        {
-                         long high = procaddr + sh.value;
+                         CORE_ADDR high = procaddr + sh.value;
 
                          /* Kludge for Irix 5.2 zero fh->adr.  */
                          if (!relocatable
@@ -2574,6 +2616,7 @@ parse_partial_symbols (objfile, section_offsets)
                      switch (sh.sc)
                        {
                        case scUndefined:
+                       case scSUndefined:
                        case scNil:
                        case scAbs:
                          break;
@@ -2613,7 +2656,7 @@ parse_partial_symbols (objfile, section_offsets)
 #define CUR_SYMBOL_VALUE sh.value
 #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 END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set) (void)0
 #define HANDLE_RBRAC(val) \
   if ((val) > save_pst->texthigh) save_pst->texthigh = (val);
 #include "partial-stab.h"
@@ -2639,7 +2682,8 @@ parse_partial_symbols (objfile, section_offsets)
                }
 
              /* Non absolute static symbols go into the minimal table.  */
-             if (sh.sc == scUndefined || sh.sc == scNil
+             if (sh.sc == scUndefined || sh.sc == scSUndefined
+                 || sh.sc == scNil
                  || (sh.index == indexNil
                      && (sh.st != stStatic || sh.sc == scAbs)))
                {
@@ -2653,6 +2697,7 @@ parse_partial_symbols (objfile, section_offsets)
              switch (sh.sc)
                {
                case scText:
+               case scRConst:
                  /* The value of a stEnd symbol is the displacement from the
                     corresponding start symbol value, do not relocate it.  */
                  if (sh.st != stEnd)
@@ -2673,8 +2718,8 @@ parse_partial_symbols (objfile, section_offsets)
 
              switch (sh.st)
                {
-                 long high;
-                 long procaddr;
+                 CORE_ADDR high;
+                 CORE_ADDR procaddr;
                  int new_sdx;
 
                case stStaticProc:
@@ -2697,15 +2742,15 @@ parse_partial_symbols (objfile, section_offsets)
                     symbol table, and the MAIN__ symbol via the minimal
                     symbol table.  */
                  if (sh.st == stProc)
-                   ADD_PSYMBOL_TO_LIST (name, strlen (name),
+                   add_psymbol_to_list (name, strlen (name),
                                         VAR_NAMESPACE, LOC_BLOCK,
-                                        objfile->global_psymbols,
-                                        sh.value, psymtab_language, objfile);
+                                        &objfile->global_psymbols,
+                                        0, sh.value, psymtab_language, objfile);
                  else
-                   ADD_PSYMBOL_TO_LIST (name, strlen (name),
+                   add_psymbol_to_list (name, strlen (name),
                                         VAR_NAMESPACE, LOC_BLOCK,
-                                        objfile->static_psymbols,
-                                        sh.value, psymtab_language, objfile);
+                                        &objfile->static_psymbols,
+                                        0, sh.value, psymtab_language, objfile);
 
                  /* Skip over procedure to next one. */
                  if (sh.index >= hdr->iauxMax)
@@ -2793,13 +2838,13 @@ parse_partial_symbols (objfile, section_offsets)
                      && sh.iss != 0
                      && sh.index != cur_sdx + 2)
                    {
-                     ADD_PSYMBOL_TO_LIST (name, strlen (name),
+                     add_psymbol_to_list (name, strlen (name),
                                           STRUCT_NAMESPACE, LOC_TYPEDEF,
-                                          objfile->static_psymbols,
-                                          sh.value,
+                                          &objfile->static_psymbols,
+                                          0, (CORE_ADDR) 0,
                                           psymtab_language, objfile);
                    }
-                 handle_psymbol_enumerators (objfile, fh, sh.st);
+                 handle_psymbol_enumerators (objfile, fh, sh.st, sh.value);
 
                  /* Skip over the block */
                  new_sdx = sh.index;
@@ -2832,10 +2877,10 @@ parse_partial_symbols (objfile, section_offsets)
                  continue;
                }
              /* Use this gdb symbol */
-             ADD_PSYMBOL_TO_LIST (name, strlen (name),
+             add_psymbol_to_list (name, strlen (name),
                                   VAR_NAMESPACE, class,
-                                  objfile->static_psymbols, sh.value,
-                                  psymtab_language, objfile);
+                                  &objfile->static_psymbols,
+                                  0, sh.value, psymtab_language, objfile);
            skip:
              cur_sdx++;        /* Go to next file symbol */
            }
@@ -2857,13 +2902,15 @@ parse_partial_symbols (objfile, section_offsets)
              psh = &ext_ptr->asym;
 
              /* Do not add undefined symbols to the partial symbol table.  */
-             if (psh->sc == scUndefined || psh->sc == scNil)
+             if (psh->sc == scUndefined || psh->sc == scSUndefined
+                 || psh->sc == scNil)
                continue;
 
              svalue = psh->value;
              switch (psh->sc)
                {
                case scText:
+               case scRConst:
                  svalue += ANOFFSET (section_offsets, SECT_OFF_TEXT);
                  break;
                case scData:
@@ -2908,11 +2955,11 @@ parse_partial_symbols (objfile, section_offsets)
                  break;
                }
              name = debug_info->ssext + psh->iss;
-             ADD_PSYMBOL_ADDR_TO_LIST (name, strlen (name),
-                                       VAR_NAMESPACE, class,
-                                       objfile->global_psymbols,
-                                       svalue,
-                                       psymtab_language, objfile);
+             add_psymbol_to_list (name, strlen (name),
+                                  VAR_NAMESPACE, class,
+                                  &objfile->global_psymbols,
+                                  0, svalue,
+                                  psymtab_language, objfile);
            }
        }
 
@@ -2921,7 +2968,10 @@ parse_partial_symbols (objfile, section_offsets)
       fdr_to_pst[f_idx].pst = end_psymtab (save_pst,
                                           psymtab_include_list, includes_used,
                                           -1, save_pst->texthigh,
-                                          dependency_list, dependencies_used);
+                                          dependency_list, dependencies_used, textlow_not_set);
+      includes_used = 0;
+      dependencies_used = 0;
+
       if (objfile->ei.entry_point >= save_pst->textlow &&
          objfile->ei.entry_point < save_pst->texthigh)
        {
@@ -3019,10 +3069,11 @@ parse_partial_symbols (objfile, section_offsets)
    all the the enum constants to the partial symbol table.  */
 
 static void
-handle_psymbol_enumerators (objfile, fh, stype)
+handle_psymbol_enumerators (objfile, fh, stype, svalue)
      struct objfile *objfile;
      FDR *fh;
      int stype;
+     CORE_ADDR svalue;
 {
   const bfd_size_type external_sym_size = debug_swap->external_sym_size;
   void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
@@ -3040,12 +3091,15 @@ handle_psymbol_enumerators (objfile, fh, stype)
     case stBlock:
       /* It is an enumerated type if the next symbol entry is a stMember
         and its auxiliary index is indexNil or its auxiliary entry
-        is a plain btNil or btVoid.  */
+        is a plain btNil or btVoid.
+        Alpha cc -migrate enums are recognized by a zero index and
+        a zero symbol value.  */
       (*swap_sym_in) (cur_bfd, ext_sym, &sh);
       if (sh.st != stMember)
        return;
 
-      if (sh.index == indexNil)
+      if (sh.index == indexNil
+         || (sh.index == 0 && svalue == 0))
        break;
       (*debug_swap->swap_tir_in) (fh->fBigendian,
                                  &(debug_info->external_aux
@@ -3070,16 +3124,17 @@ handle_psymbol_enumerators (objfile, fh, stype)
 
       /* Note that the value doesn't matter for enum constants
         in psymtabs, just in symtabs.  */
-      ADD_PSYMBOL_TO_LIST (name, strlen (name),
+      add_psymbol_to_list (name, strlen (name),
                           VAR_NAMESPACE, LOC_CONST,
-                          objfile->static_psymbols, 0,
-                          psymtab_language, objfile);
+                          &objfile->static_psymbols, 0,
+                          (CORE_ADDR) 0, psymtab_language, objfile);
       ext_sym += external_sym_size;
     }
 }
 
 static char *
-mdebug_next_symbol_text ()
+mdebug_next_symbol_text (objfile)
+     struct objfile *objfile;  /* argument objfile is currently unused */
 {
   SYMR sh;
 
@@ -3115,6 +3170,7 @@ psymtab_to_symtab_1 (pst, filename)
   struct symtab *st;
   FDR *fh;
   struct linetable *lines;
+  CORE_ADDR lowest_pdr_addr = 0;
 
   if (pst->readin)
     return;
@@ -3188,10 +3244,6 @@ psymtab_to_symtab_1 (pst, filename)
 
   if (processing_gcc_compilation != 0)
     {
-      char *pdr_ptr;
-      char *pdr_end;
-      int first_pdr;
-      unsigned long first_off = 0;
 
       /* This symbol table contains stabs-in-ecoff entries.  */
 
@@ -3267,7 +3319,7 @@ psymtab_to_symtab_1 (pst, filename)
          else
            complain (&stab_unknown_complaint, name);
        }
-      st = end_symtab (pst->texthigh, 0, 0, pst->objfile, SECT_OFF_TEXT);
+      st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT);
       end_stabs ();
 
       /* Sort the symbol table now, we are done adding symbols to it.
@@ -3281,21 +3333,42 @@ psymtab_to_symtab_1 (pst, filename)
         generated via asm statements.  */
 
       /* Fill in procedure info next.  */
-      first_pdr = 1;
-      pdr_ptr = ((char *) debug_info->external_pdr
-                + fh->ipdFirst * external_pdr_size);
-      pdr_end = pdr_ptr + fh->cpd * external_pdr_size;
-      for (; pdr_ptr < pdr_end; pdr_ptr += external_pdr_size)
+      if (fh->cpd > 0)
        {
-         PDR pr;
-
-         (*swap_pdr_in) (cur_bfd, pdr_ptr, &pr);
-         if (first_pdr)
+         PDR *pr_block;
+         struct cleanup *old_chain;
+         char *pdr_ptr;
+         char *pdr_end;
+         PDR *pdr_in;
+         PDR *pdr_in_end;
+
+         pr_block = (PDR *) xmalloc (fh->cpd * sizeof (PDR));
+         old_chain = make_cleanup (free, pr_block);
+
+         pdr_ptr = ((char *) debug_info->external_pdr
+                    + fh->ipdFirst * external_pdr_size);
+         pdr_end = pdr_ptr + fh->cpd * external_pdr_size;
+         pdr_in = pr_block;
+         for (;
+              pdr_ptr < pdr_end;
+              pdr_ptr += external_pdr_size, pdr_in++)
            {
-             first_off = pr.adr;
-             first_pdr = 0;
+             (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
+
+             /* Determine lowest PDR address, the PDRs are not always
+                sorted.  */
+             if (pdr_in == pr_block)
+               lowest_pdr_addr = pdr_in->adr;
+             else if (pdr_in->adr < lowest_pdr_addr)
+               lowest_pdr_addr = pdr_in->adr;
            }
-         parse_procedure (&pr, st, first_off, pst);
+
+         pdr_in = pr_block;
+         pdr_in_end = pdr_in + fh->cpd;
+         for (; pdr_in < pdr_in_end; pdr_in++)
+           parse_procedure (pdr_in, st, lowest_pdr_addr, pst);
+
+         do_cleanups (old_chain);
        }
     }
   else
@@ -3388,9 +3461,18 @@ psymtab_to_symtab_1 (pst, filename)
              for (;
                   pdr_ptr < pdr_end;
                   pdr_ptr += external_pdr_size, pdr_in++)
-               (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
+               {
+                 (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
+
+                 /* Determine lowest PDR address, the PDRs are not always
+                    sorted.  */
+                 if (pdr_in == pr_block)
+                   lowest_pdr_addr = pdr_in->adr;
+                 else if (pdr_in->adr < lowest_pdr_addr)
+                   lowest_pdr_addr = pdr_in->adr;
+               }
 
-             parse_lines (fh, pr_block, lines, maxlines, pst);
+             parse_lines (fh, pr_block, lines, maxlines, pst, lowest_pdr_addr);
              if (lines->nitems < fh->cline)
                lines = shrink_linetable (lines);
 
@@ -3398,7 +3480,7 @@ psymtab_to_symtab_1 (pst, filename)
              pdr_in = pr_block;
              pdr_in_end = pdr_in + fh->cpd;
              for (; pdr_in < pdr_in_end; pdr_in++)
-               parse_procedure (pdr_in, 0, pr_block->adr, pst);
+               parse_procedure (pdr_in, 0, lowest_pdr_addr, pst);
 
              do_cleanups (old_chain);
            }
@@ -3524,7 +3606,7 @@ cross_ref (fd, ax, tpp, type_code, pname, bigend, sym_name)
     }
 
   /* mips cc uses a rf of -1 for opaque struct definitions.
-     Set TYPE_FLAG_STUB for these types so that check_stub_type will
+     Set TYPE_FLAG_STUB for these types so that check_typedef will
      resolve them if the struct gets defined in another compilation unit.  */
   if (rf == -1)
     {
@@ -3697,7 +3779,7 @@ static struct symbol *
 mylookup_symbol (name, block, namespace, class)
      char *name;
      register struct block *block;
-     enum namespace namespace;
+     namespace_enum namespace;
      enum address_class class;
 {
   register int bot, top, inc;
@@ -4048,7 +4130,8 @@ new_symbol (name)
                                     sizeof (struct symbol)));
 
   memset ((PTR) s, 0, sizeof (*s));
-  SYMBOL_NAME (s) = name;
+  SYMBOL_NAME (s) = obsavestring (name, strlen (name),
+                                 &current_objfile->symbol_obstack);
   SYMBOL_LANGUAGE (s) = psymtab_language;
   SYMBOL_INIT_DEMANGLED_NAME (s, &current_objfile->symbol_obstack);
   return s;
@@ -4107,7 +4190,10 @@ elfmdebug_build_psymtabs (objfile, swap, sec, section_offsets)
 
 /* FIXME: This function is called only by mips-tdep.c.  It needs to be
    here because it calls functions defined in this file, but perhaps
-   this could be handled in a better way.  */
+   this could be handled in a better way.  Only compile it in when
+   tm-mips.h is included. */
+
+#ifdef TM_MIPS_H
 
 void
 fixup_sigtramp ()
@@ -4209,6 +4295,8 @@ fixup_sigtramp ()
   BLOCK_SYM (b, BLOCK_NSYMS (b)++) = s;
 }
 
+#endif /* TM_MIPS_H */
+
 void
 _initialize_mdebugread ()
 {
This page took 0.034462 seconds and 4 git commands to generate.