2008-08-21 Sterling Augustine <sterling@tensilica.com>
[deliverable/binutils-gdb.git] / gdb / mdebugread.c
index 5207b7e3930dc38c0f352b9c07d95d459a344454..4f9841982b78e391a109dbf06bf3cc34a11699e1 100644 (file)
@@ -1,8 +1,8 @@
 /* Read a symbol table in ECOFF format (Third-Eye).
 
-   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
-   Foundation, Inc.
+   Copyright (C) 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008
+   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
@@ -12,7 +12,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -21,9 +21,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* This module provides the function mdebug_build_psymtabs.  It reads
    ECOFF debugging information into partial symbol tables.  The
 #include "gdb_assert.h"
 #include "block.h"
 #include "dictionary.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 (struct symbol *, CORE_ADDR);
-#include "coff/sym.h"
-#include "coff/symconst.h"
-typedef struct mips_extra_func_info
-  {
-    long numargs;
-    PDR pdr;
-  }
- *mips_extra_func_info_t;
-#ifndef RA_REGNUM
-#define RA_REGNUM 0
-#endif
-#endif
-
+#include "mdebugread.h"
 #include "gdb_stat.h"
 #include "gdb_string.h"
 
@@ -88,7 +67,6 @@ typedef struct mips_extra_func_info
 #include "aout/stab_gnu.h"     /* STABS information */
 
 #include "expression.h"
-#include "language.h"          /* For local_hex_string() */
 
 extern void _initialize_mdebugread (void);
 
@@ -144,39 +122,39 @@ struct symloc
 static void
 index_complaint (const char *arg1)
 {
-  complaint (&symfile_complaints, "bad aux index at symbol %s", arg1);
+  complaint (&symfile_complaints, _("bad aux index at symbol %s"), arg1);
 }
 
 static void
 unknown_ext_complaint (const char *arg1)
 {
-  complaint (&symfile_complaints, "unknown external symbol %s", arg1);
+  complaint (&symfile_complaints, _("unknown external symbol %s"), arg1);
 }
 
 static void
 basic_type_complaint (int arg1, const char *arg2)
 {
-  complaint (&symfile_complaints, "cannot map ECOFF basic type 0x%x for %s",
+  complaint (&symfile_complaints, _("cannot map ECOFF basic type 0x%x for %s"),
             arg1, arg2);
 }
 
 static void
 bad_tag_guess_complaint (const char *arg1)
 {
-  complaint (&symfile_complaints, "guessed tag type of %s incorrectly", arg1);
+  complaint (&symfile_complaints, _("guessed tag type of %s incorrectly"), arg1);
 }
 
 static void
 bad_rfd_entry_complaint (const char *arg1, int arg2, int arg3)
 {
-  complaint (&symfile_complaints, "bad rfd entry for %s: file %d, index %d",
+  complaint (&symfile_complaints, _("bad rfd entry for %s: file %d, index %d"),
             arg1, arg2, arg3);
 }
 
 static void
 unexpected_type_code_complaint (const char *arg1)
 {
-  complaint (&symfile_complaints, "unexpected type code for %s", arg1);
+  complaint (&symfile_complaints, _("unexpected type code for %s"), arg1);
 }
 
 /* Macros and extra defs */
@@ -257,11 +235,6 @@ static struct type *mdebug_type_fixed_dec;
 static struct type *mdebug_type_float_dec;
 static struct type *mdebug_type_string;
 
-/* Types for symbols from files compiled without debugging info.  */
-
-static struct type *nodebug_func_symbol_type;
-static struct type *nodebug_var_symbol_type;
-
 /* Nonzero if we have seen ecoff debugging info for a file.  */
 
 static int found_ecoff_debugging_info;
@@ -306,7 +279,7 @@ static void psymtab_to_symtab_1 (struct partial_symtab *, char *);
 
 static void add_block (struct block *, struct symtab *);
 
-static void add_symbol (struct symbol *, struct block *);
+static void add_symbol (struct symbol *, struct symtab *, struct block *);
 
 static int add_line (struct linetable *, int, CORE_ADDR, int);
 
@@ -317,17 +290,6 @@ static void handle_psymbol_enumerators (struct objfile *, FDR *, int,
 
 static char *mdebug_next_symbol_text (struct objfile *);
 \f
-/* Allocate zeroed memory */
-
-static void *
-xzalloc (unsigned int size)
-{
-  void *p = xmalloc (size);
-
-  memset (p, 0, size);
-  return p;
-}
-
 /* Exported procedure: Builds a symtab from the PST partial one.
    Restores the environment in effect when PST was created, delegates
    most of the work to an ancillary procedure, and sorts
@@ -342,7 +304,7 @@ mdebug_psymtab_to_symtab (struct partial_symtab *pst)
 
   if (info_verbose)
     {
-      printf_filtered ("Reading in symbols for %s...", pst->filename);
+      printf_filtered (_("Reading in symbols for %s..."), pst->filename);
       gdb_flush (gdb_stdout);
     }
 
@@ -355,7 +317,7 @@ mdebug_psymtab_to_symtab (struct partial_symtab *pst)
   scan_file_globals (pst->objfile);
 
   if (info_verbose)
-    printf_filtered ("done.\n");
+    printf_filtered (_("done.\n"));
 }
 \f
 /* File-level interface functions */
@@ -438,9 +400,9 @@ mdebug_build_psymtabs (struct objfile *objfile,
   if (compare_glevel (max_glevel, GLEVEL_2) < 0)
     {
       if (max_gdbinfo == 0)
-       printf_unfiltered ("\n%s not compiled with -g, debugging support is limited.\n",
+       printf_unfiltered (_("\n%s not compiled with -g, debugging support is limited.\n"),
                           objfile->name);
-      printf_unfiltered ("You should compile with -g2 or -g3 for best debugging support.\n");
+      printf_unfiltered (_("You should compile with -g2 or -g3 for best debugging support.\n"));
       gdb_flush (gdb_stdout);
     }
 #endif
@@ -537,9 +499,9 @@ struct mdebug_pending
 
 
 /* The pending information is kept for an entire object file, and used
-   to be in the sym_private field.  I took it out when I split
-   mdebugread from mipsread, because this might not be the only type
-   of symbols read from an object file.  Instead, we allocate the
+   to be in the deprecated_sym_private field.  I took it out when I
+   split mdebugread from mipsread, because this might not be the only
+   type of symbols read from an object file.  Instead, we allocate the
    pending information table when we create the partial symbols, and
    we store a pointer to the single table in each psymtab.  */
 
@@ -597,6 +559,7 @@ static int
 parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
              struct section_offsets *section_offsets, struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   const bfd_size_type external_sym_size = debug_swap->external_sym_size;
   void (*const swap_sym_in) (bfd *, void *, SYMR *) = debug_swap->swap_sym_in;
   char *name;
@@ -675,7 +638,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       if (sh->sc == scRegister)
        {
          class = LOC_REGISTER;
-         svalue = ECOFF_REG_TO_REGNUM (svalue);
+         svalue = gdbarch_ecoff_reg_to_regnum (current_gdbarch, svalue);
        }
       else
        class = LOC_LOCAL;
@@ -686,12 +649,12 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
     data:                      /* Common code for symbols describing data */
       SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       SYMBOL_CLASS (s) = class;
-      add_symbol (s, b);
+      add_symbol (s, top_stack->cur_st, b);
 
       /* Type could be missing if file is compiled without debugging info.  */
       if (SC_IS_UNDEF (sh->sc)
          || sh->sc == scNil || sh->index == indexNil)
-       SYMBOL_TYPE (s) = nodebug_var_symbol_type;
+       SYMBOL_TYPE (s) = builtin_type (gdbarch)->nodebug_data_symbol;
       else
        SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name);
       /* Value of a data symbol is its memory address */
@@ -708,12 +671,13 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       s = new_symbol (name);
 
       SYMBOL_DOMAIN (s) = VAR_DOMAIN;
+      SYMBOL_IS_ARGUMENT (s) = 1;
       switch (sh->sc)
        {
        case scRegister:
          /* Pass by value in register.  */
-         SYMBOL_CLASS (s) = LOC_REGPARM;
-         svalue = ECOFF_REG_TO_REGNUM (svalue);
+         SYMBOL_CLASS (s) = LOC_REGISTER;
+         svalue = gdbarch_ecoff_reg_to_regnum (current_gdbarch, svalue);
          break;
        case scVar:
          /* Pass by reference on stack.  */
@@ -722,7 +686,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        case scVarRegister:
          /* Pass by reference in register.  */
          SYMBOL_CLASS (s) = LOC_REGPARM_ADDR;
-         svalue = ECOFF_REG_TO_REGNUM (svalue);
+         svalue = gdbarch_ecoff_reg_to_regnum (current_gdbarch, svalue);
          break;
        default:
          /* Pass by value on stack.  */
@@ -731,7 +695,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        }
       SYMBOL_VALUE (s) = svalue;
       SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name);
-      add_symbol (s, top_stack->cur_block);
+      add_symbol (s, top_stack->cur_st, top_stack->cur_block);
       break;
 
     case stLabel:              /* label, goes into current block */
@@ -740,7 +704,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       SYMBOL_CLASS (s) = LOC_LABEL;    /* but not misused */
       SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
       SYMBOL_TYPE (s) = mdebug_type_int;
-      add_symbol (s, top_stack->cur_block);
+      add_symbol (s, top_stack->cur_st, top_stack->cur_block);
       break;
 
     case stProc:               /* Procedure, usually goes into global block */
@@ -771,7 +735,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                     break;
                   default:
                     complaint (&symfile_complaints,
-                               "unknown symbol type 0x%x", sh->st);
+                               _("unknown symbol type 0x%x"), sh->st);
                     break;
                 }
             }
@@ -808,7 +772,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
          /* The next test should normally be true, but provides a
             hook for nested functions (which we don't want to make
-            global). */
+            global).  */
          if (b == BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK))
            b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
          /* Irix 5 sometimes has duplicate names for the same
@@ -817,7 +781,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          else if (sh->value == top_stack->procadr)
            b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
        }
-      add_symbol (s, b);
+      add_symbol (s, top_stack->cur_st, b);
 
       /* Make a type for the procedure itself */
       SYMBOL_TYPE (s) = lookup_function_type (t);
@@ -988,7 +952,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
              default:
                complaint (&symfile_complaints,
-                          "declaration block contains unhandled symbol type %d",
+                          _("declaration block contains unhandled symbol type %d"),
                           tsym.st);
              }
          }
@@ -1077,7 +1041,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
               that too.  */
            if (TYPE_LENGTH (t) == TYPE_NFIELDS (t)
                || TYPE_LENGTH (t) == 0)
-             TYPE_LENGTH (t) = TARGET_INT_BIT / HOST_CHAR_BIT;
+             TYPE_LENGTH (t) = gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT;
            for (ext_tsym = ext_sh + external_sym_size;
                 ;
                 ext_tsym += external_sym_size)
@@ -1109,7 +1073,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                SYMBOL_VALUE (enum_sym) = tsym.value;
                if (SYMBOL_VALUE (enum_sym) < 0)
                  unsigned_enum = 0;
-               add_symbol (enum_sym, top_stack->cur_block);
+               add_symbol (enum_sym, top_stack->cur_st, top_stack->cur_block);
 
                /* Skip the stMembers that we've handled. */
                count++;
@@ -1139,7 +1103,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        SYMBOL_CLASS (s) = LOC_TYPEDEF;
        SYMBOL_VALUE (s) = 0;
        SYMBOL_TYPE (s) = t;
-       add_symbol (s, top_stack->cur_block);
+       add_symbol (s, top_stack->cur_st, top_stack->cur_block);
        break;
 
        /* End of local variables shared by struct, union, enum, and
@@ -1182,7 +1146,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        {
          /* Finished with procedure */
          struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
-         struct mips_extra_func_info *e;
+         struct mdebug_extra_func_info *e;
          struct block *b = top_stack->cur_block;
          struct type *ftype = top_stack->cur_type;
          int i;
@@ -1190,18 +1154,18 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          BLOCK_END (top_stack->cur_block) += sh->value;        /* size */
 
          /* Make up special symbol to contain procedure specific info */
-         s = new_symbol (MIPS_EFI_SYMBOL_NAME);
+         s = new_symbol (MDEBUG_EFI_SYMBOL_NAME);
          SYMBOL_DOMAIN (s) = LABEL_DOMAIN;
          SYMBOL_CLASS (s) = LOC_CONST;
          SYMBOL_TYPE (s) = mdebug_type_void;
-         e = ((struct mips_extra_func_info *)
+         e = ((struct mdebug_extra_func_info *)
               obstack_alloc (&current_objfile->objfile_obstack,
-                             sizeof (struct mips_extra_func_info)));
-         memset (e, 0, sizeof (struct mips_extra_func_info));
+                             sizeof (struct mdebug_extra_func_info)));
+         memset (e, 0, sizeof (struct mdebug_extra_func_info));
          SYMBOL_VALUE (s) = (long) e;
          e->numargs = top_stack->numargs;
          e->pdr.framereg = -1;
-         add_symbol (s, top_stack->cur_block);
+         add_symbol (s, top_stack->cur_st, top_stack->cur_block);
 
          /* f77 emits proc-level with address bounds==[0,0],
             So look for such child blocks, and patch them.  */
@@ -1238,18 +1202,11 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                      if (iparams == nparams)
                        break;
 
-                     switch (SYMBOL_CLASS (sym))
+                     if (SYMBOL_IS_ARGUMENT (sym))
                        {
-                       case LOC_ARG:
-                       case LOC_REF_ARG:
-                       case LOC_REGPARM:
-                       case LOC_REGPARM_ADDR:
                          TYPE_FIELD_TYPE (ftype, iparams) = SYMBOL_TYPE (sym);
                          TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
                          iparams++;
-                         break;
-                       default:
-                         break;
                        }
                    }
                }
@@ -1276,7 +1233,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        }
       else
        complaint (&symfile_complaints,
-                  "stEnd with storage class %d not handled", sh->sc);
+                  _("stEnd with storage class %d not handled"), sh->sc);
 
       pop_parse_stack ();      /* restore previous lexical context */
       break;
@@ -1340,7 +1297,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       SYMBOL_CLASS (s) = LOC_TYPEDEF;
       SYMBOL_BLOCK_VALUE (s) = top_stack->cur_block;
       SYMBOL_TYPE (s) = t;
-      add_symbol (s, top_stack->cur_block);
+      add_symbol (s, top_stack->cur_st, top_stack->cur_block);
 
       /* Incomplete definitions of structs should not get a name.  */
       if (TYPE_NAME (SYMBOL_TYPE (s)) == NULL
@@ -1388,7 +1345,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
     case stConstant:
       break;                   /* constant */
     default:
-      complaint (&symfile_complaints, "unknown symbol type 0x%x", sh->st);
+      complaint (&symfile_complaints, _("unknown symbol type 0x%x"), sh->st);
       break;
     }
 
@@ -1529,7 +1486,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
          else if (t->bt == btEnum)
            ;
          else
-           complaint (&symfile_complaints, "can't handle TIR fBitfield for %s",
+           complaint (&symfile_complaints, _("can't handle TIR fBitfield for %s"),
                       sym_name);
        }
       else
@@ -1559,7 +1516,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
       if (rf == -1)
        {
          complaint (&symfile_complaints,
-                    "unable to cross ref btIndirect for %s", sym_name);
+                    _("unable to cross ref btIndirect for %s"), sym_name);
          return mdebug_type_int;
        }
       xref_fh = get_rfd (fd, rf);
@@ -1676,7 +1633,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
       if (tp == (struct type *) NULL)
        {
          complaint (&symfile_complaints,
-                    "unable to cross ref btTypedef for %s", sym_name);
+                    _("unable to cross ref btTypedef for %s"), sym_name);
          tp = mdebug_type_int;
        }
     }
@@ -1726,7 +1683,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
 
   /* Complain for illegal continuations due to corrupt aux entries.  */
   if (t->continued)
-    complaint (&symfile_complaints, "illegal TIR continued for %s", sym_name);
+    complaint (&symfile_complaints, _("illegal TIR continued for %s"), sym_name);
 
   return tp;
 }
@@ -1789,7 +1746,7 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend,
       if (TYPE_CODE (indx) != TYPE_CODE_INT)
        {
          complaint (&symfile_complaints,
-                    "illegal array index type for %s, assuming int", sym_name);
+                    _("illegal array index type for %s, assuming int"), sym_name);
          indx = mdebug_type_int;
        }
 
@@ -1839,7 +1796,7 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend,
       return 0;
 
     default:
-      complaint (&symfile_complaints, "unknown type qualifier 0x%x", tq);
+      complaint (&symfile_complaints, _("unknown type qualifier 0x%x"), tq);
       return 0;
     }
 }
@@ -1847,13 +1804,13 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int 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 MIPS_EFI_SYMBOL_NAME symbol that has
+   information we need into a MDEBUG_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.  FIRST_OFF is
    the offset of the first procedure for this FDR; we adjust the
    address by this amount, but I don't know why.  SEARCH_SYMTAB is the symtab
-   to look for the function which contains the MIPS_EFI_SYMBOL_NAME symbol
+   to look for the function which contains the MDEBUG_EFI_SYMBOL_NAME symbol
    in question, or NULL to use top_stack->cur_block.  */
 
 static void parse_procedure (PDR *, struct symtab *, struct partial_symtab *);
@@ -1862,9 +1819,10 @@ static void
 parse_procedure (PDR *pr, struct symtab *search_symtab,
                 struct partial_symtab *pst)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (pst->objfile);
   struct symbol *s, *i;
   struct block *b;
-  struct mips_extra_func_info *e;
+  struct mdebug_extra_func_info *e;
   char *sh_name;
 
   /* Simple rule to find files linked "-x" */
@@ -1875,7 +1833,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
          /* Static procedure at address pr->adr.  Sigh. */
          /* FIXME-32x64.  assuming pr->adr fits in long.  */
          complaint (&symfile_complaints,
-                    "can't handle PDR for static proc at 0x%lx",
+                    _("can't handle PDR for static proc at 0x%lx"),
                     (unsigned long) pr->adr);
          return;
        }
@@ -1916,7 +1874,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
          the same name exists, lookup_symbol will eventually read in the symtab
          for the global function and clobber cur_fdr.  */
       FDR *save_cur_fdr = cur_fdr;
-      s = lookup_symbol (sh_name, NULL, VAR_DOMAIN, 0, NULL);
+      s = lookup_symbol (sh_name, NULL, VAR_DOMAIN, 0);
       cur_fdr = save_cur_fdr;
 #else
       s = mylookup_symbol
@@ -1936,7 +1894,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
     }
   else
     {
-      complaint (&symfile_complaints, "PDR for %s, but no symbol", sh_name);
+      complaint (&symfile_complaints, _("PDR for %s, but no symbol"), sh_name);
 #if 1
       return;
 #else
@@ -1946,7 +1904,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
       SYMBOL_CLASS (s) = LOC_BLOCK;
       /* Donno its type, hope int is ok */
       SYMBOL_TYPE (s) = lookup_function_type (mdebug_type_int);
-      add_symbol (s, top_stack->cur_block);
+      add_symbol (s, top_stack->cur_st, top_stack->cur_block);
       /* Wont have symbols for this one */
       b = new_block (2);
       SYMBOL_BLOCK_VALUE (s) = b;
@@ -1960,11 +1918,11 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
 #endif
     }
 
-  i = mylookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_DOMAIN, LOC_CONST);
+  i = mylookup_symbol (MDEBUG_EFI_SYMBOL_NAME, b, LABEL_DOMAIN, LOC_CONST);
 
   if (i)
     {
-      e = (struct mips_extra_func_info *) SYMBOL_VALUE (i);
+      e = (struct mdebug_extra_func_info *) SYMBOL_VALUE (i);
       e->pdr = *pr;
       e->pdr.isym = (long) s;
 
@@ -1979,17 +1937,6 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
          To work around these problems, we replace e->pdr.adr with
          the start address of the function.  */
       e->pdr.adr = BLOCK_START (b);
-
-      /* Correct incorrect setjmp procedure descriptor from the library
-         to make backtrace through setjmp work.  */
-      if (e->pdr.pcreg == 0
-         && strcmp (sh_name, "setjmp") == 0)
-       {
-         complaint (&symfile_complaints, "fixing bad setjmp PDR from libc");
-         e->pdr.pcreg = RA_REGNUM;
-         e->pdr.regmask = 0x80000000;
-         e->pdr.regoffset = -4;
-       }
     }
 
   /* It would be reasonable that functions that have been compiled
@@ -2010,19 +1957,7 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
   if (processing_gcc_compilation == 0
       && found_ecoff_debugging_info == 0
       && TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (s))) == TYPE_CODE_VOID)
-    SYMBOL_TYPE (s) = nodebug_func_symbol_type;
-}
-
-/* Relocate the extra function info pointed to by the symbol table.  */
-
-void
-ecoff_relocate_efi (struct symbol *sym, CORE_ADDR delta)
-{
-  struct mips_extra_func_info *e;
-
-  e = (struct mips_extra_func_info *) SYMBOL_VALUE (sym);
-
-  e->pdr.adr += delta;
+    SYMBOL_TYPE (s) = builtin_type (gdbarch)->nodebug_text_symbol;
 }
 
 /* Parse the external symbol ES. Just call parse_symbol() after
@@ -2082,7 +2017,7 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets,
       n_undef_symbols++;
       /* FIXME:  Turn this into a complaint? */
       if (info_verbose)
-       printf_filtered ("Warning: %s `%s' is undefined (in %s)\n",
+       printf_filtered (_("Warning: %s `%s' is undefined (in %s)\n"),
                         what, debug_info->ssext + es->asym.iss,
                         fdr_name (cur_fdr));
       return;
@@ -2183,7 +2118,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
          if (lt->nitems >= maxlines)
            {
              complaint (&symfile_complaints,
-                        "guessed size of linetable for %s incorrectly",
+                        _("guessed size of linetable for %s incorrectly"),
                         fdr_name (fh));
              break;
            }
@@ -2197,16 +2132,96 @@ static void
 function_outside_compilation_unit_complaint (const char *arg1)
 {
   complaint (&symfile_complaints,
-            "function `%s' appears to be defined outside of all compilation units",
+            _("function `%s' appears to be defined outside of all compilation units"),
             arg1);
 }
 
+/* Use the STORAGE_CLASS to compute which section the given symbol
+   belongs to, and then records this new minimal symbol.  */
+
+static void
+record_minimal_symbol (const char *name, const CORE_ADDR address,
+                       enum minimal_symbol_type ms_type, int storage_class,
+                       struct objfile *objfile)
+{
+  int section;
+  asection *bfd_section;
+
+  switch (storage_class)
+    {
+      case scText:
+        section = SECT_OFF_TEXT (objfile);
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".text");
+        break;
+      case scData:
+        section = SECT_OFF_DATA (objfile);
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".data");
+        break;
+      case scBss:
+        section = SECT_OFF_BSS (objfile);
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".bss");
+        break;
+      case scSData:
+        section = get_section_index (objfile, ".sdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".sdata");
+        break;
+      case scSBss:
+        section = get_section_index (objfile, ".sbss");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".sbss");
+        break;
+      case scRData:
+        section = get_section_index (objfile, ".rdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".rdata");
+        break;
+      case scInit:
+        section = get_section_index (objfile, ".init");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".init");
+        break;
+      case scXData:
+        section = get_section_index (objfile, ".xdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".xdata");
+        break;
+      case scPData:
+        section = get_section_index (objfile, ".pdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".pdata");
+        break;
+      case scFini:
+        section = get_section_index (objfile, ".fini");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".fini");
+        break;
+      case scRConst:
+        section = get_section_index (objfile, ".rconst");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".rconst");
+        break;
+#ifdef scTlsData
+      case scTlsData:
+        section = get_section_index (objfile, ".tlsdata");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsdata");
+        break;
+#endif
+#ifdef scTlsBss
+      case scTlsBss:
+        section = get_section_index (objfile, ".tlsbss");
+        bfd_section = bfd_get_section_by_name (cur_bfd, ".tlsbss");
+        break;
+#endif
+      default:
+        /* This kind of symbol is not associated to a section.  */
+        section = -1;
+        bfd_section = NULL;
+    }
+
+  prim_record_minimal_symbol_and_info (name, address, ms_type, NULL,
+                                       section, bfd_section, objfile);
+}
+
 /* Master parsing procedure for first-pass reading of file symbols
    into a partial_symtab.  */
 
 static void
 parse_partial_symbols (struct objfile *objfile)
 {
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
   const bfd_size_type external_sym_size = debug_swap->external_sym_size;
   const bfd_size_type external_rfd_size = debug_swap->external_rfd_size;
   const bfd_size_type external_ext_size = debug_swap->external_ext_size;
@@ -2378,14 +2393,14 @@ parse_partial_symbols (struct objfile *objfile)
       if (ext_in->ifd < -1 || ext_in->ifd >= hdr->ifdMax)
        {
          complaint (&symfile_complaints,
-                    "bad ifd for external symbol: %d (max %ld)", ext_in->ifd,
+                    _("bad ifd for external symbol: %d (max %ld)"), ext_in->ifd,
                     hdr->ifdMax);
          continue;
        }
       if (ext_in->asym.iss < 0 || ext_in->asym.iss >= hdr->issExtMax)
        {
          complaint (&symfile_complaints,
-                    "bad iss for external symbol: %ld (max %ld)",
+                    _("bad iss for external symbol: %ld (max %ld)"),
                     ext_in->asym.iss, hdr->issExtMax);
          continue;
        }
@@ -2515,7 +2530,8 @@ parse_partial_symbols (struct objfile *objfile)
          unknown_ext_complaint (name);
        }
       if (!ECOFF_IN_ELF (cur_bfd))
-       prim_record_minimal_symbol (name, svalue, ms_type, objfile);
+        record_minimal_symbol (name, svalue, ms_type, ext_in->asym.sc,
+                               objfile);
     }
 
   /* Pass 3 over files, over local syms: fill in static symbols */
@@ -2632,13 +2648,9 @@ parse_partial_symbols (struct objfile *objfile)
                      if (sh.st == stStaticProc)
                        {
                          namestring = debug_info->ss + fh->issBase + sh.iss;
-                         prim_record_minimal_symbol_and_info (namestring,
-                                                              sh.value,
-                                                              mst_file_text,
-                                                              NULL,
-                                                              SECT_OFF_TEXT (objfile),
-                                                              NULL,
-                                                              objfile);
+                          record_minimal_symbol (namestring, sh.value,
+                                                 mst_file_text, sh.sc,
+                                                 objfile);
                        }
                      procaddr = sh.value;
 
@@ -2680,13 +2692,9 @@ parse_partial_symbols (struct objfile *objfile)
                        case scXData:
                          namestring = debug_info->ss + fh->issBase + sh.iss;
                          sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
-                         prim_record_minimal_symbol_and_info (namestring,
-                                                              sh.value,
-                                                              mst_file_data,
-                                                              NULL,
-                                                              SECT_OFF_DATA (objfile),
-                                                              NULL,
-                                                              objfile);
+                          record_minimal_symbol (namestring, sh.value,
+                                                 mst_file_data, sh.sc,
+                                                 objfile);
                          break;
 
                        default:
@@ -2694,13 +2702,9 @@ parse_partial_symbols (struct objfile *objfile)
                             then have the default be abs? */
                          namestring = debug_info->ss + fh->issBase + sh.iss;
                          sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
-                         prim_record_minimal_symbol_and_info (namestring,
-                                                              sh.value,
-                                                              mst_file_bss,
-                                                              NULL,
-                                                              SECT_OFF_BSS (objfile),
-                                                              NULL,
-                                                              objfile);
+                          record_minimal_symbol (namestring, sh.value,
+                                                 mst_file_bss, sh.sc,
+                                                 objfile);
                          break;
                        }
                    }
@@ -2836,21 +2840,19 @@ parse_partial_symbols (struct objfile *objfile)
 
                      prev_textlow_not_set = textlow_not_set;
 
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
                      /* A zero value is probably an indication for the SunPRO 3.0
                         compiler. end_psymtab explicitly tests for zero, so
                         don't relocate it.  */
 
-                     if (sh.value == 0)
+                     if (sh.value == 0
+                         && gdbarch_sofun_address_maybe_missing (gdbarch))
                        {
                          textlow_not_set = 1;
                          valu = 0;
                        }
                      else
                        textlow_not_set = 0;
-#else
-                     textlow_not_set = 0;
-#endif
+
                      past_first_source_file = 1;
 
                      if (prev_so_symnum != symnum - 1)
@@ -2991,9 +2993,11 @@ parse_partial_symbols (struct objfile *objfile)
                      {
                      case 'S':
                        sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
-#ifdef STATIC_TRANSFORM_NAME
-                       namestring = STATIC_TRANSFORM_NAME (namestring);
-#endif
+
+                       if (gdbarch_static_transform_name_p (gdbarch))
+                         namestring = gdbarch_static_transform_name
+                                        (gdbarch, namestring);
+
                        add_psymbol_to_list (namestring, p - namestring,
                                             VAR_DOMAIN, LOC_STATIC,
                                             &objfile->static_psymbols,
@@ -3204,7 +3208,7 @@ parse_partial_symbols (struct objfile *objfile)
                           a backslash.  */
 
                        complaint (&symfile_complaints,
-                                  "unknown symbol descriptor `%c'", p[1]);
+                                  _("unknown symbol descriptor `%c'"), p[1]);
 
                        /* Ignore it; perhaps it is an extension that we don't
                           know about.  */
@@ -3215,19 +3219,18 @@ parse_partial_symbols (struct objfile *objfile)
                    continue;
 
                  case N_ENDM:
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
                    /* Solaris 2 end of module, finish current partial
                       symbol table.  END_PSYMTAB will set
                       pst->texthigh to the proper value, which is
                       necessary if a module compiled without
                       debugging info follows this module.  */
-                   if (pst)
+                   if (pst
+                       && gdbarch_sofun_address_maybe_missing (gdbarch))
                      {
                        pst = (struct partial_symtab *) 0;
                        includes_used = 0;
                        dependencies_used = 0;
                      }
-#endif
                    continue;
 
                  case N_RBRAC:
@@ -3265,8 +3268,8 @@ parse_partial_symbols (struct objfile *objfile)
                  default:
                    /* If we haven't found it yet, ignore it.  It's probably some
                       new type we don't know about yet.  */
-                   complaint (&symfile_complaints, "unknown symbol type %s",
-                              local_hex_string (type_code)); /*CUR_SYMBOL_TYPE*/
+                   complaint (&symfile_complaints, _("unknown symbol type %s"),
+                              hex_string (type_code)); /*CUR_SYMBOL_TYPE*/
                    continue;
                  }
                if (stabstring
@@ -3362,7 +3365,7 @@ parse_partial_symbols (struct objfile *objfile)
                    {
                      /* This should not happen either... FIXME.  */
                      complaint (&symfile_complaints,
-                                "bad proc end in aux found from symbol %s",
+                                _("bad proc end in aux found from symbol %s"),
                                 name);
                      new_sdx = cur_sdx + 1;    /* Don't skip backward */
                    }
@@ -3477,7 +3480,7 @@ parse_partial_symbols (struct objfile *objfile)
                    {
                      /* This happens with the Ultrix kernel. */
                      complaint (&symfile_complaints,
-                                "bad aux index at block symbol %s", name);
+                                _("bad aux index at block symbol %s"), name);
                      new_sdx = cur_sdx + 1;    /* Don't skip backward */
                    }
                  cur_sdx = new_sdx;
@@ -3497,9 +3500,9 @@ parse_partial_symbols (struct objfile *objfile)
                default:
                  /* Both complaints are valid:  one gives symbol name,
                     the other the offending symbol type.  */
-                 complaint (&symfile_complaints, "unknown local symbol %s",
+                 complaint (&symfile_complaints, _("unknown local symbol %s"),
                             name);
-                 complaint (&symfile_complaints, "with type %d", sh.st);
+                 complaint (&symfile_complaints, _("with type %d"), sh.st);
                  cur_sdx++;
                  continue;
                }
@@ -3525,7 +3528,7 @@ parse_partial_symbols (struct objfile *objfile)
              CORE_ADDR svalue;
 
              if (ext_ptr->ifd != f_idx)
-               internal_error (__FILE__, __LINE__, "failed internal consistency check");
+               internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
              psh = &ext_ptr->asym;
 
              /* Do not add undefined symbols to the partial symbol table.  */
@@ -3658,7 +3661,7 @@ parse_partial_symbols (struct objfile *objfile)
                          &rh);
          if (rh < 0 || rh >= hdr->ifdMax)
            {
-             complaint (&symfile_complaints, "bad file number %ld", rh);
+             complaint (&symfile_complaints, _("bad file number %ld"), rh);
              continue;
            }
 
@@ -3930,13 +3933,13 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
                {
                  /* Make up special symbol to contain
                     procedure specific info */
-                 struct mips_extra_func_info *e =
-                 ((struct mips_extra_func_info *)
+                 struct mdebug_extra_func_info *e =
+                 ((struct mdebug_extra_func_info *)
                   obstack_alloc (&current_objfile->objfile_obstack,
-                                 sizeof (struct mips_extra_func_info)));
-                 struct symbol *s = new_symbol (MIPS_EFI_SYMBOL_NAME);
+                                 sizeof (struct mdebug_extra_func_info)));
+                 struct symbol *s = new_symbol (MDEBUG_EFI_SYMBOL_NAME);
 
-                 memset (e, 0, sizeof (struct mips_extra_func_info));
+                 memset (e, 0, sizeof (struct mdebug_extra_func_info));
                  SYMBOL_DOMAIN (s) = LABEL_DOMAIN;
                  SYMBOL_CLASS (s) = LOC_CONST;
                  SYMBOL_TYPE (s) = mdebug_type_void;
@@ -3965,7 +3968,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
            /* These are generated by gcc-2.x, do not complain */
            ;
          else
-           complaint (&symfile_complaints, "unknown stabs symbol %s", name);
+           complaint (&symfile_complaints, _("unknown stabs symbol %s"), name);
        }
 
       if (! last_symtab_ended)
@@ -4148,7 +4151,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
          from a shared library, so tell the user only if verbose is on.  */
       if (info_verbose && n_undef_symbols)
        {
-         printf_filtered ("File %s contains %d unresolved references:",
+         printf_filtered (_("File %s contains %d unresolved references:"),
                           st->filename, n_undef_symbols);
          printf_filtered ("\n\t%4d variables\n\t%4d procedures\n\t%4d labels\n",
                           n_undef_vars, n_undef_procs, n_undef_labels);
@@ -4321,7 +4324,7 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_cod
                                      &tir);
          if (tir.tq0 != tqNil)
            complaint (&symfile_complaints,
-                      "illegal tq0 in forward typedef for %s", sym_name);
+                      _("illegal tq0 in forward typedef for %s"), sym_name);
          switch (tir.bt)
            {
            case btVoid:
@@ -4359,7 +4362,7 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_cod
 
            default:
              complaint (&symfile_complaints,
-                        "illegal bt %d in forward typedef for %s", tir.bt,
+                        _("illegal bt %d in forward typedef for %s"), tir.bt,
                         sym_name);
              *tpp = init_type (type_code, 0, 0, (char *) NULL,
                                current_objfile);
@@ -4431,8 +4434,9 @@ mylookup_symbol (char *name, struct block *block,
 /* Add a new symbol S to a block B.  */
 
 static void
-add_symbol (struct symbol *s, struct block *b)
+add_symbol (struct symbol *s, struct symtab *symtab, struct block *b)
 {
+  SYMBOL_SYMTAB (s) = symtab;
   dict_add_symbol (BLOCK_DICT (b), s);
 }
 
@@ -4728,7 +4732,7 @@ elfmdebug_build_psymtabs (struct objfile *objfile,
                         sizeof (struct ecoff_debug_info)));
 
   if (!(*swap->read_debug_info) (abfd, sec, info))
-    error ("Error reading ECOFF debugging information: %s",
+    error (_("Error reading ECOFF debugging information: %s"),
           bfd_errmsg (bfd_get_error ()));
 
   mdebug_build_psymtabs (objfile, swap, info);
@@ -4811,22 +4815,22 @@ _initialize_mdebugread (void)
               "adr_64", (struct objfile *) NULL);
   TYPE_TARGET_TYPE (mdebug_type_adr_64) = mdebug_type_void;
   mdebug_type_float =
-    init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
-              0,
-              "float", (struct objfile *) NULL);
+    init_type (TYPE_CODE_FLT,
+              gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
+              0, "float", (struct objfile *) NULL);
   mdebug_type_double =
-    init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
-              0,
-              "double", (struct objfile *) NULL);
+    init_type (TYPE_CODE_FLT,
+              gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
+              0, "double", (struct objfile *) NULL);
   mdebug_type_complex =
-    init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
-              0,
-              "complex", (struct objfile *) NULL);
+    init_type (TYPE_CODE_COMPLEX,
+              2 * gdbarch_float_bit (current_gdbarch) / TARGET_CHAR_BIT,
+              0, "complex", (struct objfile *) NULL);
   TYPE_TARGET_TYPE (mdebug_type_complex) = mdebug_type_float;
   mdebug_type_double_complex =
-    init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
-              0,
-              "double complex", (struct objfile *) NULL);
+    init_type (TYPE_CODE_COMPLEX,
+              2 * gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
+              0, "double complex", (struct objfile *) NULL);
   TYPE_TARGET_TYPE (mdebug_type_double_complex) = mdebug_type_double;
 
   /* Is a "string" the way btString means it the same as TYPE_CODE_STRING?
@@ -4842,20 +4846,13 @@ _initialize_mdebugread (void)
      TYPE_CODE_ERROR print things in hex if it knows the size?  */
   mdebug_type_fixed_dec =
     init_type (TYPE_CODE_INT,
-              TARGET_INT_BIT / TARGET_CHAR_BIT,
+              gdbarch_int_bit (current_gdbarch) / TARGET_CHAR_BIT,
               0, "fixed decimal",
               (struct objfile *) NULL);
 
   mdebug_type_float_dec =
     init_type (TYPE_CODE_ERROR,
-              TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
+              gdbarch_double_bit (current_gdbarch) / TARGET_CHAR_BIT,
               0, "floating decimal",
               (struct objfile *) NULL);
-
-  nodebug_func_symbol_type = init_type (TYPE_CODE_FUNC, 1, 0,
-                                       "<function, no debug info>", NULL);
-  TYPE_TARGET_TYPE (nodebug_func_symbol_type) = mdebug_type_int;
-  nodebug_var_symbol_type =
-    init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0,
-              "<variable, no debug info>", NULL);
 }
This page took 0.040172 seconds and 4 git commands to generate.