2011-01-05 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / mdebugread.c
index 92557d28bff12f5339083986c733d6e2d71943b5..01e68ab223c62229151a4daf8b970401c8072aab 100644 (file)
@@ -1,7 +1,9 @@
 /* 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
-   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, 2009, 2010,
+   2011 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
    at Cygnus Support.
@@ -10,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,
@@ -19,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
@@ -45,7 +45,6 @@
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "gdbcore.h"
-#include "symfile.h"
 #include "objfiles.h"
 #include "gdb_obstack.h"
 #include "buildsym.h"
 #include "complaints.h"
 #include "demangle.h"
 #include "gdb_assert.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
-
-#ifdef USG
-#include <sys/types.h>
-#endif
-
+#include "block.h"
+#include "dictionary.h"
+#include "mdebugread.h"
 #include "gdb_stat.h"
 #include "gdb_string.h"
+#include "psympriv.h"
 
 #include "bfd.h"
 
@@ -89,7 +68,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);
 
@@ -145,39 +123,40 @@ 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 */
@@ -230,39 +209,6 @@ static int n_undef_symbols, n_undef_labels, n_undef_vars, n_undef_procs;
 
 static char stabs_symbol[] = STABS_SYMBOL;
 
-/* Types corresponding to mdebug format bt* basic types.  */
-
-static struct type *mdebug_type_void;
-static struct type *mdebug_type_char;
-static struct type *mdebug_type_short;
-static struct type *mdebug_type_int_32;
-#define mdebug_type_int mdebug_type_int_32
-static struct type *mdebug_type_int_64;
-static struct type *mdebug_type_long_32;
-static struct type *mdebug_type_long_64;
-static struct type *mdebug_type_long_long_64;
-static struct type *mdebug_type_unsigned_char;
-static struct type *mdebug_type_unsigned_short;
-static struct type *mdebug_type_unsigned_int_32;
-static struct type *mdebug_type_unsigned_int_64;
-static struct type *mdebug_type_unsigned_long_32;
-static struct type *mdebug_type_unsigned_long_64;
-static struct type *mdebug_type_unsigned_long_long_64;
-static struct type *mdebug_type_adr_32;
-static struct type *mdebug_type_adr_64;
-static struct type *mdebug_type_float;
-static struct type *mdebug_type_double;
-static struct type *mdebug_type_complex;
-static struct type *mdebug_type_double_complex;
-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;
@@ -283,9 +229,11 @@ static struct symbol *new_symbol (char *);
 
 static struct type *new_type (char *);
 
-static struct block *new_block (int);
+enum block_type { FUNCTION_BLOCK, NON_FUNCTION_BLOCK };
+
+static struct block *new_block (enum block_type);
 
-static struct symtab *new_symtab (char *, int, int, struct objfile *);
+static struct symtab *new_symtab (const char *, int, struct objfile *);
 
 static struct linetable *new_linetable (int);
 
@@ -294,20 +242,18 @@ static struct blockvector *new_bvect (int);
 static struct type *parse_type (int, union aux_ext *, unsigned int, int *,
                                int, char *);
 
-static struct symbol *mylookup_symbol (char *, struct block *, namespace_enum,
+static struct symbol *mylookup_symbol (char *, struct block *, domain_enum,
                                       enum address_class);
 
-static struct block *shrink_block (struct block *, struct symtab *);
-
 static void sort_blocks (struct symtab *);
 
 static struct partial_symtab *new_psymtab (char *, struct objfile *);
 
-static void psymtab_to_symtab_1 (struct partial_symtab *, char *);
+static void psymtab_to_symtab_1 (struct partial_symtab *, const 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);
 
@@ -318,21 +264,6 @@ static void handle_psymbol_enumerators (struct objfile *, FDR *, int,
 
 static char *mdebug_next_symbol_text (struct objfile *);
 \f
-/* Address bounds for the signal trampoline in inferior, if any */
-
-CORE_ADDR sigtramp_address, sigtramp_end;
-
-/* 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
@@ -341,13 +272,12 @@ xzalloc (unsigned int size)
 static void
 mdebug_psymtab_to_symtab (struct partial_symtab *pst)
 {
-
   if (!pst)
     return;
 
   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);
     }
 
@@ -360,7 +290,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 */
@@ -371,7 +301,7 @@ static FDR *
 get_rfd (int cf, int rf)
 {
   FDR *fdrs;
-  register FDR *f;
+  FDR *f;
   RFDT rfd;
 
   fdrs = debug_info->fdr;
@@ -424,7 +354,7 @@ mdebug_build_psymtabs (struct objfile *objfile,
       char *fdr_end;
       FDR *fdr_ptr;
 
-      info->fdr = (FDR *) obstack_alloc (&objfile->psymbol_obstack,
+      info->fdr = (FDR *) obstack_alloc (&objfile->objfile_obstack,
                                         (info->symbolic_header.ifdMax
                                          * sizeof (FDR)));
       fdr_src = info->external_fdr;
@@ -443,9 +373,11 @@ 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
@@ -482,7 +414,6 @@ static struct parse_stack
 
     int blocktype;
 
-    int maxsyms;               /* Max symbols in this block. */
     struct type *cur_type;     /* Type we parse fields for. */
     int cur_field;             /* Field number in cur_type. */
     CORE_ADDR procadr;         /* Start addres of this procedure */
@@ -507,7 +438,7 @@ push_parse_stack (void)
   /* Initialize new frame with previous content */
   if (top_stack)
     {
-      register struct parse_stack *prev = new->prev;
+      struct parse_stack *prev = new->prev;
 
       *new = *top_stack;
       top_stack->prev = new;
@@ -543,9 +474,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.  */
 
@@ -557,7 +488,7 @@ static struct mdebug_pending *
 is_pending_symbol (FDR *fh, char *sh)
 {
   int f_idx = fh - debug_info->fdr;
-  register struct mdebug_pending *p;
+  struct mdebug_pending *p;
 
   /* Linear search is ok, list is typically no more than 10 deep */
   for (p = pending_list[f_idx]; p; p = p->next)
@@ -578,7 +509,7 @@ add_pending (FDR *fh, char *sh, struct type *t)
   if (!p)
     {
       p = ((struct mdebug_pending *)
-          obstack_alloc (&current_objfile->psymbol_obstack,
+          obstack_alloc (&current_objfile->objfile_obstack,
                          sizeof (struct mdebug_pending)));
       p->s = sh;
       p->t = t;
@@ -599,10 +530,21 @@ add_pending (FDR *fh, char *sh, struct type *t)
    aux symbols are big-endian or little-endian.  Return count of
    SYMR's handled (normally one).  */
 
+static int
+mdebug_reg_to_regnum (struct symbol *sym, struct gdbarch *gdbarch)
+{
+  return gdbarch_ecoff_reg_to_regnum (gdbarch, SYMBOL_VALUE (sym));
+}
+
+static const struct symbol_register_ops mdebug_register_funcs = {
+  mdebug_reg_to_regnum
+};
+
 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;
@@ -669,7 +611,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
          /* It is a FORTRAN common block.  At least for SGI Fortran the
             address is not in the symbol; we need to fix it later in
             scan_file_globals.  */
-         int bucket = hashname (SYMBOL_NAME (s));
+         int bucket = hashname (SYMBOL_LINKAGE_NAME (s));
          SYMBOL_VALUE_CHAIN (s) = global_sym_chain[bucket];
          global_sym_chain[bucket] = s;
        }
@@ -678,26 +620,26 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       goto data;
 
     case stLocal:              /* local variable, goes into current block */
+      b = top_stack->cur_block;
+      s = new_symbol (name);
+      SYMBOL_VALUE (s) = svalue;
       if (sh->sc == scRegister)
        {
          class = LOC_REGISTER;
-         svalue = ECOFF_REG_TO_REGNUM (svalue);
+         SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs;
        }
       else
        class = LOC_LOCAL;
-      b = top_stack->cur_block;
-      s = new_symbol (name);
-      SYMBOL_VALUE (s) = svalue;
 
     data:                      /* Common code for symbols describing data */
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      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) = objfile_type (objfile)->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 */
@@ -713,13 +655,14 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        name = "this";          /* FIXME, not alloc'd in obstack */
       s = new_symbol (name);
 
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      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;
+         SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs;
          break;
        case scVar:
          /* Pass by reference on stack.  */
@@ -728,7 +671,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);
+         SYMBOL_REGISTER_OPS (s) = &mdebug_register_funcs;
          break;
        default:
          /* Pass by value on stack.  */
@@ -737,21 +680,26 @@ 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 */
       s = new_symbol (name);
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;    /* so that it can be used */
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;  /* so that it can be used */
       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);
+      SYMBOL_TYPE (s) = objfile_type (objfile)->builtin_int;
+      add_symbol (s, top_stack->cur_st, top_stack->cur_block);
       break;
 
     case stProc:               /* Procedure, usually goes into global block */
     case stStaticProc:         /* Static procedure, goes into current block */
-      /* Make sure this is a "real" procedure.  Otherwise, skip it.  */
+      /* For stProc symbol records, we need to check the storage class
+         as well, as only (stProc, scText) entries represent "real"
+         procedures - See the Compaq document titled "Object File /
+         Symbol Table Format Specification" for more information.
+         If the storage class is not scText, we discard the whole block
+         of symbol records for this stProc.  */
       if (sh->st == stProc && sh->sc != scText)
         {
           char *ext_tsym = ext_sh;
@@ -772,22 +720,23 @@ 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;
                 }
             }
           break;
         }
       s = new_symbol (name);
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       SYMBOL_CLASS (s) = LOC_BLOCK;
       /* Type of the return value */
       if (SC_IS_UNDEF (sh->sc) || sh->sc == scNil)
-       t = mdebug_type_int;
+       t = objfile_type (objfile)->builtin_int;
       else
        {
          t = parse_type (cur_fd, ax, sh->index + 1, 0, bigend, name);
-         if (STREQ (name, "malloc") && TYPE_CODE (t) == TYPE_CODE_VOID)
+         if (strcmp (name, "malloc") == 0
+             && TYPE_CODE (t) == TYPE_CODE_VOID)
            {
              /* I don't know why, but, at least under Alpha GNU/Linux,
                 when linking against a malloc without debugging
@@ -806,9 +755,10 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       if (sh->st == stProc)
        {
          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,13 +767,18 @@ 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);
 
+      /* All functions in C++ have prototypes.  For C we don't have enough
+         information in the debug info.  */
+      if (SYMBOL_LANGUAGE (s) == language_cplus)
+       TYPE_PROTOTYPED (SYMBOL_TYPE (s)) = 1;
+
       /* Create and enter a new lexical context */
-      b = new_block (top_stack->maxsyms);
+      b = new_block (FUNCTION_BLOCK);
       SYMBOL_BLOCK_VALUE (s) = b;
       BLOCK_FUNCTION (b) = s;
       BLOCK_START (b) = BLOCK_END (b) = sh->value;
@@ -905,9 +860,13 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                    method whose name is identical to the class name
                    (in particular constructor method names are different
                    from the class name).  There is therefore no risk that
-                   this check stops the count on the StEnd of a method.  */
-                if (strcmp (debug_info->ss + cur_fdr->issBase + tsym.iss,
-                            name) == 0)
+                   this check stops the count on the StEnd of a method.
+                  
+                  Also, assume that we're really at the end when tsym.iss
+                  is 0 (issNull).  */
+                if (tsym.iss == issNull
+                   || strcmp (debug_info->ss + cur_fdr->issBase + tsym.iss,
+                               name) == 0)
                   goto end_of_fields;
                 break;
 
@@ -979,7 +938,8 @@ 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);
              }
          }
@@ -1042,8 +1002,8 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        if (sh->iss == 0 || name[0] == '.' || name[0] == '\0')
          TYPE_TAG_NAME (t) = NULL;
        else
-         TYPE_TAG_NAME (t) = obconcat (&current_objfile->symbol_obstack,
-                                       "", "", name);
+         TYPE_TAG_NAME (t) = obconcat (&current_objfile->objfile_obstack,
+                                       name, (char *) NULL);
 
        TYPE_CODE (t) = type_code;
        TYPE_LENGTH (t) = sh->value;
@@ -1068,7 +1028,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)
@@ -1081,33 +1041,32 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                if (tsym.st != stMember)
                  break;
 
-               FIELD_BITPOS (*f) = tsym.value;
+               SET_FIELD_BITPOS (*f, tsym.value);
                FIELD_TYPE (*f) = t;
                FIELD_NAME (*f) = debug_info->ss + cur_fdr->issBase + tsym.iss;
                FIELD_BITSIZE (*f) = 0;
-               FIELD_STATIC_KIND (*f) = 0;
 
                enum_sym = ((struct symbol *)
-                           obstack_alloc (&current_objfile->symbol_obstack,
+                           obstack_alloc (&current_objfile->objfile_obstack,
                                           sizeof (struct symbol)));
                memset (enum_sym, 0, sizeof (struct symbol));
-               SYMBOL_NAME (enum_sym) =
-                 obsavestring (f->name, strlen (f->name),
-                               &current_objfile->symbol_obstack);
+               SYMBOL_SET_LINKAGE_NAME
+                 (enum_sym, obsavestring (f->name, strlen (f->name),
+                                          &current_objfile->objfile_obstack));
                SYMBOL_CLASS (enum_sym) = LOC_CONST;
                SYMBOL_TYPE (enum_sym) = t;
-               SYMBOL_NAMESPACE (enum_sym) = VAR_NAMESPACE;
+               SYMBOL_DOMAIN (enum_sym) = VAR_DOMAIN;
                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++;
                f++;
              }
            if (unsigned_enum)
-             TYPE_FLAGS (t) |= TYPE_FLAG_UNSIGNED;
+             TYPE_UNSIGNED (t) = 1;
          }
        /* make this the current type */
        top_stack->cur_type = t;
@@ -1121,16 +1080,16 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
           do not create a symbol for it either.  */
        if (TYPE_NFIELDS (t) == 0)
          {
-           TYPE_FLAGS (t) |= TYPE_FLAG_STUB;
+           TYPE_STUB (t) = 1;
            break;
          }
 
        s = new_symbol (name);
-       SYMBOL_NAMESPACE (s) = STRUCT_NAMESPACE;
+       SYMBOL_DOMAIN (s) = STRUCT_DOMAIN;
        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
@@ -1154,7 +1113,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
        }
 
       top_stack->blocktype = stBlock;
-      b = new_block (top_stack->maxsyms);
+      b = new_block (NON_FUNCTION_BLOCK);
       BLOCK_START (b) = sh->value + top_stack->procadr;
       BLOCK_SUPERBLOCK (b) = top_stack->cur_block;
       top_stack->cur_block = b;
@@ -1173,35 +1132,33 @@ 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 block *b;
+         struct mdebug_extra_func_info *e;
+         struct block *b = top_stack->cur_block;
          struct type *ftype = top_stack->cur_type;
          int i;
 
          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);
-         SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
+         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 *)
-              obstack_alloc (&current_objfile->symbol_obstack,
-                             sizeof (struct mips_extra_func_info)));
-         memset (e, 0, sizeof (struct mips_extra_func_info));
-         SYMBOL_VALUE (s) = (long) e;
+         SYMBOL_TYPE (s) = objfile_type (current_objfile)->builtin_void;
+         e = ((struct mdebug_extra_func_info *)
+              obstack_alloc (&current_objfile->objfile_obstack,
+                             sizeof (struct mdebug_extra_func_info)));
+         memset (e, 0, sizeof (struct mdebug_extra_func_info));
+         SYMBOL_VALUE_BYTES (s) = (gdb_byte *) e;
          e->numargs = top_stack->numargs;
          e->pdr.framereg = -1;
-         add_symbol (s, top_stack->cur_block);
-
-         /* Reallocate symbols, saving memory */
-         b = shrink_block (top_stack->cur_block, top_stack->cur_st);
+         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.  */
          for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
            {
              struct block *b_bad = BLOCKVECTOR_BLOCK (bv, i);
+
              if (BLOCK_SUPERBLOCK (b_bad) == b
                  && BLOCK_START (b_bad) == top_stack->procadr
                  && BLOCK_END (b_bad) == top_stack->procadr)
@@ -1221,25 +1178,23 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
 
              if (nparams > 0)
                {
+                 struct dict_iterator iter;
+
                  TYPE_NFIELDS (ftype) = nparams;
                  TYPE_FIELDS (ftype) = (struct field *)
                    TYPE_ALLOC (ftype, nparams * sizeof (struct field));
 
-                 for (i = iparams = 0; iparams < nparams; i++)
+                 iparams = 0;
+                 ALL_BLOCK_SYMBOLS (b, iter, sym)
                    {
-                     sym = BLOCK_SYM (b, i);
-                     switch (SYMBOL_CLASS (sym))
+                     if (iparams == nparams)
+                       break;
+
+                     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;
                        }
                    }
                }
@@ -1251,7 +1206,6 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
             displacement from the procedure`s start 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 == stNil)
        {
@@ -1267,7 +1221,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;
@@ -1275,11 +1229,11 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
     case stMember:             /* member of struct or union */
       f = &TYPE_FIELDS (top_stack->cur_type)[top_stack->cur_field++];
       FIELD_NAME (*f) = name;
-      FIELD_BITPOS (*f) = sh->value;
+      SET_FIELD_BITPOS (*f, sh->value);
       bitsize = 0;
-      FIELD_TYPE (*f) = parse_type (cur_fd, ax, sh->index, &bitsize, bigend, name);
+      FIELD_TYPE (*f) = parse_type (cur_fd, ax, sh->index,
+                                   &bitsize, bigend, name);
       FIELD_BITSIZE (*f) = bitsize;
-      FIELD_STATIC_KIND (*f) = 0;
       break;
 
     case stIndirect:           /* forward declaration on Irix5 */
@@ -1327,11 +1281,11 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
       if (has_opaque_xref (cur_fdr, sh))
        break;
       s = new_symbol (name);
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       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
@@ -1362,7 +1316,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
                 for anything except pointers or functions.  */
            }
          else
-           TYPE_NAME (SYMBOL_TYPE (s)) = SYMBOL_NAME (s);
+           TYPE_NAME (SYMBOL_TYPE (s)) = SYMBOL_LINKAGE_NAME (s);
        }
       break;
 
@@ -1379,13 +1333,186 @@ 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;
     }
 
   return count;
 }
 
+/* Basic types.  */
+
+static const struct objfile_data *basic_type_data;
+
+static struct type *
+basic_type (int bt, struct objfile *objfile)
+{
+  struct gdbarch *gdbarch = get_objfile_arch (objfile);
+  struct type **map_bt = objfile_data (objfile, basic_type_data);
+  struct type *tp;
+
+  if (bt >= btMax)
+    return NULL;
+
+  if (!map_bt)
+    {
+      map_bt = OBSTACK_CALLOC (&objfile->objfile_obstack,
+                              btMax, struct type *);
+      set_objfile_data (objfile, basic_type_data, map_bt);
+    }
+
+  if (map_bt[bt])
+    return map_bt[bt];
+
+  switch (bt)
+    {
+    case btNil:
+      tp = objfile_type (objfile)->builtin_void;
+      break;
+
+    case btAdr:
+      tp = init_type (TYPE_CODE_PTR, 4, TYPE_FLAG_UNSIGNED,
+                     "adr_32", objfile);
+      TYPE_TARGET_TYPE (tp) = objfile_type (objfile)->builtin_void;
+      break;
+
+    case btChar:
+      tp = init_type (TYPE_CODE_INT, 1, 0,
+                     "char", objfile);
+      break;
+
+    case btUChar:
+      tp = init_type (TYPE_CODE_INT, 1, TYPE_FLAG_UNSIGNED,
+                     "unsigned char", objfile);
+      break;
+
+    case btShort:
+      tp = init_type (TYPE_CODE_INT, 2, 0,
+                     "short", objfile);
+      break;
+
+    case btUShort:
+      tp = init_type (TYPE_CODE_INT, 2, TYPE_FLAG_UNSIGNED,
+                     "unsigned short", objfile);
+      break;
+
+    case btInt:
+      tp = init_type (TYPE_CODE_INT, 4, 0,
+                     "int", objfile);
+      break;
+
+   case btUInt:
+      tp = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED,
+                     "unsigned int", objfile);
+      break;
+
+    case btLong:
+      tp = init_type (TYPE_CODE_INT, 4, 0,
+                     "long", objfile);
+      break;
+
+    case btULong:
+      tp = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED,
+                     "unsigned long", objfile);
+      break;
+
+    case btFloat:
+      tp = init_type (TYPE_CODE_FLT,
+                     gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT, 0,
+                     "float", objfile);
+      break;
+
+    case btDouble:
+      tp = init_type (TYPE_CODE_FLT,
+                     gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT, 0,
+                     "double", objfile);
+      break;
+
+    case btComplex:
+      tp = init_type (TYPE_CODE_COMPLEX,
+                     2 * gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT, 0,
+                     "complex", objfile);
+      TYPE_TARGET_TYPE (tp) = basic_type (btFloat, objfile);
+      break;
+
+    case btDComplex:
+      tp = init_type (TYPE_CODE_COMPLEX,
+                     2 * gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT, 0,
+                     "double complex", objfile);
+      TYPE_TARGET_TYPE (tp) = basic_type (btDouble, objfile);
+      break;
+
+    case btFixedDec:
+      /* We use TYPE_CODE_INT to print these as integers.  Does this do any
+        good?  Would we be better off with TYPE_CODE_ERROR?  Should
+        TYPE_CODE_ERROR print things in hex if it knows the size?  */
+      tp = init_type (TYPE_CODE_INT,
+                     gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT, 0,
+                     "fixed decimal", objfile);
+      break;
+
+    case btFloatDec:
+      tp = init_type (TYPE_CODE_ERROR,
+                     gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT, 0,
+                     "floating decimal", objfile);
+      break;
+
+    case btString:
+      /* Is a "string" the way btString means it the same as TYPE_CODE_STRING?
+        FIXME.  */
+      tp = init_type (TYPE_CODE_STRING, 1, 0,
+                     "string", objfile);
+      break;
+
+    case btVoid:
+      tp = objfile_type (objfile)->builtin_void;
+      break;
+
+    case btLong64:
+      tp = init_type (TYPE_CODE_INT, 8, 0,
+                     "long", objfile);
+      break;
+
+    case btULong64:
+      tp = init_type (TYPE_CODE_INT, 8, TYPE_FLAG_UNSIGNED,
+                     "unsigned long", objfile);
+      break;
+
+    case btLongLong64:
+      tp = init_type (TYPE_CODE_INT, 8, 0,
+                     "long long", objfile);
+      break;
+
+    case btULongLong64:
+      tp = init_type (TYPE_CODE_INT, 8, TYPE_FLAG_UNSIGNED,
+                     "unsigned long long", objfile);
+      break;
+
+    case btAdr64:
+      tp = init_type (TYPE_CODE_PTR, 8, TYPE_FLAG_UNSIGNED,
+                     "adr_64", objfile);
+      TYPE_TARGET_TYPE (tp) = objfile_type (objfile)->builtin_void;
+      break;
+
+    case btInt64:
+      tp = init_type (TYPE_CODE_INT, 8, 0,
+                     "int", objfile);
+      break;
+
+    case btUInt64:
+      tp = init_type (TYPE_CODE_INT, 8, TYPE_FLAG_UNSIGNED,
+                     "unsigned int", objfile);
+      break;
+
+    default:
+      tp = NULL;
+      break;
+    }
+
+  map_bt[bt] = tp;
+  return tp;
+}
+
 /* Parse the type information provided in the raw AX entries for
    the symbol SH. Return the bitfield size in BS, in case.
    We must byte-swap the AX entries before we use them; BIGEND says whether
@@ -1395,78 +1522,27 @@ static struct type *
 parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
            int bigend, char *sym_name)
 {
-  /* Null entries in this map are treated specially */
-  static struct type **map_bt[] =
-  {
-    &mdebug_type_void,         /* btNil */
-    &mdebug_type_adr_32,       /* btAdr */
-    &mdebug_type_char,         /* btChar */
-    &mdebug_type_unsigned_char,        /* btUChar */
-    &mdebug_type_short,                /* btShort */
-    &mdebug_type_unsigned_short,       /* btUShort */
-    &mdebug_type_int_32,       /* btInt */
-    &mdebug_type_unsigned_int_32,      /* btUInt */
-    &mdebug_type_long_32,      /* btLong */
-    &mdebug_type_unsigned_long_32,     /* btULong */
-    &mdebug_type_float,                /* btFloat */
-    &mdebug_type_double,       /* btDouble */
-    0,                         /* btStruct */
-    0,                         /* btUnion */
-    0,                         /* btEnum */
-    0,                         /* btTypedef */
-    0,                         /* btRange */
-    0,                         /* btSet */
-    &mdebug_type_complex,      /* btComplex */
-    &mdebug_type_double_complex,       /* btDComplex */
-    0,                         /* btIndirect */
-    &mdebug_type_fixed_dec,    /* btFixedDec */
-    &mdebug_type_float_dec,    /* btFloatDec */
-    &mdebug_type_string,       /* btString */
-    0,                         /* btBit */
-    0,                         /* btPicture */
-    &mdebug_type_void,         /* btVoid */
-    0,                         /* DEC C++:  Pointer to member */
-    0,                         /* DEC C++:  Virtual function table */
-    0,                         /* DEC C++:  Class (Record) */
-    &mdebug_type_long_64,      /* btLong64  */
-    &mdebug_type_unsigned_long_64,     /* btULong64 */
-    &mdebug_type_long_long_64, /* btLongLong64  */
-    &mdebug_type_unsigned_long_long_64,                /* btULongLong64 */
-    &mdebug_type_adr_64,       /* btAdr64 */
-    &mdebug_type_int_64,       /* btInt64  */
-    &mdebug_type_unsigned_int_64,      /* btUInt64 */
-  };
-
   TIR t[1];
   struct type *tp = 0;
   enum type_code type_code = TYPE_CODE_UNDEF;
 
   /* Handle undefined types, they have indexNil. */
   if (aux_index == indexNil)
-    return mdebug_type_int;
+    return basic_type (btInt, current_objfile);
 
   /* Handle corrupt aux indices.  */
   if (aux_index >= (debug_info->fdr + fd)->caux)
     {
       index_complaint (sym_name);
-      return mdebug_type_int;
+      return basic_type (btInt, current_objfile);
     }
   ax += aux_index;
 
   /* Use aux as a type information record, map its basic type.  */
   (*debug_swap->swap_tir_in) (bigend, &ax->a_ti, t);
-  if (t->bt >= (sizeof (map_bt) / sizeof (*map_bt)))
-    {
-      basic_type_complaint (t->bt, sym_name);
-      return mdebug_type_int;
-    }
-  if (map_bt[t->bt])
+  tp = basic_type (t->bt, current_objfile);
+  if (tp == NULL)
     {
-      tp = *map_bt[t->bt];
-    }
-  else
-    {
-      tp = NULL;
       /* Cannot use builtin types -- build our own */
       switch (t->bt)
        {
@@ -1497,7 +1573,7 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
          break;
        default:
          basic_type_complaint (t->bt, sym_name);
-         return mdebug_type_int;
+         return basic_type (btInt, current_objfile);
        }
     }
 
@@ -1508,21 +1584,21 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
     {
       int width = AUX_GET_WIDTH (bigend, ax);
 
-      /* Inhibit core dumps with some cfront generated objects that
-         corrupt the TIR.  */
+      /* Inhibit core dumps if TIR is corrupted.  */
       if (bs == (int *) NULL)
        {
          /* Alpha cc -migrate encodes char and unsigned char types
             as short and unsigned short types with a field width of 8.
             Enum types also have a field width which we ignore for now.  */
          if (t->bt == btShort && width == 8)
-           tp = mdebug_type_char;
+           tp = basic_type (btChar, current_objfile);
          else if (t->bt == btUShort && width == 8)
-           tp = mdebug_type_unsigned_char;
+           tp = basic_type (btUChar, current_objfile);
          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
@@ -1552,8 +1628,8 @@ 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);
-         return mdebug_type_int;
+                    _("unable to cross ref btIndirect for %s"), sym_name);
+         return basic_type (btInt, current_objfile);
        }
       xref_fh = get_rfd (fd, rf);
       xref_fd = xref_fh - debug_info->fdr;
@@ -1596,7 +1672,6 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
        }
       else
        {
-
          /* Usually, TYPE_CODE(tp) is already type_code.  The main
             exception is if we guessed wrong re struct/union/enum.
             But for struct vs. union a wrong guess is harmless, so
@@ -1619,9 +1694,10 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
          if (name[0] == '.' || name[0] == '\0')
            TYPE_TAG_NAME (tp) = NULL;
          else if (TYPE_TAG_NAME (tp) == NULL
-                  || !STREQ (TYPE_TAG_NAME (tp), name))
-           TYPE_TAG_NAME (tp) = obsavestring (name, strlen (name),
-                                           &current_objfile->type_obstack);
+                  || strcmp (TYPE_TAG_NAME (tp), name) != 0)
+           TYPE_TAG_NAME (tp)
+             = obsavestring (name, strlen (name),
+                             &current_objfile->objfile_obstack);
        }
     }
 
@@ -1654,9 +1730,10 @@ parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
              bad_tag_guess_complaint (sym_name);
              TYPE_CODE (tp) = type_code;
            }
-         if (TYPE_NAME (tp) == NULL || !STREQ (TYPE_NAME (tp), name))
+         if (TYPE_NAME (tp) == NULL
+             || strcmp (TYPE_NAME (tp), name) != 0)
            TYPE_NAME (tp) = obsavestring (name, strlen (name),
-                                          &current_objfile->type_obstack);
+                                          &current_objfile->objfile_obstack);
        }
     }
   if (t->bt == btTypedef)
@@ -1668,24 +1745,20 @@ 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);
-         tp = mdebug_type_int;
+                    _("unable to cross ref btTypedef for %s"), sym_name);
+         tp = basic_type (btInt, current_objfile);
        }
     }
 
   /* Deal with range types */
   if (t->bt == btRange)
     {
-      TYPE_NFIELDS (tp) = 2;
-      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);
+      TYPE_NFIELDS (tp) = 0;
+      TYPE_RANGE_DATA (tp) = ((struct range_bounds *)
+                         TYPE_ZALLOC (tp, sizeof (struct range_bounds)));
+      TYPE_LOW_BOUND (tp) = AUX_GET_DNLOW (bigend, ax);
       ax++;
-      TYPE_FIELD_NAME (tp, 1) = obsavestring ("High", strlen ("High"),
-                                           &current_objfile->type_obstack);
-      TYPE_FIELD_BITPOS (tp, 1) = AUX_GET_DNHIGH (bigend, ax);
+      TYPE_HIGH_BOUND (tp) = AUX_GET_DNHIGH (bigend, ax);
       ax++;
     }
 
@@ -1718,7 +1791,8 @@ 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;
 }
@@ -1781,8 +1855,9 @@ 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);
-         indx = mdebug_type_int;
+                    _("illegal array index type for %s, assuming int"),
+                    sym_name);
+         indx = objfile_type (current_objfile)->builtin_int;
        }
 
       /* Get the bounds, and create the array type.  */
@@ -1812,12 +1887,9 @@ upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend,
          ignore the erroneous bitsize from the auxiliary entry safely.
          dbx seems to ignore it too.  */
 
-      /* TYPE_FLAG_TARGET_STUB now takes care of the zero TYPE_LENGTH
-         problem.  */
+      /* TYPE_TARGET_STUB now takes care of the zero TYPE_LENGTH problem.  */
       if (TYPE_LENGTH (*tpp) == 0)
-       {
-         TYPE_FLAGS (t) |= TYPE_FLAG_TARGET_STUB;
-       }
+       TYPE_TARGET_STUB (t) = 1;
 
       *tpp = t;
       return 4 + off;
@@ -1831,7 +1903,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;
     }
 }
@@ -1839,13 +1911,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 *);
@@ -1856,7 +1928,6 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
 {
   struct symbol *s, *i;
   struct block *b;
-  struct mips_extra_func_info *e;
   char *sh_name;
 
   /* Simple rule to find files linked "-x" */
@@ -1867,7 +1938,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;
        }
@@ -1908,19 +1979,20 @@ 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_NAMESPACE, 0, NULL);
+
+      s = lookup_symbol (sh_name, NULL, VAR_DOMAIN, 0);
       cur_fdr = save_cur_fdr;
 #else
       s = mylookup_symbol
        (sh_name,
         BLOCKVECTOR_BLOCK (BLOCKVECTOR (search_symtab), STATIC_BLOCK),
-        VAR_NAMESPACE,
+        VAR_DOMAIN,
         LOC_BLOCK);
 #endif
     }
   else
     s = mylookup_symbol (sh_name, top_stack->cur_block,
-                        VAR_NAMESPACE, LOC_BLOCK);
+                        VAR_DOMAIN, LOC_BLOCK);
 
   if (s != 0)
     {
@@ -1928,17 +2000,18 @@ 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
 /* FIXME -- delete.  We can't do symbol allocation now; it's all done.  */
       s = new_symbol (sh_name);
-      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
+      SYMBOL_DOMAIN (s) = VAR_DOMAIN;
       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);
+      SYMBOL_TYPE (s)
+       = lookup_function_type (objfile_type (pst->objfile)->builtin_int);
+      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;
@@ -1952,13 +2025,14 @@ parse_procedure (PDR *pr, struct symtab *search_symtab,
 #endif
     }
 
-  i = mylookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, 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);
+      struct mdebug_extra_func_info *e;
+      
+      e = (struct mdebug_extra_func_info *) SYMBOL_VALUE_BYTES (i);
       e->pdr = *pr;
-      e->pdr.isym = (long) s;
 
       /* GDB expects the absolute function start address for the
          procedure descriptor in e->pdr.adr.
@@ -1971,16 +2045,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 && STREQ (sh_name, "setjmp"))
-       {
-         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
@@ -2001,19 +2065,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) = objfile_type (pst->objfile)->nodebug_text_symbol;
 }
 
 /* Parse the external symbol ES. Just call parse_symbol() after
@@ -2073,7 +2125,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;
@@ -2102,7 +2154,8 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets,
 
       /* Note that the case of a symbol with indexNil must be handled
          anyways by parse_symbol().  */
-      parse_symbol (&es->asym, ax, (char *) NULL, bigend, section_offsets, objfile);
+      parse_symbol (&es->asym, ax, (char *) NULL,
+                   bigend, section_offsets, objfile);
       break;
     default:
       break;
@@ -2174,7 +2227,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;
            }
@@ -2188,16 +2241,97 @@ 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,
+                                       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;
@@ -2211,7 +2345,7 @@ parse_partial_symbols (struct objfile *objfile)
   char *ext_out;
   char *ext_out_end;
   EXTR *ext_block;
-  register EXTR *ext_in;
+  EXTR *ext_in;
   EXTR *ext_in_end;
   SYMR sh;
   struct partial_symtab *pst;
@@ -2244,7 +2378,7 @@ parse_partial_symbols (struct objfile *objfile)
       && (bfd_get_section_flags (cur_bfd, text_sect) & SEC_RELOC))
     relocatable = 1;
 
-  extern_tab = (EXTR *) obstack_alloc (&objfile->psymbol_obstack,
+  extern_tab = (EXTR *) obstack_alloc (&objfile->objfile_obstack,
                                       sizeof (EXTR) * hdr->iextMax);
 
   includes_allocated = 30;
@@ -2276,11 +2410,13 @@ parse_partial_symbols (struct objfile *objfile)
   /* Allocate the map FDR -> PST.
      Minor hack: -O3 images might claim some global data belongs
      to FDR -1. We`ll go along with that */
-  fdr_to_pst = (struct pst_map *) xzalloc ((hdr->ifdMax + 1) * sizeof *fdr_to_pst);
+  fdr_to_pst = (struct pst_map *)
+    xzalloc ((hdr->ifdMax + 1) * sizeof *fdr_to_pst);
   old_chain = make_cleanup (xfree, fdr_to_pst);
   fdr_to_pst++;
   {
     struct partial_symtab *pst = new_psymtab ("", objfile);
+
     fdr_to_pst[-1].pst = pst;
     FDR_IDX (pst) = -1;
   }
@@ -2288,7 +2424,7 @@ parse_partial_symbols (struct objfile *objfile)
   /* Allocate the global pending list.  */
   pending_list =
     ((struct mdebug_pending **)
-     obstack_alloc (&objfile->psymbol_obstack,
+     obstack_alloc (&objfile->objfile_obstack,
                    hdr->ifdMax * sizeof (struct mdebug_pending *)));
   memset (pending_list, 0,
          hdr->ifdMax * sizeof (struct mdebug_pending *));
@@ -2369,14 +2505,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,
-                    hdr->ifdMax);
+                    _("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;
        }
@@ -2397,12 +2533,14 @@ parse_partial_symbols (struct objfile *objfile)
        {
        case stProc:
          /* Beginnning of Procedure */
-         svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+         svalue += ANOFFSET (objfile->section_offsets,
+                             SECT_OFF_TEXT (objfile));
          break;
        case stStaticProc:
          /* Load time only static procs */
          ms_type = mst_file_text;
-         svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+         svalue += ANOFFSET (objfile->section_offsets,
+                             SECT_OFF_TEXT (objfile));
          break;
        case stGlobal:
          /* External symbol */
@@ -2415,12 +2553,14 @@ parse_partial_symbols (struct objfile *objfile)
          else if (SC_IS_DATA (ext_in->asym.sc))
            {
              ms_type = mst_data;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+             svalue += ANOFFSET (objfile->section_offsets,
+                                 SECT_OFF_DATA (objfile));
            }
          else if (SC_IS_BSS (ext_in->asym.sc))
            {
              ms_type = mst_bss;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
+             svalue += ANOFFSET (objfile->section_offsets,
+                                 SECT_OFF_BSS (objfile));
            }
           else if (SC_IS_SBSS (ext_in->asym.sc))
             {
@@ -2460,7 +2600,8 @@ parse_partial_symbols (struct objfile *objfile)
                 continue;
                 
              ms_type = mst_file_text;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+             svalue += ANOFFSET (objfile->section_offsets,
+                                 SECT_OFF_TEXT (objfile));
            }
          else if (SC_IS_DATA (ext_in->asym.sc))
            {
@@ -2468,7 +2609,8 @@ parse_partial_symbols (struct objfile *objfile)
                 continue;
 
              ms_type = mst_file_data;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+             svalue += ANOFFSET (objfile->section_offsets,
+                                 SECT_OFF_DATA (objfile));
            }
          else if (SC_IS_BSS (ext_in->asym.sc))
            {
@@ -2476,7 +2618,8 @@ parse_partial_symbols (struct objfile *objfile)
                 continue;
 
              ms_type = mst_file_bss;
-             svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
+             svalue += ANOFFSET (objfile->section_offsets,
+                                 SECT_OFF_BSS (objfile));
            }
           else if (SC_IS_SBSS (ext_in->asym.sc))
             {
@@ -2506,7 +2649,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 */
@@ -2530,7 +2674,8 @@ parse_partial_symbols (struct objfile *objfile)
        {
          textlow = fh->adr;
          if (relocatable || textlow != 0)
-           textlow += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+           textlow += ANOFFSET (objfile->section_offsets,
+                                SECT_OFF_TEXT (objfile));
        }
       else
        textlow = 0;
@@ -2539,9 +2684,8 @@ parse_partial_symbols (struct objfile *objfile)
                                  textlow,
                                  objfile->global_psymbols.next,
                                  objfile->static_psymbols.next);
-      pst->read_symtab_private = ((char *)
-                                 obstack_alloc (&objfile->psymbol_obstack,
-                                                sizeof (struct symloc)));
+      pst->read_symtab_private = obstack_alloc (&objfile->objfile_obstack,
+                                               sizeof (struct symloc));
       memset (pst->read_symtab_private, 0, sizeof (struct symloc));
 
       save_pst = pst;
@@ -2595,7 +2739,8 @@ parse_partial_symbols (struct objfile *objfile)
                          ((char *) debug_info->external_sym
                           + (fh->isymBase + 1) * external_sym_size),
                          &sh);
-         if (STREQ (debug_info->ss + fh->issBase + sh.iss, stabs_symbol))
+         if (strcmp (debug_info->ss + fh->issBase + sh.iss,
+                     stabs_symbol) == 0)
            processing_gcc_compilation = 2;
        }
 
@@ -2618,17 +2763,14 @@ parse_partial_symbols (struct objfile *objfile)
                      CORE_ADDR procaddr;
                      long isym;
 
-                     sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+                     sh.value += ANOFFSET (objfile->section_offsets,
+                                           SECT_OFF_TEXT (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;
 
@@ -2669,28 +2811,22 @@ parse_partial_symbols (struct objfile *objfile)
                        case scPData:
                        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);
+                         sh.value += ANOFFSET (objfile->section_offsets,
+                                               SECT_OFF_DATA (objfile));
+                          record_minimal_symbol (namestring, sh.value,
+                                                 mst_file_data, sh.sc,
+                                                 objfile);
                          break;
 
                        default:
                          /* FIXME!  Shouldn't this use cases for bss, 
                             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);
+                         sh.value += ANOFFSET (objfile->section_offsets,
+                                               SECT_OFF_BSS (objfile));
+                          record_minimal_symbol (namestring, sh.value,
+                                                 mst_file_bss, sh.sc,
+                                                 objfile);
                          break;
                        }
                    }
@@ -2700,6 +2836,7 @@ parse_partial_symbols (struct objfile *objfile)
              {
                char *stabstring = debug_info->ss + fh->issBase + sh.iss;
                int len = strlen (stabstring);
+
                while (stabstring[len - 1] == '\\')
                  {
                    SYMR sh2;
@@ -2736,25 +2873,27 @@ parse_partial_symbols (struct objfile *objfile)
                switch (type_code)
                  {
                    char *p;
-                   /*
-                    * Standard, external, non-debugger, symbols
-                    */
+
+                   /* Standard, external, non-debugger, symbols.  */
 
                  case N_TEXT | N_EXT:
                  case N_NBTEXT | N_EXT:
-                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+                   sh.value += ANOFFSET (objfile->section_offsets,
+                                         SECT_OFF_TEXT (objfile));
                    goto record_it;
 
                  case N_DATA | N_EXT:
                  case N_NBDATA | N_EXT:
-                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+                   sh.value += ANOFFSET (objfile->section_offsets,
+                                         SECT_OFF_DATA (objfile));
                    goto record_it;
 
                  case N_BSS:
                  case N_BSS | N_EXT:
                  case N_NBBSS | N_EXT:
                  case N_SETV | N_EXT:          /* FIXME, is this in BSS? */
-                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
+                   sh.value += ANOFFSET (objfile->section_offsets,
+                                         SECT_OFF_BSS (objfile));
                    goto record_it;
 
                  case N_ABS | N_EXT:
@@ -2765,10 +2904,11 @@ parse_partial_symbols (struct objfile *objfile)
 
                  case N_NBTEXT:
 
-                   /* We need to be able to deal with both N_FN or N_TEXT,
-                      because we have no way of knowing whether the sys-supplied ld
-                      or GNU ld was used to make the executable.  Sequents throw
-                      in another wrinkle -- they renumbered N_FN.  */
+                   /* We need to be able to deal with both N_FN or
+                      N_TEXT, because we have no way of knowing
+                      whether the sys-supplied ld or GNU ld was used
+                      to make the executable.  Sequents throw in
+                      another wrinkle -- they renumbered N_FN.  */
 
                  case N_FN:
                  case N_FN_SEQ:
@@ -2776,11 +2916,12 @@ parse_partial_symbols (struct objfile *objfile)
                    continue;
 
                  case N_DATA:
-                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+                   sh.value += ANOFFSET (objfile->section_offsets,
+                                         SECT_OFF_DATA (objfile));
                    goto record_it;
 
                  case N_UNDF | N_EXT:
-                   continue;                   /* Just undefined, not COMMON */
+                   continue;           /* Just undefined, not COMMON */
 
                  case N_UNDF:
                    continue;
@@ -2822,29 +2963,28 @@ parse_partial_symbols (struct objfile *objfile)
                      char *p;
                      int prev_textlow_not_set;
 
-                     valu = sh.value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+                     valu = sh.value + ANOFFSET (objfile->section_offsets,
+                                                 SECT_OFF_TEXT (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.  */
+                     /* 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)
-                       {                       /* Here if prev stab wasn't N_SO */
+                       {               /* Here if prev stab wasn't N_SO */
                          first_so_symnum = symnum;
 
                          if (pst)
@@ -2862,22 +3002,26 @@ parse_partial_symbols (struct objfile *objfile)
                      /* SET_NAMESTRING ();*/
                      namestring = stabstring;
 
-                     /* Null name means end of .o file.  Don't start a new one. */
+                     /* Null name means end of .o file.  Don't start a new
+                        one. */
                      if (*namestring == '\000')
                        continue;
 
-                     /* Some compilers (including gcc) emit a pair of initial N_SOs.
-                        The first one is a directory name; the second the file name.
-                        If pst exists, is empty, and has a filename ending in '/',
-                        we assume the previous N_SO was a directory name. */
+                     /* Some compilers (including gcc) emit a pair of
+                        initial N_SOs.  The first one is a directory name;
+                        the second the file name.  If pst exists, is
+                        empty, and has a filename ending in '/', we assume
+                        the previous N_SO was a directory name. */
 
                      p = strrchr (namestring, '/');
                      if (p && *(p + 1) == '\000')
-                       continue;               /* Simply ignore directory name SOs */
+                       continue;               /* Simply ignore directory
+                                                  name SOs */
 
-                     /* Some other compilers (C++ ones in particular) emit useless
-                        SOs for non-existant .c files.  We ignore all subsequent SOs that
-                        immediately follow the first.  */
+                     /* Some other compilers (C++ ones in particular) emit
+                        useless SOs for non-existant .c files.  We ignore
+                        all subsequent SOs that immediately follow the
+                        first.  */
 
                      if (!pst)
                        pst = save_pst;
@@ -2890,38 +3034,46 @@ parse_partial_symbols (struct objfile *objfile)
                  case N_SOL:
                    {
                      enum language tmp_language;
+
                      /* Mark down an include file in the current psymtab */
 
                      /* SET_NAMESTRING ();*/
                      namestring = stabstring;
 
-                     tmp_language = deduce_language_from_filename (namestring);
+                     tmp_language
+                       = deduce_language_from_filename (namestring);
 
-                     /* Only change the psymtab's language if we've learned
-                        something useful (eg. tmp_language is not language_unknown).
-                        In addition, to match what start_subfile does, never change
-                        from C++ to C.  */
+                     /* Only change the psymtab's language if we've
+                        learned something useful (eg. tmp_language is not
+                        language_unknown).  In addition, to match what
+                        start_subfile does, never change from C++ to
+                        C.  */
                      if (tmp_language != language_unknown
                          && (tmp_language != language_c
                              || psymtab_language != language_cplus))
                        psymtab_language = tmp_language;
 
-                     /* In C++, one may expect the same filename to come round many
-                        times, when code is coming alternately from the main file
-                        and from inline functions in other files. So I check to see
-                        if this is a file we've seen before -- either the main
-                        source file, or a previously included file.
-
-                        This seems to be a lot of time to be spending on N_SOL, but
-                        things like "break c-exp.y:435" need to work (I
-                        suppose the psymtab_include_list could be hashed or put
-                        in a binary tree, if profiling shows this is a major hog).  */
-                     if (pst && STREQ (namestring, pst->filename))
+                     /* In C++, one may expect the same filename to come
+                        round many times, when code is coming alternately
+                        from the main file and from inline functions in
+                        other files. So I check to see if this is a file
+                        we've seen before -- either the main source file,
+                        or a previously included file.
+
+                        This seems to be a lot of time to be spending on
+                        N_SOL, but things like "break c-exp.y:435" need to
+                        work (I suppose the psymtab_include_list could be
+                        hashed or put in a binary tree, if profiling shows
+                        this is a major hog).  */
+                     if (pst && strcmp (namestring, pst->filename) == 0)
                        continue;
+
                      {
-                       register int i;
+                       int i;
+
                        for (i = 0; i < includes_used; i++)
-                         if (STREQ (namestring, psymtab_include_list[i]))
+                         if (strcmp (namestring,
+                                     psymtab_include_list[i]) == 0)
                            {
                              i = -1;
                              break;
@@ -2938,63 +3090,69 @@ parse_partial_symbols (struct objfile *objfile)
                          psymtab_include_list = (char **)
                            alloca ((includes_allocated *= 2) *
                                    sizeof (char *));
-                         memcpy ((PTR) psymtab_include_list, (PTR) orig,
+                         memcpy (psymtab_include_list, orig,
                                  includes_used * sizeof (char *));
                        }
                      continue;
                    }
-                 case N_LSYM:                  /* Typedef or automatic variable. */
-                 case N_STSYM:         /* Data seg var -- static  */
-                 case N_LCSYM:         /* BSS      "  */
-                 case N_ROSYM:         /* Read-only data seg var -- static.  */
-                 case N_NBSTS:         /* Gould nobase.  */
-                 case N_NBLCS:         /* symbols.  */
+                 case N_LSYM:      /* Typedef or automatic variable. */
+                 case N_STSYM:     /* Data seg var -- static  */
+                 case N_LCSYM:     /* BSS      "  */
+                 case N_ROSYM:     /* Read-only data seg var -- static.  */
+                 case N_NBSTS:     /* Gould nobase.  */
+                 case N_NBLCS:     /* symbols.  */
                  case N_FUN:
-                 case N_GSYM:                  /* Global (extern) variable; can be
-                                                  data or bss (sigh FIXME).  */
+                 case N_GSYM:      /* Global (extern) variable; can be
+                                      data or bss (sigh FIXME).  */
 
                    /* Following may probably be ignored; I'll leave them here
                       for now (until I do Pascal and Modula 2 extensions).  */
 
-                 case N_PC:                    /* I may or may not need this; I
-                                                  suspect not.  */
-                 case N_M2C:                   /* I suspect that I can ignore this here. */
-                 case N_SCOPE:         /* Same.   */
+                 case N_PC:        /* I may or may not need this; I
+                                      suspect not.  */
+                 case N_M2C:       /* I suspect that I can ignore this
+                                      here. */
+                 case N_SCOPE:     /* Same.   */
 
                    /*    SET_NAMESTRING ();*/
                    namestring = stabstring;
                    p = (char *) strchr (namestring, ':');
                    if (!p)
-                     continue;                 /* Not a debugging symbol.   */
+                     continue;     /* Not a debugging symbol.   */
 
 
 
                    /* Main processing section for debugging symbols which
-                      the initial read through the symbol tables needs to worry
-                      about.  If we reach this point, the symbol which we are
-                      considering is definitely one we are interested in.
-                      p must also contain the (valid) index into the namestring
-                      which indicates the debugging type symbol.  */
+                      the initial read through the symbol tables needs to
+                      worry about.  If we reach this point, the symbol
+                      which we are considering is definitely one we are
+                      interested in.  p must also contain the (valid)
+                      index into the namestring which indicates the
+                      debugging type symbol.  */
 
                    switch (p[1])
                      {
                      case 'S':
-                       sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
-#ifdef STATIC_TRANSFORM_NAME
-                       namestring = STATIC_TRANSFORM_NAME (namestring);
-#endif
-                       add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_STATIC,
+                       sh.value += ANOFFSET (objfile->section_offsets,
+                                             SECT_OFF_DATA (objfile));
+
+                       if (gdbarch_static_transform_name_p (gdbarch))
+                         namestring = gdbarch_static_transform_name
+                                        (gdbarch, namestring);
+
+                       add_psymbol_to_list (namestring, p - namestring, 1,
+                                            VAR_DOMAIN, LOC_STATIC,
                                             &objfile->static_psymbols,
                                             0, sh.value,
                                             psymtab_language, objfile);
                        continue;
                      case 'G':
-                       sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+                       sh.value += ANOFFSET (objfile->section_offsets,
+                                             SECT_OFF_DATA (objfile));
                        /* The addresses in these entries are reported to be
                           wrong.  See the code that reads 'G's for symtabs. */
-                       add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_STATIC,
+                       add_psymbol_to_list (namestring, p - namestring, 1,
+                                            VAR_DOMAIN, LOC_STATIC,
                                             &objfile->global_psymbols,
                                             0, sh.value,
                                             psymtab_language, objfile);
@@ -3011,55 +3169,45 @@ parse_partial_symbols (struct objfile *objfile)
                            || (p == namestring + 1
                                && namestring[0] != ' '))
                          {
-                           add_psymbol_to_list (namestring, p - namestring,
-                                                STRUCT_NAMESPACE, LOC_TYPEDEF,
+                           add_psymbol_to_list (namestring, p - namestring, 1,
+                                                STRUCT_DOMAIN, LOC_TYPEDEF,
                                                 &objfile->static_psymbols,
                                                 sh.value, 0,
                                                 psymtab_language, objfile);
                            if (p[2] == 't')
                              {
                                /* Also a typedef with the same name.  */
-                               add_psymbol_to_list (namestring, p - namestring,
-                                                    VAR_NAMESPACE, LOC_TYPEDEF,
+                               add_psymbol_to_list (namestring,
+                                                    p - namestring, 1,
+                                                    VAR_DOMAIN, LOC_TYPEDEF,
                                                     &objfile->static_psymbols,
                                                     sh.value, 0,
-                                                    psymtab_language, objfile);
+                                                    psymtab_language,
+                                                    objfile);
                                p += 1;
                              }
-                           /* The semantics of C++ state that "struct foo { ... }"
-                              also defines a typedef for "foo".  Unfortuantely, cfront
-                              never makes the typedef when translating from C++ to C.
-                              We make the typedef here so that "ptype foo" works as
-                              expected for cfront translated code.  */
-                           else if (psymtab_language == language_cplus)
-                             {
-                               /* Also a typedef with the same name.  */
-                               add_psymbol_to_list (namestring, p - namestring,
-                                                    VAR_NAMESPACE, LOC_TYPEDEF,
-                                                    &objfile->static_psymbols,
-                                                    sh.value, 0,
-                                                    psymtab_language, objfile);
-                             }
                          }
                        goto check_enum;
                      case 't':
-                       if (p != namestring)    /* a name is there, not just :T... */
+                       if (p != namestring)    /* a name is there, not
+                                                  just :T... */
                          {
-                           add_psymbol_to_list (namestring, p - namestring,
-                                                VAR_NAMESPACE, LOC_TYPEDEF,
+                           add_psymbol_to_list (namestring, p - namestring, 1,
+                                                VAR_DOMAIN, LOC_TYPEDEF,
                                                 &objfile->static_psymbols,
                                                 sh.value, 0,
                                                 psymtab_language, objfile);
                          }
                      check_enum:
-                       /* If this is an enumerated type, we need to
-                          add all the enum constants to the partial symbol
-                          table.  This does not cover enums without names, e.g.
-                          "enum {a, b} c;" in C, but fortunately those are
-                          rare.  There is no way for GDB to find those from the
-                          enum type without spending too much time on it.  Thus
-                          to solve this problem, the compiler needs to put out the
-                          enum in a nameless type.  GCC2 does this.  */
+                       /* If this is an enumerated type, we need to add
+                          all the enum constants to the partial symbol
+                          table.  This does not cover enums without names,
+                          e.g.  "enum {a, b} c;" in C, but fortunately
+                          those are rare.  There is no way for GDB to find
+                          those from the enum type without spending too
+                          much time on it.  Thus to solve this problem,
+                          the compiler needs to put out the enum in a
+                          nameless type.  GCC2 does this.  */
 
                        /* We are looking for something of the form
                           <name> ":" ("t" | "T") [<number> "="] "e"
@@ -3067,8 +3215,8 @@ parse_partial_symbols (struct objfile *objfile)
 
                        /* Skip over the colon and the 't' or 'T'.  */
                        p += 2;
-                       /* This type may be given a number.  Also, numbers can come
-                          in pairs like (0,26).  Skip over it.  */
+                       /* This type may be given a number.  Also, numbers
+                          can come in pairs like (0,26).  Skip over it.  */
                        while ((*p >= '0' && *p <= '9')
                               || *p == '(' || *p == ',' || *p == ')'
                               || *p == '=')
@@ -3076,7 +3224,8 @@ parse_partial_symbols (struct objfile *objfile)
 
                        if (*p++ == 'e')
                          {
-                           /* The aix4 compiler emits extra crud before the members.  */
+                           /* The aix4 compiler emits extra crud before
+                              the members.  */
                            if (*p == '-')
                              {
                                /* Skip over the type (?).  */
@@ -3096,8 +3245,8 @@ parse_partial_symbols (struct objfile *objfile)
                              {
                                char *q;
 
-                               /* Check for and handle cretinous dbx symbol name
-                                  continuation!  */
+                               /* Check for and handle cretinous dbx
+                                  symbol name continuation!  */
                                if (*p == '\\' || (*p == '?' && p[1] == '\0'))
                                  p = next_symbol_text (objfile);
 
@@ -3106,11 +3255,13 @@ parse_partial_symbols (struct objfile *objfile)
                                for (q = p; *q && *q != ':'; q++)
                                  ;
                                /* Note that the value doesn't matter for
-                                  enum constants in psymtabs, just in symtabs.  */
-                               add_psymbol_to_list (p, q - p,
-                                                    VAR_NAMESPACE, LOC_CONST,
-                                                    &objfile->static_psymbols, 0,
-                                                    0, psymtab_language, objfile);
+                                  enum constants in psymtabs, just in
+                                  symtabs.  */
+                               add_psymbol_to_list (p, q - p, 1,
+                                                    VAR_DOMAIN, LOC_CONST,
+                                                    &objfile->static_psymbols,
+                                                    0, 0, psymtab_language,
+                                                    objfile);
                                /* Point past the name.  */
                                p = q;
                                /* Skip over the value.  */
@@ -3124,10 +3275,11 @@ parse_partial_symbols (struct objfile *objfile)
                        continue;
                      case 'c':
                        /* Constant, e.g. from "const" in Pascal.  */
-                       add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_CONST,
-                                            &objfile->static_psymbols, sh.value,
-                                            0, psymtab_language, objfile);
+                       add_psymbol_to_list (namestring, p - namestring, 1,
+                                            VAR_DOMAIN, LOC_CONST,
+                                            &objfile->static_psymbols,
+                                            sh.value, 0, psymtab_language,
+                                            objfile);
                        continue;
 
                      case 'f':
@@ -3135,43 +3287,49 @@ parse_partial_symbols (struct objfile *objfile)
                          {
                            int name_len = p - namestring;
                            char *name = xmalloc (name_len + 1);
+
                            memcpy (name, namestring, name_len);
                            name[name_len] = '\0';
                            function_outside_compilation_unit_complaint (name);
                            xfree (name);
                          }
-                       sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-                       add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_BLOCK,
+                       sh.value += ANOFFSET (objfile->section_offsets,
+                                             SECT_OFF_TEXT (objfile));
+                       add_psymbol_to_list (namestring, p - namestring, 1,
+                                            VAR_DOMAIN, LOC_BLOCK,
                                             &objfile->static_psymbols,
                                             0, sh.value,
                                             psymtab_language, objfile);
                        continue;
 
                        /* Global functions were ignored here, but now they
-                          are put into the global psymtab like one would expect.
-                          They're also in the minimal symbol table.  */
+                          are put into the global psymtab like one would
+                          expect.  They're also in the minimal symbol
+                          table.  */
                      case 'F':
                        if (! pst)
                          {
                            int name_len = p - namestring;
                            char *name = xmalloc (name_len + 1);
+
                            memcpy (name, namestring, name_len);
                            name[name_len] = '\0';
                            function_outside_compilation_unit_complaint (name);
                            xfree (name);
                          }
-                       sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-                       add_psymbol_to_list (namestring, p - namestring,
-                                            VAR_NAMESPACE, LOC_BLOCK,
+                       sh.value += ANOFFSET (objfile->section_offsets,
+                                             SECT_OFF_TEXT (objfile));
+                       add_psymbol_to_list (namestring, p - namestring, 1,
+                                            VAR_DOMAIN, LOC_BLOCK,
                                             &objfile->global_psymbols,
                                             0, sh.value,
                                             psymtab_language, objfile);
                        continue;
 
-                       /* Two things show up here (hopefully); static symbols of
-                          local scope (static used inside braces) or extensions
-                          of structure symbols.  We can ignore both.  */
+                       /* Two things show up here (hopefully); static
+                          symbols of local scope (static used inside
+                          braces) or extensions of structure symbols.  We
+                          can ignore both.  */
                      case 'V':
                      case '(':
                      case '0':
@@ -3185,32 +3343,31 @@ parse_partial_symbols (struct objfile *objfile)
                      case '8':
                      case '9':
                      case '-':
-                     case '#':         /* for symbol identification (used in live ranges) */
-                       /* added to support cfront stabs strings */
-                     case 'Z':         /* for definition continuations */
-                     case 'P':         /* for prototypes */
+                     case '#':         /* For symbol identification (used
+                                          in live ranges).  */
                        continue;
 
                      case ':':
-                       /* It is a C++ nested symbol.  We don't need to record it
-                          (I don't think); if we try to look up foo::bar::baz,
-                          then symbols for the symtab containing foo should get
-                          read in, I think.  */
+                       /* It is a C++ nested symbol.  We don't need to
+                          record it (I don't think); if we try to look up
+                          foo::bar::baz, then symbols for the symtab
+                          containing foo should get read in, I think.  */
                        /* Someone says sun cc puts out symbols like
                           /foo/baz/maclib::/usr/local/bin/maclib,
                           which would get here with a symbol type of ':'.  */
                        continue;
 
                      default:
-                       /* Unexpected symbol descriptor.  The second and subsequent stabs
-                          of a continued stab can show up here.  The question is
-                          whether they ever can mimic a normal stab--it would be
-                          nice if not, since we certainly don't want to spend the
-                          time searching to the end of every string looking for
+                       /* Unexpected symbol descriptor.  The second and
+                          subsequent stabs of a continued stab can show up
+                          here.  The question is whether they ever can
+                          mimic a normal stab--it would be nice if not,
+                          since we certainly don't want to spend the time
+                          searching to the end of every string looking for
                           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.  */
@@ -3221,19 +3378,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:
@@ -3243,12 +3399,14 @@ parse_partial_symbols (struct objfile *objfile)
                  case N_EINCL:
                  case N_DSLINE:
                  case N_BSLINE:
-                 case N_SSYM:                  /* Claim: Structure or union element.
-                                                  Hopefully, I can ignore this.  */
-                 case N_ENTRY:         /* Alternate entry point; can ignore. */
-                 case N_MAIN:                  /* Can definitely ignore this.   */
+                 case N_SSYM:          /* Claim: Structure or union
+                                          element.  Hopefully, I can
+                                          ignore this.  */
+                 case N_ENTRY:         /* Alternate entry point; can
+                                          ignore. */
+                 case N_MAIN:          /* Can definitely ignore this.   */
                  case N_CATCH:         /* These are GNU C++ extensions */
-                 case N_EHDECL:                /* that can safely be ignored here. */
+                 case N_EHDECL:        /* that can safely be ignored here. */
                  case N_LENG:
                  case N_BCOMM:
                  case N_ECOMM:
@@ -3260,19 +3418,22 @@ parse_partial_symbols (struct objfile *objfile)
                  case N_LBRAC:
                  case N_NSYMS:         /* Ultrix 4.0: symbol count */
                  case N_DEFD:                  /* GNU Modula-2 */
-                 case N_ALIAS:         /* SunPro F77: alias name, ignore for now.  */
+                 case N_ALIAS:         /* SunPro F77: alias name, ignore
+                                          for now.  */
 
-                 case N_OBJ:                   /* useless types from Solaris */
+                 case N_OBJ:           /* useless types from Solaris */
                  case N_OPT:
-                   /* These symbols aren't interesting; don't worry about them */
+                   /* These symbols aren't interesting; don't worry about
+                      them */
 
                    continue;
 
                  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*/
+                   /* 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"),
+                              hex_string (type_code)); /*CUR_SYMBOL_TYPE*/
                    continue;
                  }
                if (stabstring
@@ -3320,18 +3481,21 @@ parse_partial_symbols (struct objfile *objfile)
                  /* The value of a stEnd symbol is the displacement from the
                     corresponding start symbol value, do not relocate it.  */
                  if (sh.st != stEnd)
-                   sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+                   sh.value += ANOFFSET (objfile->section_offsets,
+                                         SECT_OFF_TEXT (objfile));
                  break;
                case scData:
                case scSData:
                case scRData:
                case scPData:
                case scXData:
-                 sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+                 sh.value += ANOFFSET (objfile->section_offsets,
+                                       SECT_OFF_DATA (objfile));
                  break;
                case scBss:
                case scSBss:
-                 sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
+                 sh.value += ANOFFSET (objfile->section_offsets,
+                                       SECT_OFF_BSS (objfile));
                  break;
                }
 
@@ -3343,9 +3507,9 @@ parse_partial_symbols (struct objfile *objfile)
 
                case stStaticProc:
                  prim_record_minimal_symbol_and_info (name, sh.value,
-                                                      mst_file_text, NULL,
-                                                      SECT_OFF_TEXT (objfile), NULL,
-                                                      objfile);
+                                                      mst_file_text,
+                                                      SECT_OFF_TEXT (objfile),
+                                                      NULL, objfile);
 
                  /* FALLTHROUGH */
 
@@ -3368,13 +3532,18 @@ 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 */
                    }
 
-                  /* Make sure that this stProc entry represents a "real"
-                     procedure.  If not, ignore it.  */
+                  /* For stProc symbol records, we need to check the
+                     storage class as well, as only (stProc, scText)
+                     entries represent "real" procedures - See the
+                     Compaq document titled "Object File / Symbol Table
+                     Format Specification" for more information.  If the
+                     storage class is not scText, we discard the whole
+                     block of symbol records for this stProc.  */
                   if (sh.st == stProc && sh.sc != scText)
                     goto skip;
 
@@ -3390,13 +3559,13 @@ parse_partial_symbols (struct objfile *objfile)
                     symbol table, and the MAIN__ symbol via the minimal
                     symbol table.  */
                  if (sh.st == stProc)
-                   add_psymbol_to_list (name, strlen (name),
-                                        VAR_NAMESPACE, LOC_BLOCK,
+                   add_psymbol_to_list (name, strlen (name), 1,
+                                        VAR_DOMAIN, LOC_BLOCK,
                                         &objfile->global_psymbols,
                                    0, sh.value, psymtab_language, objfile);
                  else
-                   add_psymbol_to_list (name, strlen (name),
-                                        VAR_NAMESPACE, LOC_BLOCK,
+                   add_psymbol_to_list (name, strlen (name), 1,
+                                        VAR_DOMAIN, LOC_BLOCK,
                                         &objfile->static_psymbols,
                                    0, sh.value, psymtab_language, objfile);
 
@@ -3424,13 +3593,13 @@ parse_partial_symbols (struct objfile *objfile)
                case stStatic:  /* Variable */
                  if (SC_IS_DATA (sh.sc))
                    prim_record_minimal_symbol_and_info (name, sh.value,
-                                                        mst_file_data, NULL,
+                                                        mst_file_data,
                                                         SECT_OFF_DATA (objfile),
                                                         NULL,
                                                         objfile);
                  else
                    prim_record_minimal_symbol_and_info (name, sh.value,
-                                                        mst_file_bss, NULL,
+                                                        mst_file_bss,
                                                         SECT_OFF_BSS (objfile),
                                                         NULL,
                                                         objfile);
@@ -3464,8 +3633,8 @@ parse_partial_symbols (struct objfile *objfile)
                      && sh.iss != 0
                      && sh.index != cur_sdx + 2)
                    {
-                     add_psymbol_to_list (name, strlen (name),
-                                          STRUCT_NAMESPACE, LOC_TYPEDEF,
+                     add_psymbol_to_list (name, strlen (name), 1,
+                                          STRUCT_DOMAIN, LOC_TYPEDEF,
                                           &objfile->static_psymbols,
                                           0, (CORE_ADDR) 0,
                                           psymtab_language, objfile);
@@ -3478,7 +3647,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;
@@ -3498,15 +3667,15 @@ 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;
                }
              /* Use this gdb symbol */
-             add_psymbol_to_list (name, strlen (name),
-                                  VAR_NAMESPACE, class,
+             add_psymbol_to_list (name, strlen (name), 1,
+                                  VAR_DOMAIN, class,
                                   &objfile->static_psymbols,
                                   0, sh.value, psymtab_language, objfile);
            skip:
@@ -3526,7 +3695,8 @@ 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.  */
@@ -3538,18 +3708,21 @@ parse_partial_symbols (struct objfile *objfile)
                {
                case scText:
                case scRConst:
-                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
+                 svalue += ANOFFSET (objfile->section_offsets,
+                                     SECT_OFF_TEXT (objfile));
                  break;
                case scData:
                case scSData:
                case scRData:
                case scPData:
                case scXData:
-                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
+                 svalue += ANOFFSET (objfile->section_offsets,
+                                     SECT_OFF_DATA (objfile));
                  break;
                case scBss:
                case scSBss:
-                 svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
+                 svalue += ANOFFSET (objfile->section_offsets,
+                                     SECT_OFF_BSS (objfile));
                  break;
                }
 
@@ -3581,8 +3754,8 @@ parse_partial_symbols (struct objfile *objfile)
                  break;
                }
              name = debug_info->ssext + psh->iss;
-             add_psymbol_to_list (name, strlen (name),
-                                  VAR_NAMESPACE, class,
+             add_psymbol_to_list (name, strlen (name), 1,
+                                  VAR_DOMAIN, class,
                                   &objfile->global_psymbols,
                                   0, svalue,
                                   psymtab_language, objfile);
@@ -3598,13 +3771,6 @@ parse_partial_symbols (struct objfile *objfile)
       includes_used = 0;
       dependencies_used = 0;
 
-      if (objfile->ei.entry_point >= save_pst->textlow &&
-         objfile->ei.entry_point < save_pst->texthigh)
-       {
-         objfile->ei.entry_file_lowpc = save_pst->textlow;
-         objfile->ei.entry_file_highpc = save_pst->texthigh;
-       }
-
       /* The objfile has its functions reordered if this partial symbol
          table overlaps any other partial symbol table.
          We cannot assume a reordered objfile if a partial symbol table
@@ -3648,12 +3814,12 @@ parse_partial_symbols (struct objfile *objfile)
       if (fh->crfd <= 1)
        continue;
 
-      /* Skip the first file indirect entry as it is a self dependency
-         for source files or a reverse .h -> .c dependency for header files.  */
+      /* Skip the first file indirect entry as it is a self dependency for
+         source files or a reverse .h -> .c dependency for header files.  */
       pst->number_of_dependencies = 0;
       pst->dependencies =
        ((struct partial_symtab **)
-        obstack_alloc (&objfile->psymbol_obstack,
+        obstack_alloc (&objfile->objfile_obstack,
                        ((fh->crfd - 1)
                         * sizeof (struct partial_symtab *))));
       for (s_idx = 1; s_idx < fh->crfd; s_idx++)
@@ -3666,7 +3832,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;
            }
 
@@ -3677,7 +3843,8 @@ parse_partial_symbols (struct objfile *objfile)
          /* Do not add to dependeny list if psymtab was empty.  */
          if (fdr_to_pst[rh].pst == (struct partial_symtab *) NULL)
            continue;
-         pst->dependencies[pst->number_of_dependencies++] = fdr_to_pst[rh].pst;
+         pst->dependencies[pst->number_of_dependencies++]
+           = fdr_to_pst[rh].pst;
        }
     }
 
@@ -3751,8 +3918,8 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
 
       /* Note that the value doesn't matter for enum constants
          in psymtabs, just in symtabs.  */
-      add_psymbol_to_list (name, strlen (name),
-                          VAR_NAMESPACE, LOC_CONST,
+      add_psymbol_to_list (name, strlen (name), 1,
+                          VAR_DOMAIN, LOC_CONST,
                           &objfile->static_psymbols, 0,
                           (CORE_ADDR) 0, psymtab_language, objfile);
       ext_sym += external_sym_size;
@@ -3786,7 +3953,7 @@ mdebug_next_symbol_text (struct objfile *objfile)
    The flow of control and even the memory allocation differs.  FIXME.  */
 
 static void
-psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
+psymtab_to_symtab_1 (struct partial_symtab *pst, const char *filename)
 {
   bfd_size_type external_sym_size;
   bfd_size_type external_pdr_size;
@@ -3860,8 +4027,8 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
                      ((char *) debug_info->external_sym
                       + (fh->isymBase + 1) * external_sym_size),
                      &sh);
-      if (STREQ (debug_info->ss + fh->issBase + sh.iss,
-                stabs_symbol))
+      if (strcmp (debug_info->ss + fh->issBase + sh.iss,
+                 stabs_symbol) == 0)
        {
          /* We indicate that this is a GCC compilation so that certain
             features will be enabled in stabsread/dbxread.  */
@@ -3871,6 +4038,7 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
 
   if (processing_gcc_compilation != 0)
     {
+      struct gdbarch *gdbarch = get_objfile_arch (pst->objfile);
 
       /* This symbol table contains stabs-in-ecoff entries.  */
 
@@ -3938,17 +4106,17 @@ 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 *)
-                  obstack_alloc (&current_objfile->symbol_obstack,
-                                 sizeof (struct mips_extra_func_info)));
-                 struct symbol *s = new_symbol (MIPS_EFI_SYMBOL_NAME);
-
-                 memset (e, 0, sizeof (struct mips_extra_func_info));
-                 SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
+                 struct mdebug_extra_func_info *e =
+                   ((struct mdebug_extra_func_info *)
+                    obstack_alloc (&current_objfile->objfile_obstack,
+                                   sizeof (struct mdebug_extra_func_info)));
+                 struct symbol *s = new_symbol (MDEBUG_EFI_SYMBOL_NAME);
+
+                 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;
-                 SYMBOL_VALUE (s) = (long) e;
+                 SYMBOL_TYPE (s) = objfile_type (pst->objfile)->builtin_void;
+                 SYMBOL_VALUE_BYTES (s) = (gdb_byte *) e;
                  e->pdr.framereg = -1;
                  add_symbol_to_list (s, &local_symbols);
                }
@@ -3964,8 +4132,10 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
              else
                {
                  /* Handle encoded stab line number. */
-                 valu += ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (pst->objfile));
-                 record_line (current_subfile, sh.index, valu);
+                 valu += ANOFFSET (pst->section_offsets,
+                                   SECT_OFF_TEXT (pst->objfile));
+                 record_line (current_subfile, sh.index,
+                              gdbarch_addr_bits_remove (gdbarch, valu));
                }
            }
          else if (sh.st == stProc || sh.st == stStaticProc
@@ -3973,19 +4143,17 @@ 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)
        {
-         st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT (pst->objfile));
+         st = end_symtab (pst->texthigh, pst->objfile,
+                          SECT_OFF_TEXT (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.  */
-      sort_symtab_syms (st);
-
       /* There used to be a call to sort_blocks here, but this should not
          be necessary for stabs symtabs.  And as sort_blocks modifies the
          start address of the GLOBAL_BLOCK to the FIRST_LOCAL_BLOCK,
@@ -4035,23 +4203,18 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
     {
       /* This symbol table contains ordinary ecoff entries.  */
 
-      int f_max;
       int maxlines;
       EXTR *ext_ptr;
 
-      /* How many symbols will we need */
-      /* FIXME, this does not count enum values. */
-      f_max = pst->n_global_syms + pst->n_static_syms;
       if (fh == 0)
        {
          maxlines = 0;
-         st = new_symtab ("unknown", f_max, 0, pst->objfile);
+         st = new_symtab ("unknown", 0, pst->objfile);
        }
       else
        {
-         f_max += fh->csym + fh->cpd;
          maxlines = 2 * fh->cline;
-         st = new_symtab (pst->filename, 2 * f_max, maxlines, pst->objfile);
+         st = new_symtab (pst->filename, maxlines, pst->objfile);
 
          /* The proper language was already determined when building
             the psymtab, use it.  */
@@ -4071,7 +4234,6 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
       BLOCK_START (top_stack->cur_block) = pst->textlow;
       BLOCK_END (top_stack->cur_block) = 0;
       top_stack->blocktype = stFile;
-      top_stack->maxsyms = 2 * f_max;
       top_stack->cur_type = 0;
       top_stack->procadr = 0;
       top_stack->numargs = 0;
@@ -4094,7 +4256,8 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
              (*swap_sym_in) (cur_bfd, sym_ptr, &sh);
              c = parse_symbol (&sh,
                                debug_info->external_aux + fh->iauxBase,
-                               sym_ptr, fh->fBigendian, pst->section_offsets, pst->objfile);
+                               sym_ptr, fh->fBigendian,
+                               pst->section_offsets, pst->objfile);
              sym_ptr += c * external_sym_size;
            }
 
@@ -4132,7 +4295,8 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
                    lowest_pdr_addr = pdr_in->adr;
                }
 
-             parse_lines (fh, pr_block, lines, maxlines, pst, lowest_pdr_addr);
+             parse_lines (fh, pr_block, lines, maxlines,
+                          pst, lowest_pdr_addr);
              if (lines->nitems < fh->cline)
                lines = shrink_linetable (lines);
 
@@ -4152,26 +4316,25 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
          XXX use the global list to speed up things here. how?
          FIXME, Maybe quit once we have found the right number of ext's? */
       top_stack->cur_st = st;
-      top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (top_stack->cur_st),
-                                               GLOBAL_BLOCK);
+      top_stack->cur_block
+       = BLOCKVECTOR_BLOCK (BLOCKVECTOR (top_stack->cur_st),
+                            GLOBAL_BLOCK);
       top_stack->blocktype = stFile;
-      top_stack->maxsyms
-       = (debug_info->symbolic_header.isymMax
-          + debug_info->symbolic_header.ipdMax
-          + debug_info->symbolic_header.iextMax);
 
       ext_ptr = PST_PRIVATE (pst)->extern_tab;
       for (i = PST_PRIVATE (pst)->extern_count; --i >= 0; ext_ptr++)
-       parse_external (ext_ptr, fh->fBigendian, pst->section_offsets, pst->objfile);
+       parse_external (ext_ptr, fh->fBigendian,
+                       pst->section_offsets, pst->objfile);
 
       /* If there are undefined symbols, tell the user.
          The alpha has an undefined symbol for every symbol that is
          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",
+         printf_filtered ("\n\t%4d variables\n\t%4d "
+                          "procedures\n\t%4d labels\n",
                           n_undef_vars, n_undef_procs, n_undef_labels);
          n_undef_symbols = n_undef_labels = n_undef_vars = n_undef_procs = 0;
 
@@ -4180,9 +4343,6 @@ psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
 
       st->primary = 1;
 
-      /* Sort the symbol table now, we are done adding symbols to it. */
-      sort_symtab_syms (st);
-
       sort_blocks (st);
     }
 
@@ -4230,7 +4390,9 @@ has_opaque_xref (FDR *fh, SYMR *sh)
    Return value says how many aux symbols we ate. */
 
 static int
-cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_code,     /* Use to alloc new type if none is found. */
+cross_ref (int fd, union aux_ext *ax, struct type **tpp,
+          enum type_code type_code,
+          /* Use to alloc new type if none is found. */
           char **pname, int bigend, char *sym_name)
 {
   RNDXR rn[1];
@@ -4263,7 +4425,8 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_cod
   if (rf == -1)
     {
       *pname = "<undefined>";
-      *tpp = init_type (type_code, 0, TYPE_FLAG_STUB, (char *) NULL, current_objfile);
+      *tpp = init_type (type_code, 0, TYPE_FLAG_STUB,
+                       (char *) NULL, current_objfile);
       return result;
     }
 
@@ -4345,7 +4508,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:
@@ -4383,7 +4546,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);
@@ -4428,64 +4591,37 @@ cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_cod
    keeping the symtab sorted */
 
 static struct symbol *
-mylookup_symbol (char *name, register struct block *block,
-                namespace_enum namespace, enum address_class class)
+mylookup_symbol (char *name, struct block *block,
+                domain_enum domain, enum address_class class)
 {
-  int i, inc;
+  struct dict_iterator iter;
+  int inc;
   struct symbol *sym;
 
   inc = name[0];
-  ALL_BLOCK_SYMBOLS (block, i, sym)
+  ALL_BLOCK_SYMBOLS (block, iter, sym)
     {
-      if (SYMBOL_NAME (sym)[0] == inc
-         && SYMBOL_NAMESPACE (sym) == namespace
+      if (SYMBOL_LINKAGE_NAME (sym)[0] == inc
+         && SYMBOL_DOMAIN (sym) == domain
          && SYMBOL_CLASS (sym) == class
-         && strcmp (SYMBOL_NAME (sym), name) == 0)
+         && strcmp (SYMBOL_LINKAGE_NAME (sym), name) == 0)
        return sym;
     }
 
   block = BLOCK_SUPERBLOCK (block);
   if (block)
-    return mylookup_symbol (name, block, namespace, class);
+    return mylookup_symbol (name, block, domain, class);
   return 0;
 }
 
 
-/* Add a new symbol S to a block B.
-   Infrequently, we will need to reallocate the block to make it bigger.
-   We only detect this case when adding to top_stack->cur_block, since
-   that's the only time we know how big the block is.  FIXME.  */
+/* 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)
 {
-  int nsyms = BLOCK_NSYMS (b)++;
-  struct block *origb;
-  struct parse_stack *stackp;
-
-  if (b == top_stack->cur_block &&
-      nsyms >= top_stack->maxsyms)
-    {
-      complaint (&symfile_complaints, "block containing %s overfilled",
-                SYMBOL_NAME (s));
-      /* In this case shrink_block is actually grow_block, since
-         BLOCK_NSYMS(b) is larger than its current size.  */
-      origb = b;
-      b = shrink_block (top_stack->cur_block, top_stack->cur_st);
-
-      /* Now run through the stack replacing pointers to the
-         original block.  shrink_block has already done this
-         for the blockvector and BLOCK_FUNCTION.  */
-      for (stackp = top_stack; stackp; stackp = stackp->next)
-       {
-         if (stackp->cur_block == origb)
-           {
-             stackp->cur_block = b;
-             stackp->maxsyms = BLOCK_NSYMS (b);
-           }
-       }
-    }
-  BLOCK_SYM (b, nsyms) = s;
+  SYMBOL_SYMTAB (s) = symtab;
+  dict_add_symbol (BLOCK_DICT (b), s);
 }
 
 /* Add a new block B to a symtab S */
@@ -4545,7 +4681,7 @@ add_line (struct linetable *lt, int lineno, CORE_ADDR adr, int last)
 static int
 compare_blocks (const void *arg1, const void *arg2)
 {
-  register int addr_diff;
+  LONGEST addr_diff;
   struct block **b1 = (struct block **) arg1;
   struct block **b2 = (struct block **) arg2;
 
@@ -4586,8 +4722,8 @@ sort_blocks (struct symtab *s)
           compare_blocks);
 
   {
-    register CORE_ADDR high = 0;
-    register int i, j = BLOCKVECTOR_NBLOCKS (bv);
+    CORE_ADDR high = 0;
+    int i, j = BLOCKVECTOR_NBLOCKS (bv);
 
     for (i = FIRST_LOCAL_BLOCK; i < j; i++)
       if (high < BLOCK_END (BLOCKVECTOR_BLOCK (bv, i)))
@@ -4607,11 +4743,11 @@ sort_blocks (struct symtab *s)
 
 /* Constructor/restructor/destructor procedures */
 
-/* Allocate a new symtab for NAME.  Needs an estimate of how many symbols
-   MAXSYMS and linenumbers MAXLINES we'll put in it */
+/* Allocate a new symtab for NAME.  Needs an estimate of how many
+   linenumbers MAXLINES we'll put in it */
 
 static struct symtab *
-new_symtab (char *name, int maxsyms, int maxlines, struct objfile *objfile)
+new_symtab (const char *name, int maxlines, struct objfile *objfile)
 {
   struct symtab *s = allocate_symtab (name, objfile);
 
@@ -4619,14 +4755,15 @@ new_symtab (char *name, int maxsyms, int maxlines, struct objfile *objfile)
 
   /* All symtabs must have at least two blocks */
   BLOCKVECTOR (s) = new_bvect (2);
-  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK) = new_block (maxsyms);
-  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK) = new_block (maxsyms);
+  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK)
+    = new_block (NON_FUNCTION_BLOCK);
+  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)
+    = new_block (NON_FUNCTION_BLOCK);
   BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)) =
     BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
 
   s->free_code = free_linetable;
-  s->debugformat = obsavestring ("ECOFF", 5,
-                                &objfile->symbol_obstack);
+  s->debugformat = "ECOFF";
   return (s);
 }
 
@@ -4642,9 +4779,8 @@ new_psymtab (char *name, struct objfile *objfile)
 
   /* Keep a backpointer to the file's symbols */
 
-  psymtab->read_symtab_private = ((char *)
-                                 obstack_alloc (&objfile->psymbol_obstack,
-                                                sizeof (struct symloc)));
+  psymtab->read_symtab_private = obstack_alloc (&objfile->objfile_obstack,
+                                               sizeof (struct symloc));
   memset (psymtab->read_symtab_private, 0, sizeof (struct symloc));
   CUR_BFD (psymtab) = cur_bfd;
   DEBUG_SWAP (psymtab) = debug_swap;
@@ -4681,7 +4817,6 @@ new_linetable (int size)
 static struct linetable *
 shrink_linetable (struct linetable *lt)
 {
-
   return (struct linetable *) xrealloc ((void *) lt,
                                        (sizeof (struct linetable)
                                         + ((lt->nitems - 1)
@@ -4704,48 +4839,25 @@ new_bvect (int nblocks)
   return bv;
 }
 
-/* Allocate and zero a new block of MAXSYMS symbols */
+/* Allocate and zero a new block, and set its BLOCK_DICT.  If function
+   is non-zero, assume the block is associated to a function, and make
+   sure that the symbols are stored linearly; otherwise, store them
+   hashed.  */
 
 static struct block *
-new_block (int maxsyms)
+new_block (enum block_type type)
 {
-  int size = sizeof (struct block) + (maxsyms - 1) * sizeof (struct symbol *);
-
-  return (struct block *) xzalloc (size);
-}
-
-/* Ooops, too big. Shrink block B in symtab S to its minimal size.
-   Shrink_block can also be used by add_symbol to grow a block.  */
+  /* FIXME: carlton/2003-09-11: This should use allocate_block to
+     allocate the block.  Which, in turn, suggests that the block
+     should be allocated on an obstack.  */
+  struct block *retval = xzalloc (sizeof (struct block));
 
-static struct block *
-shrink_block (struct block *b, struct symtab *s)
-{
-  struct block *new;
-  struct blockvector *bv = BLOCKVECTOR (s);
-  int i;
+  if (type == FUNCTION_BLOCK)
+    BLOCK_DICT (retval) = dict_create_linear_expandable ();
+  else
+    BLOCK_DICT (retval) = dict_create_hashed_expandable ();
 
-  /* Just reallocate it and fix references to the old one */
-
-  new = (struct block *) xrealloc ((void *) b,
-                                  (sizeof (struct block)
-                                   + ((BLOCK_NSYMS (b) - 1)
-                                      * sizeof (struct symbol *))));
-
-  /* FIXME: Not worth hashing this block as it's built.  */
-  /* All callers should have created the block with new_block (), which
-     would mean it was not previously hashed.  Make sure.  */
-  gdb_assert (BLOCK_HASHTABLE (new) == 0);
-
-  /* Should chase pointers to old one.  Fortunately, that`s just
-     the block`s function and inferior blocks */
-  if (BLOCK_FUNCTION (new) && SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) == b)
-    SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) = new;
-  for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
-    if (BLOCKVECTOR_BLOCK (bv, i) == b)
-      BLOCKVECTOR_BLOCK (bv, i) = new;
-    else if (BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) == b)
-      BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) = new;
-  return new;
+  return retval;
 }
 
 /* Create a new symbol with printname NAME */
@@ -4754,14 +4866,12 @@ static struct symbol *
 new_symbol (char *name)
 {
   struct symbol *s = ((struct symbol *)
-                     obstack_alloc (&current_objfile->symbol_obstack,
+                     obstack_alloc (&current_objfile->objfile_obstack,
                                     sizeof (struct symbol)));
 
   memset (s, 0, sizeof (*s));
-  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);
+  SYMBOL_SET_LANGUAGE (s, psymtab_language);
+  SYMBOL_SET_NAMES (s, name, strlen (name), 1, current_objfile);
   return s;
 }
 
@@ -4774,7 +4884,7 @@ new_type (char *name)
 
   t = alloc_type (current_objfile);
   TYPE_NAME (t) = name;
-  TYPE_CPLUS_SPECIFIC (t) = (struct cplus_struct_type *) &cplus_struct_default;
+  INIT_CPLUS_SPECIFIC (t);
   return t;
 }
 \f
@@ -4789,257 +4899,31 @@ elfmdebug_build_psymtabs (struct objfile *objfile,
 {
   bfd *abfd = objfile->obfd;
   struct ecoff_debug_info *info;
+  struct cleanup *back_to;
+
+  /* FIXME: It's not clear whether we should be getting minimal symbol
+     information from .mdebug in an ELF file, or whether we will.
+     Re-initialize the minimal symbol reader in case we do.  */
+
+  init_minimal_symbol_collection ();
+  back_to = make_cleanup_discard_minimal_symbols ();
 
   info = ((struct ecoff_debug_info *)
-         obstack_alloc (&objfile->psymbol_obstack,
+         obstack_alloc (&objfile->objfile_obstack,
                         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);
-}
-\f
-
-/* Things used for calling functions in the inferior.
-   These functions are exported to our companion
-   mips-tdep.c file and are here because they play
-   with the symbol-table explicitly. */
 
-/* Sigtramp: make sure we have all the necessary information
-   about the signal trampoline code. Since the official code
-   from MIPS does not do so, we make up that information ourselves.
-   If they fix the library (unlikely) this code will neutralize itself. */
-
-/* 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.  Only compile it in when
-   tm-mips.h is included. */
-
-#ifdef TM_MIPS_H
-
-void
-fixup_sigtramp (void)
-{
-  struct symbol *s;
-  struct symtab *st;
-  struct block *b, *b0 = NULL;
-
-  sigtramp_address = -1;
-
-  /* We have to handle the following cases here:
-     a) The Mips library has a sigtramp label within sigvec.
-     b) Irix has a _sigtramp which we want to use, but it also has sigvec.  */
-  s = lookup_symbol ("sigvec", 0, VAR_NAMESPACE, 0, NULL);
-  if (s != 0)
-    {
-      b0 = SYMBOL_BLOCK_VALUE (s);
-      s = lookup_symbol ("sigtramp", b0, VAR_NAMESPACE, 0, NULL);
-    }
-  if (s == 0)
-    {
-      /* No sigvec or no sigtramp inside sigvec, try _sigtramp.  */
-      s = lookup_symbol ("_sigtramp", 0, VAR_NAMESPACE, 0, NULL);
-    }
-
-  /* But maybe this program uses its own version of sigvec */
-  if (s == 0)
-    return;
-
-  /* Did we or MIPSco fix the library ? */
-  if (SYMBOL_CLASS (s) == LOC_BLOCK)
-    {
-      sigtramp_address = BLOCK_START (SYMBOL_BLOCK_VALUE (s));
-      sigtramp_end = BLOCK_END (SYMBOL_BLOCK_VALUE (s));
-      return;
-    }
-
-  sigtramp_address = SYMBOL_VALUE (s);
-  sigtramp_end = sigtramp_address + 0x88;      /* black magic */
-
-  /* But what symtab does it live in ? */
-  st = find_pc_symtab (SYMBOL_VALUE (s));
-
-  /*
-   * Ok, there goes the fix: turn it into a procedure, with all the
-   * needed info.  Note we make it a nested procedure of sigvec,
-   * which is the way the (assembly) code is actually written.
-   */
-  SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
-  SYMBOL_CLASS (s) = LOC_BLOCK;
-  SYMBOL_TYPE (s) = init_type (TYPE_CODE_FUNC, 4, 0, (char *) NULL,
-                              st->objfile);
-  TYPE_TARGET_TYPE (SYMBOL_TYPE (s)) = mdebug_type_void;
-
-  /* Need a block to allocate MIPS_EFI_SYMBOL_NAME in */
-  b = new_block (1);
-  SYMBOL_BLOCK_VALUE (s) = b;
-  BLOCK_START (b) = sigtramp_address;
-  BLOCK_END (b) = sigtramp_end;
-  BLOCK_FUNCTION (b) = s;
-  BLOCK_SUPERBLOCK (b) = BLOCK_SUPERBLOCK (b0);
-  add_block (b, st);
-  sort_blocks (st);
-
-  /* Make a MIPS_EFI_SYMBOL_NAME entry for it */
-  {
-    struct mips_extra_func_info *e =
-    ((struct mips_extra_func_info *)
-     xzalloc (sizeof (struct mips_extra_func_info)));
-
-    e->numargs = 0;            /* the kernel thinks otherwise */
-    e->pdr.frameoffset = 32;
-    e->pdr.framereg = SP_REGNUM;
-    /* Note that setting pcreg is no longer strictly necessary as
-       mips_frame_saved_pc is now aware of signal handler frames.  */
-    e->pdr.pcreg = PC_REGNUM;
-    e->pdr.regmask = -2;
-    /* Offset to saved r31, in the sigtramp case the saved registers
-       are above the frame in the sigcontext.
-       We have 4 alignment bytes, 12 bytes for onstack, mask and pc,
-       32 * 4 bytes for the general registers, 12 bytes for mdhi, mdlo, ownedfp
-       and 32 * 4 bytes for the floating point registers.  */
-    e->pdr.regoffset = 4 + 12 + 31 * 4;
-    e->pdr.fregmask = -1;
-    /* Offset to saved f30 (first saved *double* register).  */
-    e->pdr.fregoffset = 4 + 12 + 32 * 4 + 12 + 30 * 4;
-    e->pdr.isym = (long) s;
-    e->pdr.adr = sigtramp_address;
-
-    current_objfile = st->objfile;     /* Keep new_symbol happy */
-    s = new_symbol (MIPS_EFI_SYMBOL_NAME);
-    SYMBOL_VALUE (s) = (long) e;
-    SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
-    SYMBOL_CLASS (s) = LOC_CONST;
-    SYMBOL_TYPE (s) = mdebug_type_void;
-    current_objfile = NULL;
-  }
-
-  BLOCK_SYM (b, BLOCK_NSYMS (b)++) = s;
+  install_minimal_symbols (objfile);
+  do_cleanups (back_to);
 }
 
-#endif /* TM_MIPS_H */
-
 void
 _initialize_mdebugread (void)
 {
-  mdebug_type_void =
-    init_type (TYPE_CODE_VOID, 1,
-              0,
-              "void", (struct objfile *) NULL);
-  mdebug_type_char =
-    init_type (TYPE_CODE_INT, 1,
-              0,
-              "char", (struct objfile *) NULL);
-  mdebug_type_unsigned_char =
-    init_type (TYPE_CODE_INT, 1,
-              TYPE_FLAG_UNSIGNED,
-              "unsigned char", (struct objfile *) NULL);
-  mdebug_type_short =
-    init_type (TYPE_CODE_INT, 2,
-              0,
-              "short", (struct objfile *) NULL);
-  mdebug_type_unsigned_short =
-    init_type (TYPE_CODE_INT, 2,
-              TYPE_FLAG_UNSIGNED,
-              "unsigned short", (struct objfile *) NULL);
-  mdebug_type_int_32 =
-    init_type (TYPE_CODE_INT, 4,
-              0,
-              "int", (struct objfile *) NULL);
-  mdebug_type_unsigned_int_32 =
-    init_type (TYPE_CODE_INT, 4,
-              TYPE_FLAG_UNSIGNED,
-              "unsigned int", (struct objfile *) NULL);
-  mdebug_type_int_64 =
-    init_type (TYPE_CODE_INT, 8,
-              0,
-              "int", (struct objfile *) NULL);
-  mdebug_type_unsigned_int_64 =
-    init_type (TYPE_CODE_INT, 8,
-              TYPE_FLAG_UNSIGNED,
-              "unsigned int", (struct objfile *) NULL);
-  mdebug_type_long_32 =
-    init_type (TYPE_CODE_INT, 4,
-              0,
-              "long", (struct objfile *) NULL);
-  mdebug_type_unsigned_long_32 =
-    init_type (TYPE_CODE_INT, 4,
-              TYPE_FLAG_UNSIGNED,
-              "unsigned long", (struct objfile *) NULL);
-  mdebug_type_long_64 =
-    init_type (TYPE_CODE_INT, 8,
-              0,
-              "long", (struct objfile *) NULL);
-  mdebug_type_unsigned_long_64 =
-    init_type (TYPE_CODE_INT, 8,
-              TYPE_FLAG_UNSIGNED,
-              "unsigned long", (struct objfile *) NULL);
-  mdebug_type_long_long_64 =
-    init_type (TYPE_CODE_INT, 8,
-              0,
-              "long long", (struct objfile *) NULL);
-  mdebug_type_unsigned_long_long_64 =
-    init_type (TYPE_CODE_INT, 8,
-              TYPE_FLAG_UNSIGNED,
-              "unsigned long long", (struct objfile *) NULL);
-  mdebug_type_adr_32 =
-    init_type (TYPE_CODE_PTR, 4,
-              TYPE_FLAG_UNSIGNED,
-              "adr_32", (struct objfile *) NULL);
-  TYPE_TARGET_TYPE (mdebug_type_adr_32) = mdebug_type_void;
-  mdebug_type_adr_64 =
-    init_type (TYPE_CODE_PTR, 8,
-              TYPE_FLAG_UNSIGNED,
-              "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);
-  mdebug_type_double =
-    init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / 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);
-  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);
-  TYPE_TARGET_TYPE (mdebug_type_double_complex) = mdebug_type_double;
-
-  /* Is a "string" the way btString means it the same as TYPE_CODE_STRING?
-     FIXME.  */
-  mdebug_type_string =
-    init_type (TYPE_CODE_STRING,
-              TARGET_CHAR_BIT / TARGET_CHAR_BIT,
-              0, "string",
-              (struct objfile *) NULL);
-
-  /* We use TYPE_CODE_INT to print these as integers.  Does this do any
-     good?  Would we be better off with TYPE_CODE_ERROR?  Should
-     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,
-              0, "fixed decimal",
-              (struct objfile *) NULL);
-
-  mdebug_type_float_dec =
-    init_type (TYPE_CODE_ERROR,
-              TARGET_DOUBLE_BIT / 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);
+  basic_type_data = register_objfile_data ();
 }
This page took 0.077414 seconds and 4 git commands to generate.