gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / stabsread.c
index bc4356606998db79cbd7f33940c376327cf0ddf6..179a0fb610bc8f9b2d1330ec924db8b5875f1999 100644 (file)
@@ -1,6 +1,6 @@
 /* Support routines for decoding "stabs" debugging information format.
 
-   Copyright (C) 1986-2015 Free Software Foundation, Inc.
+   Copyright (C) 1986-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* Support routines for reading and decoding debugging information in
-   the "stabs" format.  This format is used with many systems that use
-   the a.out object file format, as well as some systems that use
-   COFF or ELF where the stabs data is placed in a special section.
-   Avoid placing any object file format specific code in this file.  */
+   the "stabs" format.  This format is used by some systems that use
+   COFF or ELF where the stabs data is placed in a special section (as
+   well as with many old systems that used the a.out object file
+   format).  Avoid placing any object file format specific code in
+   this file.  */
 
 #include "defs.h"
 #include "bfd.h"
 #include "libaout.h"
 #include "aout/aout64.h"
 #include "gdb-stabs.h"
-#include "buildsym.h"
+#include "buildsym-legacy.h"
 #include "complaints.h"
 #include "demangle.h"
 #include "gdb-demangle.h"
 #include "language.h"
-#include "doublest.h"
+#include "target-float.h"
+#include "c-lang.h"
 #include "cp-abi.h"
 #include "cp-support.h"
 #include <ctype.h>
 
-/* Ask stabsread.h to define the vars it normally declares `extern'.  */
-#define        EXTERN
-/**/
-#include "stabsread.h"         /* Our own declarations */
-#undef EXTERN
+#include "stabsread.h"
 
-extern void _initialize_stabsread (void);
+/* See stabsread.h for these globals.  */
+unsigned int symnum;
+const char *(*next_symbol_text_func) (struct objfile *);
+unsigned char processing_gcc_compilation;
+int within_function;
+struct symbol *global_sym_chain[HASHSIZE];
+struct pending_stabs *global_stabs;
+int previous_stab_code;
+int *this_object_header_files;
+int n_this_object_header_files;
+int n_allocated_this_object_header_files;
 
 struct nextfield
 {
@@ -77,21 +85,23 @@ struct next_fnfieldlist
    This is part of some reorganization of low level C++ support and is
    expected to eventually go away...  (FIXME) */
 
-struct field_info
+struct stab_field_info
   {
-    struct nextfield *list;
-    struct next_fnfieldlist *fnlist;
+    struct nextfield *list = nullptr;
+    struct next_fnfieldlist *fnlist = nullptr;
+
+    auto_obstack obstack;
   };
 
 static void
-read_one_struct_field (struct field_info *, char **, char *,
+read_one_struct_field (struct stab_field_info *, const char **, const char *,
                       struct type *, struct objfile *);
 
 static struct type *dbx_alloc_type (int[2], struct objfile *);
 
-static long read_huge_number (char **, int, int *, int);
+static long read_huge_number (const char **, int, int *, int);
 
-static struct type *error_type (char **, struct objfile *);
+static struct type *error_type (const char **, struct objfile *);
 
 static void
 patch_block_stabs (struct pending *, struct pending_stabs *,
@@ -99,60 +109,63 @@ patch_block_stabs (struct pending *, struct pending_stabs *,
 
 static void fix_common_block (struct symbol *, CORE_ADDR);
 
-static int read_type_number (char **, int *);
+static int read_type_number (const char **, int *);
 
-static struct type *read_type (char **, struct objfile *);
+static struct type *read_type (const char **, struct objfile *);
 
-static struct type *read_range_type (char **, int[2], int, struct objfile *);
+static struct type *read_range_type (const char **, int[2],
+                                    int, struct objfile *);
 
-static struct type *read_sun_builtin_type (char **, int[2], struct objfile *);
+static struct type *read_sun_builtin_type (const char **,
+                                          int[2], struct objfile *);
 
-static struct type *read_sun_floating_type (char **, int[2],
+static struct type *read_sun_floating_type (const char **, int[2],
                                            struct objfile *);
 
-static struct type *read_enum_type (char **, struct type *, struct objfile *);
+static struct type *read_enum_type (const char **, struct type *, struct objfile *);
 
 static struct type *rs6000_builtin_type (int, struct objfile *);
 
 static int
-read_member_functions (struct field_info *, char **, struct type *,
+read_member_functions (struct stab_field_info *, const char **, struct type *,
                       struct objfile *);
 
 static int
-read_struct_fields (struct field_info *, char **, struct type *,
+read_struct_fields (struct stab_field_info *, const char **, struct type *,
                    struct objfile *);
 
 static int
-read_baseclasses (struct field_info *, char **, struct type *,
+read_baseclasses (struct stab_field_info *, const char **, struct type *,
                  struct objfile *);
 
 static int
-read_tilde_fields (struct field_info *, char **, struct type *,
+read_tilde_fields (struct stab_field_info *, const char **, struct type *,
                   struct objfile *);
 
-static int attach_fn_fields_to_type (struct field_info *, struct type *);
+static int attach_fn_fields_to_type (struct stab_field_info *, struct type *);
 
-static int attach_fields_to_type (struct field_info *, struct type *,
+static int attach_fields_to_type (struct stab_field_info *, struct type *,
                                  struct objfile *);
 
-static struct type *read_struct_type (char **, struct type *,
+static struct type *read_struct_type (const char **, struct type *,
                                       enum type_code,
                                      struct objfile *);
 
-static struct type *read_array_type (char **, struct type *,
+static struct type *read_array_type (const char **, struct type *,
                                     struct objfile *);
 
-static struct field *read_args (char **, int, struct objfile *, int *, int *);
+static struct field *read_args (const char **, int, struct objfile *,
+                               int *, int *);
 
 static void add_undefined_type (struct type *, int[2]);
 
 static int
-read_cpp_abbrev (struct field_info *, char **, struct type *,
+read_cpp_abbrev (struct stab_field_info *, const char **, struct type *,
                 struct objfile *);
 
-static char *find_name_end (char *name);
+static const char *find_name_end (const char *name);
 
-static int process_reference (char **string);
+static int process_reference (const char **string);
 
 void stabsread_clear_cache (void);
 
@@ -162,21 +175,20 @@ static const char vb_name[] = "_vb$";
 static void
 invalid_cpp_abbrev_complaint (const char *arg1)
 {
-  complaint (&symfile_complaints, _("invalid C++ abbreviation `%s'"), arg1);
+  complaint (_("invalid C++ abbreviation `%s'"), arg1);
 }
 
 static void
 reg_value_complaint (int regnum, int num_regs, const char *sym)
 {
-  complaint (&symfile_complaints,
-            _("bad register number %d (max %d) in symbol %s"),
+  complaint (_("bad register number %d (max %d) in symbol %s"),
              regnum, num_regs - 1, sym);
 }
 
 static void
 stabs_general_complaint (const char *arg1)
 {
-  complaint (&symfile_complaints, "%s", arg1);
+  complaint ("%s", arg1);
 }
 
 /* Make a list of forward references which haven't been defined.  */
@@ -247,8 +259,7 @@ dbx_lookup_type (int typenums[2], struct objfile *objfile)
 
   if (filenum < 0 || filenum >= n_this_object_header_files)
     {
-      complaint (&symfile_complaints,
-                _("Invalid symbol data: type number "
+      complaint (_("Invalid symbol data: type number "
                   "(%d,%d) out of range at symtab pos %d."),
                 filenum, index, symnum);
       goto error_return;
@@ -353,6 +364,24 @@ dbx_alloc_type (int typenums[2], struct objfile *objfile)
   return (*type_addr);
 }
 
+/* Allocate a floating-point type of size BITS.  */
+
+static struct type *
+dbx_init_float_type (struct objfile *objfile, int bits)
+{
+  struct gdbarch *gdbarch = objfile->arch ();
+  const struct floatformat **format;
+  struct type *type;
+
+  format = gdbarch_floatformat_for_type (gdbarch, NULL, bits);
+  if (format)
+    type = init_float_type (objfile, bits, NULL, format);
+  else
+    type = init_type (objfile, TYPE_CODE_ERROR, bits, NULL);
+
+  return type;
+}
+
 /* for all the stabs in a given stab vector, build appropriate types 
    and fix their symbols in given symbol vector.  */
 
@@ -362,7 +391,7 @@ patch_block_stabs (struct pending *symbols, struct pending_stabs *stabs,
 {
   int ii;
   char *name;
-  char *pp;
+  const char *pp;
   struct symbol *sym;
 
   if (stabs)
@@ -394,12 +423,11 @@ patch_block_stabs (struct pending *symbols, struct pending_stabs *stabs,
              /* On xcoff, if a global is defined and never referenced,
                 ld will remove it from the executable.  There is then
                 a N_GSYM stab for it, but no regular (C_EXT) symbol.  */
-             sym = allocate_symbol (objfile);
+             sym = new (&objfile->objfile_obstack) symbol;
              SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
              SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT;
-             SYMBOL_SET_LINKAGE_NAME
-               (sym, (char *) obstack_copy0 (&objfile->objfile_obstack,
-                                             name, pp - name));
+             sym->set_linkage_name
+               (obstack_strndup (&objfile->objfile_obstack, name, pp - name));
              pp += 2;
              if (*(pp - 1) == 'F' || *(pp - 1) == 'f')
                {
@@ -413,7 +441,7 @@ patch_block_stabs (struct pending *symbols, struct pending_stabs *stabs,
                {
                  SYMBOL_TYPE (sym) = read_type (&pp, objfile);
                }
-             add_symbol_to_list (sym, &global_symbols);
+             add_symbol_to_list (sym, get_global_symbols ());
            }
          else
            {
@@ -442,7 +470,7 @@ patch_block_stabs (struct pending *symbols, struct pending_stabs *stabs,
    Returns 0 for success, -1 for error.  */
 
 static int
-read_type_number (char **pp, int *typenums)
+read_type_number (const char **pp, int *typenums)
 {
   int nbits;
 
@@ -477,7 +505,7 @@ read_type_number (char **pp, int *typenums)
 
 struct ref_map
 {
-  char *stabs;
+  const char *stabs;
   CORE_ADDR value;
   struct symbol *sym;
 };
@@ -509,7 +537,7 @@ stabsread_clear_cache (void)
    find them, using their reference numbers as our index.
    These will be used later when we resolve references.  */
 void
-ref_add (int refnum, struct symbol *sym, char *stabs, CORE_ADDR value)
+ref_add (int refnum, struct symbol *sym, const char *stabs, CORE_ADDR value)
 {
   if (ref_count == 0)
     ref_chunk = 0;
@@ -544,9 +572,9 @@ ref_search (int refnum)
    reference number.  Move STRING beyond the reference id.  */
 
 static int
-process_reference (char **string)
+process_reference (const char **string)
 {
-  char *p;
+  const char *p;
   int refnum = 0;
 
   if (**string != '#')
@@ -569,9 +597,9 @@ process_reference (char **string)
    definition for later use.  Return the reference number.  */
 
 int
-symbol_reference_defined (char **string)
+symbol_reference_defined (const char **string)
 {
-  char *p = *string;
+  const char *p = *string;
   int refnum = 0;
 
   refnum = process_reference (&p);
@@ -597,14 +625,10 @@ stab_reg_to_regnum (struct symbol *sym, struct gdbarch *gdbarch)
 {
   int regno = gdbarch_stab_reg_to_regnum (gdbarch, SYMBOL_VALUE (sym));
 
-  if (regno < 0
-      || regno >= (gdbarch_num_regs (gdbarch)
-                  + gdbarch_num_pseudo_regs (gdbarch)))
+  if (regno < 0 || regno >= gdbarch_num_cooked_regs (gdbarch))
     {
-      reg_value_complaint (regno,
-                          gdbarch_num_regs (gdbarch)
-                            + gdbarch_num_pseudo_regs (gdbarch),
-                          SYMBOL_PRINT_NAME (sym));
+      reg_value_complaint (regno, gdbarch_num_cooked_regs (gdbarch),
+                          sym->print_name ());
 
       regno = gdbarch_sp_regnum (gdbarch); /* Known safe, though useless.  */
     }
@@ -622,16 +646,15 @@ static int stab_register_index;
 static int stab_regparm_index;
 
 struct symbol *
-define_symbol (CORE_ADDR valu, char *string, int desc, int type,
+define_symbol (CORE_ADDR valu, const char *string, int desc, int type,
               struct objfile *objfile)
 {
-  struct gdbarch *gdbarch = get_objfile_arch (objfile);
+  struct gdbarch *gdbarch = objfile->arch ();
   struct symbol *sym;
-  char *p = (char *) find_name_end (string);
+  const char *p = find_name_end (string);
   int deftype;
   int synonym = 0;
   int i;
-  char *new_name = NULL;
 
   /* We would like to eliminate nameless symbols, but keep their types.
      E.g. stab entry ":t10=*2" should produce a type 10, which is a pointer
@@ -654,7 +677,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       p = strchr (p, ':');
       if (p == NULL)
        {
-         complaint (&symfile_complaints, 
+         complaint (
                     _("Bad stabs string '%s'"), string);
          return NULL;
        }
@@ -664,7 +687,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
      e.g. ":t10=*2" or a nameless enum like " :T16=ered:0,green:1,blue:2,;" */
   nameless = (p == string || ((string[0] == ' ') && (string[1] == ':')));
 
-  current_symbol = sym = allocate_symbol (objfile);
+  current_symbol = sym = new (&objfile->objfile_obstack) symbol;
 
   if (processing_gcc_compilation)
     {
@@ -677,8 +700,8 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_LINE (sym) = 0;   /* unknown */
     }
 
-  SYMBOL_SET_LANGUAGE (sym, current_subfile->language,
-                      &objfile->objfile_obstack);
+  sym->set_language (get_current_subfile ()->language,
+                    &objfile->objfile_obstack);
 
   if (is_cplus_marker (string[0]))
     {
@@ -686,14 +709,14 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       switch (string[1])
        {
        case 't':
-         SYMBOL_SET_LINKAGE_NAME (sym, "this");
+         sym->set_linkage_name ("this");
          break;
 
        case 'v':               /* $vtbl_ptr_type */
          goto normal;
 
        case 'e':
-         SYMBOL_SET_LINKAGE_NAME (sym, "eh_throw");
+         sym->set_linkage_name ("eh_throw");
          break;
 
        case '_':
@@ -704,10 +727,10 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
          /* SunPRO (3.0 at least) static variable encoding.  */
          if (gdbarch_static_transform_name_p (gdbarch))
            goto normal;
-         /* ... fall through ...  */
+         /* fall through */
 
        default:
-         complaint (&symfile_complaints, _("Unknown C++ symbol name `%s'"),
+         complaint (_("Unknown C++ symbol name `%s'"),
                     string);
          goto normal;          /* Do *something* with it.  */
        }
@@ -715,7 +738,9 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
   else
     {
     normal:
-      if (SYMBOL_LANGUAGE (sym) == language_cplus)
+      gdb::unique_xmalloc_ptr<char> new_name;
+
+      if (sym->language () == language_cplus)
        {
          char *name = (char *) alloca (p - string + 1);
 
@@ -723,16 +748,15 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
          name[p - string] = '\0';
          new_name = cp_canonicalize_string (name);
        }
-      if (new_name != NULL)
-       {
-         SYMBOL_SET_NAMES (sym, new_name, strlen (new_name), 1, objfile);
-         xfree (new_name);
-       }
+      if (new_name != nullptr)
+       sym->compute_and_set_names (new_name.get (), true, objfile->per_bfd);
       else
-       SYMBOL_SET_NAMES (sym, string, p - string, 1, objfile);
+       sym->compute_and_set_names (gdb::string_view (string, p - string), true,
+                                   objfile->per_bfd);
 
-      if (SYMBOL_LANGUAGE (sym) == language_cplus)
-       cp_scan_for_anonymous_namespaces (sym, objfile);
+      if (sym->language () == language_cplus)
+       cp_scan_for_anonymous_namespaces (get_buildsym_compunit (), sym,
+                                         objfile);
 
     }
   p++;
@@ -768,7 +792,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
          SYMBOL_ACLASS_INDEX (sym) = LOC_CONST;
          SYMBOL_TYPE (sym) = error_type (&p, objfile);
          SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-         add_symbol_to_list (sym, &file_symbols);
+         add_symbol_to_list (sym, get_file_symbols ());
          return sym;
        }
       ++p;
@@ -776,19 +800,15 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
        {
        case 'r':
          {
-           double d = atof (p);
            gdb_byte *dbl_valu;
            struct type *dbl_type;
 
-           /* FIXME-if-picky-about-floating-accuracy: Should be using
-              target arithmetic to get the value.  real.c in GCC
-              probably has the necessary code.  */
-
            dbl_type = objfile_type (objfile)->builtin_double;
            dbl_valu
              = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
                                            TYPE_LENGTH (dbl_type));
-           store_typed_floating (dbl_valu, dbl_type, d);
+
+           target_float_from_string (dbl_valu, dbl_type, std::string (p));
 
            SYMBOL_TYPE (sym) = dbl_type;
            SYMBOL_VALUE_BYTES (sym) = dbl_valu;
@@ -831,7 +851,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
                SYMBOL_ACLASS_INDEX (sym) = LOC_CONST;
                SYMBOL_TYPE (sym) = error_type (&p, objfile);
                SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-               add_symbol_to_list (sym, &file_symbols);
+               add_symbol_to_list (sym, get_file_symbols ());
                return sym;
              }
 
@@ -856,7 +876,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
                SYMBOL_ACLASS_INDEX (sym) = LOC_CONST;
                SYMBOL_TYPE (sym) = error_type (&p, objfile);
                SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-               add_symbol_to_list (sym, &file_symbols);
+               add_symbol_to_list (sym, get_file_symbols ());
                return sym;
              }
 
@@ -911,7 +931,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
          }
        }
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &file_symbols);
+      add_symbol_to_list (sym, get_file_symbols ());
       return sym;
 
     case 'C':
@@ -919,8 +939,8 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_ACLASS_INDEX (sym) = LOC_LABEL;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      SYMBOL_VALUE_ADDRESS (sym) = valu;
-      add_symbol_to_list (sym, &local_symbols);
+      SET_SYMBOL_VALUE_ADDRESS (sym, valu);
+      add_symbol_to_list (sym, get_local_symbols ());
       break;
 
     case 'f':
@@ -928,14 +948,14 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &file_symbols);
+      add_symbol_to_list (sym, get_file_symbols ());
       /* fall into process_function_types.  */
 
     process_function_types:
       /* Function result types are described as the result type in stabs.
          We need to convert this to the function-returning-type-X type
          in GDB.  E.g. "int" is converted to "function returning int".  */
-      if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_FUNC)
+      if (SYMBOL_TYPE (sym)->code () != TYPE_CODE_FUNC)
        SYMBOL_TYPE (sym) = lookup_function_type (SYMBOL_TYPE (sym));
 
       /* All functions in C++ have prototypes.  Stabs does not offer an
@@ -955,7 +975,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
          struct type *ftype = SYMBOL_TYPE (sym);
          int nsemi = 0;
          int nparams = 0;
-         char *p1 = p;
+         const char *p1 = p;
 
          /* Obtain a worst case guess for the number of arguments
             by counting the semicolons.  */
@@ -966,8 +986,9 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
            }
 
          /* Allocate parameter information fields and fill them in.  */
-         TYPE_FIELDS (ftype) = (struct field *)
-           TYPE_ALLOC (ftype, nsemi * sizeof (struct field));
+         ftype->set_fields
+           ((struct field *)
+            TYPE_ALLOC (ftype, nsemi * sizeof (struct field)));
          while (*p++ == ';')
            {
              struct type *ptype;
@@ -984,12 +1005,12 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
                 a TYPE_CODE_VOID type by read_type, and we have to turn
                 it back into builtin_int here.
                 FIXME: Do we need a new builtin_promoted_int_arg ?  */
-             if (TYPE_CODE (ptype) == TYPE_CODE_VOID)
+             if (ptype->code () == TYPE_CODE_VOID)
                ptype = objfile_type (objfile)->builtin_int;
              TYPE_FIELD_TYPE (ftype, nparams) = ptype;
              TYPE_FIELD_ARTIFICIAL (ftype, nparams++) = 0;
            }
-         TYPE_NFIELDS (ftype) = nparams;
+         ftype->set_num_fields (nparams);
          TYPE_PROTOTYPED (ftype) = 1;
        }
       break;
@@ -999,7 +1020,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &global_symbols);
+      add_symbol_to_list (sym, get_global_symbols ());
       goto process_function_types;
 
     case 'G':
@@ -1014,13 +1035,13 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
          Symbol references don't have valid names and wont't match up with
          minimal symbols when the global_sym_chain is relocated.
          We'll fixup symbol references when we fixup the defining symbol.  */
-      if (SYMBOL_LINKAGE_NAME (sym) && SYMBOL_LINKAGE_NAME (sym)[0] != '#')
+      if (sym->linkage_name () && sym->linkage_name ()[0] != '#')
        {
-         i = hashname (SYMBOL_LINKAGE_NAME (sym));
+         i = hashname (sym->linkage_name ());
          SYMBOL_VALUE_CHAIN (sym) = global_sym_chain[i];
          global_sym_chain[i] = sym;
        }
-      add_symbol_to_list (sym, &global_symbols);
+      add_symbol_to_list (sym, get_global_symbols ());
       break;
 
       /* This case is faked by a conditional above,
@@ -1032,7 +1053,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_ACLASS_INDEX (sym) = LOC_LOCAL;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &local_symbols);
+      add_symbol_to_list (sym, get_local_symbols ());
       break;
 
     case 'p':
@@ -1053,7 +1074,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
       SYMBOL_IS_ARGUMENT (sym) = 1;
-      add_symbol_to_list (sym, &local_symbols);
+      add_symbol_to_list (sym, get_local_symbols ());
 
       if (gdbarch_byte_order (gdbarch) != BFD_ENDIAN_BIG)
        {
@@ -1073,7 +1094,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
             really an int.  */
          if (TYPE_LENGTH (SYMBOL_TYPE (sym))
              < gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT
-             && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
+             && SYMBOL_TYPE (sym)->code () == TYPE_CODE_INT)
            {
              SYMBOL_TYPE (sym) =
                TYPE_UNSIGNED (SYMBOL_TYPE (sym))
@@ -1082,6 +1103,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
            }
          break;
        }
+      /* Fall through.  */
 
     case 'P':
       /* acc seems to use P to declare the prototypes of functions that
@@ -1101,7 +1123,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_IS_ARGUMENT (sym) = 1;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &local_symbols);
+      add_symbol_to_list (sym, get_local_symbols ());
       break;
 
     case 'r':
@@ -1116,8 +1138,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
             the same name to represent an argument passed in a
             register.  GCC uses 'P' for the same case.  So if we find
             such a symbol pair we combine it into one 'P' symbol.
-            For Sun cc we need to do this regardless of
-            stabs_argument_has_addr, because the compiler puts out
+            For Sun cc we need to do this regardless of stabs_argument_has_addr, because the compiler puts out
             the 'p' symbol even if it never saves the argument onto
             the stack.
 
@@ -1132,6 +1153,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
             but this case is considered pathological and causes a warning
             from a decent compiler.  */
 
+         struct pending *local_symbols = *get_local_symbols ();
          if (local_symbols
              && local_symbols->nsyms > 0
              && gdbarch_stabs_argument_has_addr (gdbarch, SYMBOL_TYPE (sym)))
@@ -1141,8 +1163,8 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
              prev_sym = local_symbols->symbol[local_symbols->nsyms - 1];
              if ((SYMBOL_CLASS (prev_sym) == LOC_REF_ARG
                   || SYMBOL_CLASS (prev_sym) == LOC_ARG)
-                 && strcmp (SYMBOL_LINKAGE_NAME (prev_sym),
-                            SYMBOL_LINKAGE_NAME (sym)) == 0)
+                 && strcmp (prev_sym->linkage_name (),
+                            sym->linkage_name ()) == 0)
                {
                  SYMBOL_ACLASS_INDEX (prev_sym) = stab_register_index;
                  /* Use the type from the LOC_REGISTER; that is the type
@@ -1153,37 +1175,36 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
                  break;
                }
            }
-         add_symbol_to_list (sym, &local_symbols);
+         add_symbol_to_list (sym, get_local_symbols ());
        }
       else
-       add_symbol_to_list (sym, &file_symbols);
+       add_symbol_to_list (sym, get_file_symbols ());
       break;
 
     case 'S':
       /* Static symbol at top level of file.  */
       SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
-      SYMBOL_VALUE_ADDRESS (sym) = valu;
+      SET_SYMBOL_VALUE_ADDRESS (sym, valu);
       if (gdbarch_static_transform_name_p (gdbarch)
-         && gdbarch_static_transform_name (gdbarch,
-                                           SYMBOL_LINKAGE_NAME (sym))
-            != SYMBOL_LINKAGE_NAME (sym))
+         && gdbarch_static_transform_name (gdbarch, sym->linkage_name ())
+            != sym->linkage_name ())
        {
          struct bound_minimal_symbol msym;
 
-         msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
-                                       NULL, objfile);
+         msym = lookup_minimal_symbol (sym->linkage_name (), NULL, objfile);
          if (msym.minsym != NULL)
            {
              const char *new_name = gdbarch_static_transform_name
-               (gdbarch, SYMBOL_LINKAGE_NAME (sym));
+               (gdbarch, sym->linkage_name ());
 
-             SYMBOL_SET_LINKAGE_NAME (sym, new_name);
-             SYMBOL_VALUE_ADDRESS (sym) = BMSYMBOL_VALUE_ADDRESS (msym);
+             sym->set_linkage_name (new_name);
+             SET_SYMBOL_VALUE_ADDRESS (sym,
+                                       BMSYMBOL_VALUE_ADDRESS (msym));
            }
        }
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &file_symbols);
+      add_symbol_to_list (sym, get_file_symbols ());
       break;
 
     case 't':
@@ -1201,7 +1222,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
          This is important to do, because of forward references:
          The cleanup of undefined types stored in undef_types only uses
          STRUCT_DOMAIN symbols to perform the replacement.  */
-      synonym = (SYMBOL_LANGUAGE (sym) == language_ada && p[-2] != 'T');
+      synonym = (sym->language () == language_ada && p[-2] != 'T');
 
       /* Typedef */
       SYMBOL_TYPE (sym) = read_type (&p, objfile);
@@ -1218,9 +1239,9 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
          a base type which did not have its name defined when the
          derived class was output.  We fill in the derived class's
          base part member's name here in that case.  */
-      if (TYPE_NAME (SYMBOL_TYPE (sym)) != NULL)
-       if ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
-            || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION)
+      if (SYMBOL_TYPE (sym)->name () != NULL)
+       if ((SYMBOL_TYPE (sym)->code () == TYPE_CODE_STRUCT
+            || SYMBOL_TYPE (sym)->code () == TYPE_CODE_UNION)
            && TYPE_N_BASECLASSES (SYMBOL_TYPE (sym)))
          {
            int j;
@@ -1228,19 +1249,14 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
            for (j = TYPE_N_BASECLASSES (SYMBOL_TYPE (sym)) - 1; j >= 0; j--)
              if (TYPE_BASECLASS_NAME (SYMBOL_TYPE (sym), j) == 0)
                TYPE_BASECLASS_NAME (SYMBOL_TYPE (sym), j) =
-                 type_name_no_tag (TYPE_BASECLASS (SYMBOL_TYPE (sym), j));
+                 TYPE_BASECLASS (SYMBOL_TYPE (sym), j)->name ();
          }
 
-      if (TYPE_NAME (SYMBOL_TYPE (sym)) == NULL)
+      if (SYMBOL_TYPE (sym)->name () == NULL)
        {
-         /* gcc-2.6 or later (when using -fvtable-thunks)
-            emits a unique named type for a vtable entry.
-            Some gdb code depends on that specific name.  */
-         extern const char vtbl_ptr_name[];
-
-         if ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR
-              && strcmp (SYMBOL_LINKAGE_NAME (sym), vtbl_ptr_name))
-             || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FUNC)
+         if ((SYMBOL_TYPE (sym)->code () == TYPE_CODE_PTR
+              && strcmp (sym->linkage_name (), vtbl_ptr_name))
+             || SYMBOL_TYPE (sym)->code () == TYPE_CODE_FUNC)
            {
              /* If we are giving a name to a type such as "pointer to
                 foo" or "function returning foo", we better not set
@@ -1278,34 +1294,31 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
                 */
 
              /* Pascal accepts names for pointer types.  */
-             if (current_subfile->language == language_pascal)
-               {
-                 TYPE_NAME (SYMBOL_TYPE (sym)) = SYMBOL_LINKAGE_NAME (sym);
-               }
+             if (get_current_subfile ()->language == language_pascal)
+               SYMBOL_TYPE (sym)->set_name (sym->linkage_name ());
            }
          else
-           TYPE_NAME (SYMBOL_TYPE (sym)) = SYMBOL_LINKAGE_NAME (sym);
+           SYMBOL_TYPE (sym)->set_name (sym->linkage_name ());
        }
 
-      add_symbol_to_list (sym, &file_symbols);
+      add_symbol_to_list (sym, get_file_symbols ());
 
       if (synonym)
         {
           /* Create the STRUCT_DOMAIN clone.  */
-          struct symbol *struct_sym = allocate_symbol (objfile);
+          struct symbol *struct_sym = new (&objfile->objfile_obstack) symbol;
 
           *struct_sym = *sym;
           SYMBOL_ACLASS_INDEX (struct_sym) = LOC_TYPEDEF;
           SYMBOL_VALUE (struct_sym) = valu;
           SYMBOL_DOMAIN (struct_sym) = STRUCT_DOMAIN;
-          if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
-            TYPE_NAME (SYMBOL_TYPE (sym))
-             = obconcat (&objfile->objfile_obstack,
-                         SYMBOL_LINKAGE_NAME (sym),
-                         (char *) NULL);
-          add_symbol_to_list (struct_sym, &file_symbols);
+          if (SYMBOL_TYPE (sym)->name () == 0)
+           SYMBOL_TYPE (sym)->set_name
+             (obconcat (&objfile->objfile_obstack, sym->linkage_name (),
+                        (char *) NULL));
+          add_symbol_to_list (struct_sym, get_file_symbols ());
         }
-      
+
       break;
 
     case 'T':
@@ -1326,28 +1339,26 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
-      if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
-       TYPE_TAG_NAME (SYMBOL_TYPE (sym))
-         = obconcat (&objfile->objfile_obstack,
-                     SYMBOL_LINKAGE_NAME (sym),
-                     (char *) NULL);
-      add_symbol_to_list (sym, &file_symbols);
+      if (SYMBOL_TYPE (sym)->name () == 0)
+       SYMBOL_TYPE (sym)->set_name
+         (obconcat (&objfile->objfile_obstack, sym->linkage_name (),
+                    (char *) NULL));
+      add_symbol_to_list (sym, get_file_symbols ());
 
       if (synonym)
        {
          /* Clone the sym and then modify it.  */
-         struct symbol *typedef_sym = allocate_symbol (objfile);
+         struct symbol *typedef_sym = new (&objfile->objfile_obstack) symbol;
 
          *typedef_sym = *sym;
          SYMBOL_ACLASS_INDEX (typedef_sym) = LOC_TYPEDEF;
          SYMBOL_VALUE (typedef_sym) = valu;
          SYMBOL_DOMAIN (typedef_sym) = VAR_DOMAIN;
-         if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
-           TYPE_NAME (SYMBOL_TYPE (sym))
-             = obconcat (&objfile->objfile_obstack,
-                         SYMBOL_LINKAGE_NAME (sym),
-                         (char *) NULL);
-         add_symbol_to_list (typedef_sym, &file_symbols);
+         if (SYMBOL_TYPE (sym)->name () == 0)
+           SYMBOL_TYPE (sym)->set_name
+             (obconcat (&objfile->objfile_obstack, sym->linkage_name (),
+                        (char *) NULL));
+         add_symbol_to_list (typedef_sym, get_file_symbols ());
        }
       break;
 
@@ -1355,27 +1366,25 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       /* Static symbol of local scope.  */
       SYMBOL_TYPE (sym) = read_type (&p, objfile);
       SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
-      SYMBOL_VALUE_ADDRESS (sym) = valu;
+      SET_SYMBOL_VALUE_ADDRESS (sym, valu);
       if (gdbarch_static_transform_name_p (gdbarch)
-         && gdbarch_static_transform_name (gdbarch,
-                                           SYMBOL_LINKAGE_NAME (sym))
-            != SYMBOL_LINKAGE_NAME (sym))
+         && gdbarch_static_transform_name (gdbarch, sym->linkage_name ())
+            != sym->linkage_name ())
        {
          struct bound_minimal_symbol msym;
 
-         msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym), 
-                                       NULL, objfile);
+         msym = lookup_minimal_symbol (sym->linkage_name (), NULL, objfile);
          if (msym.minsym != NULL)
            {
              const char *new_name = gdbarch_static_transform_name
-               (gdbarch, SYMBOL_LINKAGE_NAME (sym));
+               (gdbarch, sym->linkage_name ());
 
-             SYMBOL_SET_LINKAGE_NAME (sym, new_name);
-             SYMBOL_VALUE_ADDRESS (sym) = BMSYMBOL_VALUE_ADDRESS (msym);
+             sym->set_linkage_name (new_name);
+             SET_SYMBOL_VALUE_ADDRESS (sym, BMSYMBOL_VALUE_ADDRESS (msym));
            }
        }
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-       add_symbol_to_list (sym, &local_symbols);
+       add_symbol_to_list (sym, get_local_symbols ());
       break;
 
     case 'v':
@@ -1385,7 +1394,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_IS_ARGUMENT (sym) = 1;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &local_symbols);
+      add_symbol_to_list (sym, get_local_symbols ());
       break;
 
     case 'a':
@@ -1395,7 +1404,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_IS_ARGUMENT (sym) = 1;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &local_symbols);
+      add_symbol_to_list (sym, get_local_symbols ());
       break;
 
     case 'X':
@@ -1407,7 +1416,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_ACLASS_INDEX (sym) = LOC_LOCAL;
       SYMBOL_VALUE (sym) = valu;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &local_symbols);
+      add_symbol_to_list (sym, get_local_symbols ());
       break;
 
     default:
@@ -1415,7 +1424,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_ACLASS_INDEX (sym) = LOC_CONST;
       SYMBOL_VALUE (sym) = 0;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-      add_symbol_to_list (sym, &file_symbols);
+      add_symbol_to_list (sym, get_file_symbols ());
       break;
     }
 
@@ -1469,10 +1478,9 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
    debugger will be able to read the new symbol tables.  */
 
 static struct type *
-error_type (char **pp, struct objfile *objfile)
+error_type (const char **pp, struct objfile *objfile)
 {
-  complaint (&symfile_complaints,
-            _("couldn't parse type; debugger out of date?"));
+  complaint (_("couldn't parse type; debugger out of date?"));
   while (1)
     {
       /* Skip to end of symbol.  */
@@ -1502,7 +1510,7 @@ error_type (char **pp, struct objfile *objfile)
    deciding whether to call read_type.  */
 
 static struct type *
-read_type (char **pp, struct objfile *objfile)
+read_type (const char **pp, struct objfile *objfile)
 {
   struct type *type = 0;
   struct type *type1;
@@ -1539,7 +1547,7 @@ read_type (char **pp, struct objfile *objfile)
           /* If this is a forward reference, arrange to complain if it
              doesn't get patched up by the time we're done
              reading.  */
-          if (TYPE_CODE (type) == TYPE_CODE_UNDEF)
+          if (type->code () == TYPE_CODE_UNDEF)
             add_undefined_type (type, typenums);
 
           return type;
@@ -1574,7 +1582,7 @@ again:
        char *type_name;
 
        {
-         char *from, *to, *p, *q1, *q2;
+         const char *from, *p, *q1, *q2;
 
          /* Set the type code according to the following letter.  */
          switch ((*pp)[0])
@@ -1592,8 +1600,7 @@ again:
              {
                /* Complain and keep going, so compilers can invent new
                   cross-reference types.  */
-               complaint (&symfile_complaints,
-                          _("Unrecognized cross-reference type `%c'"),
+               complaint (_("Unrecognized cross-reference type `%c'"),
                           (*pp)[0]);
                code = TYPE_CODE_STRUCT;
                break;
@@ -1622,24 +1629,21 @@ again:
                return error_type (pp, objfile);
            }
          type_name = NULL;
-         if (current_subfile->language == language_cplus)
+         if (get_current_subfile ()->language == language_cplus)
            {
-             char *new_name, *name = (char *) alloca (p - *pp + 1);
+             char *name = (char *) alloca (p - *pp + 1);
 
              memcpy (name, *pp, p - *pp);
              name[p - *pp] = '\0';
-             new_name = cp_canonicalize_string (name);
-             if (new_name != NULL)
-               {
-                 type_name
-                   = (char *) obstack_copy0 (&objfile->objfile_obstack,
-                                             new_name, strlen (new_name));
-                 xfree (new_name);
-               }
+
+             gdb::unique_xmalloc_ptr<char> new_name = cp_canonicalize_string (name);
+             if (new_name != nullptr)
+               type_name = obstack_strdup (&objfile->objfile_obstack,
+                                           new_name.get ());
            }
          if (type_name == NULL)
            {
-             to = type_name = (char *)
+             char *to = type_name = (char *)
                obstack_alloc (&objfile->objfile_obstack, p - *pp + 1);
 
              /* Copy the name.  */
@@ -1658,15 +1662,15 @@ again:
            type, rather than allocating a new one.  This saves some
            memory.  */
 
-       for (ppt = file_symbols; ppt; ppt = ppt->next)
+       for (ppt = *get_file_symbols (); ppt; ppt = ppt->next)
          for (i = 0; i < ppt->nsyms; i++)
            {
              struct symbol *sym = ppt->symbol[i];
 
              if (SYMBOL_CLASS (sym) == LOC_TYPEDEF
                  && SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN
-                 && (TYPE_CODE (SYMBOL_TYPE (sym)) == code)
-                 && strcmp (SYMBOL_LINKAGE_NAME (sym), type_name) == 0)
+                 && (SYMBOL_TYPE (sym)->code () == code)
+                 && strcmp (sym->linkage_name (), type_name) == 0)
                {
                  obstack_free (&objfile->objfile_obstack, type_name);
                  type = SYMBOL_TYPE (sym);
@@ -1682,8 +1686,8 @@ again:
           fill in the rest of the fields when we get the full
           type.  */
        type = dbx_alloc_type (typenums, objfile);
-       TYPE_CODE (type) = code;
-       TYPE_TAG_NAME (type) = type_name;
+       type->set_code (code);
+       type->set_name (type_name);
        INIT_CPLUS_SPECIFIC (type);
        TYPE_STUB (type) = 1;
 
@@ -1711,14 +1715,14 @@ again:
       /* Allocate and enter the typedef type first.
          This handles recursive types.  */
       type = dbx_alloc_type (typenums, objfile);
-      TYPE_CODE (type) = TYPE_CODE_TYPEDEF;
+      type->set_code (TYPE_CODE_TYPEDEF);
       {
        struct type *xtype = read_type (pp, objfile);
 
        if (type == xtype)
          {
            /* It's being defined as itself.  That means it is "void".  */
-           TYPE_CODE (type) = TYPE_CODE_VOID;
+           type->set_code (TYPE_CODE_VOID);
            TYPE_LENGTH (type) = 1;
          }
        else if (type_size >= 0 || is_string)
@@ -1747,8 +1751,7 @@ again:
                "complete_this_type" function, but never create unnecessary
                copies of a type otherwise.  */
            replace_type (type, xtype);
-           TYPE_NAME (type) = NULL;
-           TYPE_TAG_NAME (type) = NULL;
+           type->set_name (NULL);
          }
        else
          {
@@ -1772,7 +1775,8 @@ again:
 
     case '&':                  /* Reference to another type */
       type1 = read_type (pp, objfile);
-      type = make_reference_type (type1, dbx_lookup_type (typenums, objfile));
+      type = make_reference_type (type1, dbx_lookup_type (typenums, objfile),
+                                  TYPE_CODE_REF);
       break;
 
     case 'f':                  /* Function returning another type */
@@ -1821,8 +1825,7 @@ again:
           ++*pp;
         else
           {
-           complaint (&symfile_complaints,
-                      _("Prototyped function type didn't "
+           complaint (_("Prototyped function type didn't "
                         "end arguments with `#':\n%s"),
                       type_start);
           }
@@ -1831,13 +1834,13 @@ again:
            that's just an empty argument list.  */
         if (arg_types
             && ! arg_types->next
-            && TYPE_CODE (arg_types->type) == TYPE_CODE_VOID)
+            && arg_types->type->code () == TYPE_CODE_VOID)
           num_args = 0;
 
-        TYPE_FIELDS (func_type)
-          = (struct field *) TYPE_ALLOC (func_type,
-                                         num_args * sizeof (struct field));
-        memset (TYPE_FIELDS (func_type), 0, num_args * sizeof (struct field));
+       func_type->set_fields
+         ((struct field *) TYPE_ALLOC (func_type,
+                                       num_args * sizeof (struct field)));
+        memset (func_type->fields (), 0, num_args * sizeof (struct field));
         {
           int i;
           struct type_list *t;
@@ -1848,7 +1851,7 @@ again:
           for (t = arg_types, i = num_args - 1; t; t = t->next, i--)
             TYPE_FIELD_TYPE (func_type, i) = t->type;
         }
-        TYPE_NFIELDS (func_type) = num_args;
+        func_type->set_num_fields (num_args);
         TYPE_PROTOTYPED (func_type) = 1;
 
         type = func_type;
@@ -1887,7 +1890,7 @@ again:
       else
        /* type attribute */
        {
-         char *attr = *pp;
+         const char *attr = *pp;
 
          /* Skip to the semicolon.  */
          while (**pp != ';' && **pp != '\0')
@@ -1934,8 +1937,7 @@ again:
          (*pp)++;
          return_type = read_type (pp, objfile);
          if (*(*pp)++ != ';')
-           complaint (&symfile_complaints,
-                      _("invalid (minimal) member type "
+           complaint (_("invalid (minimal) member type "
                         "data format at symtab pos %d."),
                       symnum);
          type = allocate_stub_method (return_type);
@@ -2019,14 +2021,14 @@ again:
       type = dbx_alloc_type (typenums, objfile);
       type = read_array_type (pp, type, objfile);
       if (is_string)
-       TYPE_CODE (type) = TYPE_CODE_STRING;
+       type->set_code (TYPE_CODE_STRING);
       if (is_vector)
        make_vector_type (type);
       break;
 
     case 'S':                  /* Set type */
       type1 = read_type (pp, objfile);
-      type = create_set_type ((struct type *) NULL, type1);
+      type = create_set_type (NULL, type1);
       if (typenums[0] != -1)
        *dbx_lookup_type (typenums, objfile) = type;
       break;
@@ -2053,13 +2055,14 @@ again:
 /* RS/6000 xlc/dbx combination uses a set of builtin types, starting from -1.
    Return the proper type node for a given builtin type number.  */
 
-static const struct objfile_data *rs6000_builtin_type_data;
+static const struct objfile_key<struct type *,
+                               gdb::noop_deleter<struct type *>>
+  rs6000_builtin_type_data;
 
 static struct type *
 rs6000_builtin_type (int typenum, struct objfile *objfile)
 {
-  struct type **negative_types
-    = (struct type **) objfile_data (objfile, rs6000_builtin_type_data);
+  struct type **negative_types = rs6000_builtin_type_data.get (objfile);
 
   /* We recognize types numbered from -NUMBER_RECOGNIZED to -1.  */
 #define NUMBER_RECOGNIZED 34
@@ -2067,7 +2070,7 @@ rs6000_builtin_type (int typenum, struct objfile *objfile)
 
   if (typenum >= 0 || typenum < -NUMBER_RECOGNIZED)
     {
-      complaint (&symfile_complaints, _("Unknown builtin type %d"), typenum);
+      complaint (_("Unknown builtin type %d"), typenum);
       return objfile_type (objfile)->builtin_error;
     }
 
@@ -2076,7 +2079,7 @@ rs6000_builtin_type (int typenum, struct objfile *objfile)
       /* This includes an empty slot for type number -0.  */
       negative_types = OBSTACK_CALLOC (&objfile->objfile_obstack,
                                       NUMBER_RECOGNIZED + 1, struct type *);
-      set_objfile_data (objfile, rs6000_builtin_type_data, negative_types);
+      rs6000_builtin_type_data.set (objfile, negative_types);
     }
 
   if (negative_types[-typenum] != NULL)
@@ -2098,130 +2101,121 @@ rs6000_builtin_type (int typenum, struct objfile *objfile)
          is other than 32 bits, then it should use a new negative type
          number (or avoid negative type numbers for that case).
          See stabs.texinfo.  */
-      rettype = init_type (TYPE_CODE_INT, 4, 0, "int", objfile);
+      rettype = init_integer_type (objfile, 32, 0, "int");
       break;
     case 2:
-      rettype = init_type (TYPE_CODE_INT, 1, 0, "char", objfile);
+      rettype = init_integer_type (objfile, 8, 0, "char");
+      TYPE_NOSIGN (rettype) = 1;
       break;
     case 3:
-      rettype = init_type (TYPE_CODE_INT, 2, 0, "short", objfile);
+      rettype = init_integer_type (objfile, 16, 0, "short");
       break;
     case 4:
-      rettype = init_type (TYPE_CODE_INT, 4, 0, "long", objfile);
+      rettype = init_integer_type (objfile, 32, 0, "long");
       break;
     case 5:
-      rettype = init_type (TYPE_CODE_INT, 1, TYPE_FLAG_UNSIGNED,
-                          "unsigned char", objfile);
+      rettype = init_integer_type (objfile, 8, 1, "unsigned char");
       break;
     case 6:
-      rettype = init_type (TYPE_CODE_INT, 1, 0, "signed char", objfile);
+      rettype = init_integer_type (objfile, 8, 0, "signed char");
       break;
     case 7:
-      rettype = init_type (TYPE_CODE_INT, 2, TYPE_FLAG_UNSIGNED,
-                          "unsigned short", objfile);
+      rettype = init_integer_type (objfile, 16, 1, "unsigned short");
       break;
     case 8:
-      rettype = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED,
-                          "unsigned int", objfile);
+      rettype = init_integer_type (objfile, 32, 1, "unsigned int");
       break;
     case 9:
-      rettype = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED,
-                          "unsigned", objfile);
+      rettype = init_integer_type (objfile, 32, 1, "unsigned");
       break;
     case 10:
-      rettype = init_type (TYPE_CODE_INT, 4, TYPE_FLAG_UNSIGNED,
-                          "unsigned long", objfile);
+      rettype = init_integer_type (objfile, 32, 1, "unsigned long");
       break;
     case 11:
-      rettype = init_type (TYPE_CODE_VOID, 1, 0, "void", objfile);
+      rettype = init_type (objfile, TYPE_CODE_VOID, TARGET_CHAR_BIT, "void");
       break;
     case 12:
       /* IEEE single precision (32 bit).  */
-      rettype = init_type (TYPE_CODE_FLT, 4, 0, "float", objfile);
+      rettype = init_float_type (objfile, 32, "float",
+                                floatformats_ieee_single);
       break;
     case 13:
       /* IEEE double precision (64 bit).  */
-      rettype = init_type (TYPE_CODE_FLT, 8, 0, "double", objfile);
+      rettype = init_float_type (objfile, 64, "double",
+                                floatformats_ieee_double);
       break;
     case 14:
       /* This is an IEEE double on the RS/6000, and different machines with
          different sizes for "long double" should use different negative
          type numbers.  See stabs.texinfo.  */
-      rettype = init_type (TYPE_CODE_FLT, 8, 0, "long double", objfile);
+      rettype = init_float_type (objfile, 64, "long double",
+                                floatformats_ieee_double);
       break;
     case 15:
-      rettype = init_type (TYPE_CODE_INT, 4, 0, "integer", objfile);
+      rettype = init_integer_type (objfile, 32, 0, "integer");
       break;
     case 16:
-      rettype = init_type (TYPE_CODE_BOOL, 4, TYPE_FLAG_UNSIGNED,
-                          "boolean", objfile);
+      rettype = init_boolean_type (objfile, 32, 1, "boolean");
       break;
     case 17:
-      rettype = init_type (TYPE_CODE_FLT, 4, 0, "short real", objfile);
+      rettype = init_float_type (objfile, 32, "short real",
+                                floatformats_ieee_single);
       break;
     case 18:
-      rettype = init_type (TYPE_CODE_FLT, 8, 0, "real", objfile);
+      rettype = init_float_type (objfile, 64, "real",
+                                floatformats_ieee_double);
       break;
     case 19:
-      rettype = init_type (TYPE_CODE_ERROR, 0, 0, "stringptr", objfile);
+      rettype = init_type (objfile, TYPE_CODE_ERROR, 0, "stringptr");
       break;
     case 20:
-      rettype = init_type (TYPE_CODE_CHAR, 1, TYPE_FLAG_UNSIGNED,
-                          "character", objfile);
+      rettype = init_character_type (objfile, 8, 1, "character");
       break;
     case 21:
-      rettype = init_type (TYPE_CODE_BOOL, 1, TYPE_FLAG_UNSIGNED,
-                          "logical*1", objfile);
+      rettype = init_boolean_type (objfile, 8, 1, "logical*1");
       break;
     case 22:
-      rettype = init_type (TYPE_CODE_BOOL, 2, TYPE_FLAG_UNSIGNED,
-                          "logical*2", objfile);
+      rettype = init_boolean_type (objfile, 16, 1, "logical*2");
       break;
     case 23:
-      rettype = init_type (TYPE_CODE_BOOL, 4, TYPE_FLAG_UNSIGNED,
-                          "logical*4", objfile);
+      rettype = init_boolean_type (objfile, 32, 1, "logical*4");
       break;
     case 24:
-      rettype = init_type (TYPE_CODE_BOOL, 4, TYPE_FLAG_UNSIGNED,
-                          "logical", objfile);
+      rettype = init_boolean_type (objfile, 32, 1, "logical");
       break;
     case 25:
       /* Complex type consisting of two IEEE single precision values.  */
-      rettype = init_type (TYPE_CODE_COMPLEX, 8, 0, "complex", objfile);
-      TYPE_TARGET_TYPE (rettype) = init_type (TYPE_CODE_FLT, 4, 0, "float",
-                                             objfile);
+      rettype = init_complex_type ("complex",
+                                  rs6000_builtin_type (12, objfile));
       break;
     case 26:
       /* Complex type consisting of two IEEE double precision values.  */
-      rettype = init_type (TYPE_CODE_COMPLEX, 16, 0, "double complex", NULL);
-      TYPE_TARGET_TYPE (rettype) = init_type (TYPE_CODE_FLT, 8, 0, "double",
-                                             objfile);
+      rettype = init_complex_type ("double complex",
+                                  rs6000_builtin_type (13, objfile));
       break;
     case 27:
-      rettype = init_type (TYPE_CODE_INT, 1, 0, "integer*1", objfile);
+      rettype = init_integer_type (objfile, 8, 0, "integer*1");
       break;
     case 28:
-      rettype = init_type (TYPE_CODE_INT, 2, 0, "integer*2", objfile);
+      rettype = init_integer_type (objfile, 16, 0, "integer*2");
       break;
     case 29:
-      rettype = init_type (TYPE_CODE_INT, 4, 0, "integer*4", objfile);
+      rettype = init_integer_type (objfile, 32, 0, "integer*4");
       break;
     case 30:
-      rettype = init_type (TYPE_CODE_CHAR, 2, 0, "wchar", objfile);
+      rettype = init_character_type (objfile, 16, 0, "wchar");
       break;
     case 31:
-      rettype = init_type (TYPE_CODE_INT, 8, 0, "long long", objfile);
+      rettype = init_integer_type (objfile, 64, 0, "long long");
       break;
     case 32:
-      rettype = init_type (TYPE_CODE_INT, 8, TYPE_FLAG_UNSIGNED,
-                          "unsigned long long", objfile);
+      rettype = init_integer_type (objfile, 64, 1, "unsigned long long");
       break;
     case 33:
-      rettype = init_type (TYPE_CODE_INT, 8, TYPE_FLAG_UNSIGNED,
-                          "logical*8", objfile);
+      rettype = init_integer_type (objfile, 64, 1, "logical*8");
       break;
     case 34:
-      rettype = init_type (TYPE_CODE_INT, 8, 0, "integer*8", objfile);
+      rettype = init_integer_type (objfile, 64, 0, "integer*8");
       break;
     }
   negative_types[-typenum] = rettype;
@@ -2242,8 +2236,7 @@ stabs_method_name_from_physname (const char *physname)
 
   if (method_name == NULL)
     {
-      complaint (&symfile_complaints,
-                _("Method has bad physname %s\n"), physname);
+      complaint (_("Method has bad physname %s\n"), physname);
       return NULL;
     }
 
@@ -2266,8 +2259,8 @@ stabs_method_name_from_physname (const char *physname)
    Returns 1 for success, 0 for failure.  */
 
 static int
-read_member_functions (struct field_info *fip, char **pp, struct type *type,
-                      struct objfile *objfile)
+read_member_functions (struct stab_field_info *fip, const char **pp,
+                      struct type *type, struct objfile *objfile)
 {
   int nfn_fields = 0;
   int length = 0;
@@ -2282,7 +2275,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
   struct next_fnfieldlist *new_fnlist;
   struct next_fnfield *new_sublist;
   char *main_fn_name;
-  char *p;
+  const char *p;
 
   /* Process each list until we find something that is not a member function
      or find the end of the functions.  */
@@ -2306,8 +2299,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
       look_ahead_type = NULL;
       length = 0;
 
-      new_fnlist = XCNEW (struct next_fnfieldlist);
-      make_cleanup (xfree, new_fnlist);
+      new_fnlist = OBSTACK_ZALLOC (&fip->obstack, struct next_fnfieldlist);
 
       if ((*pp)[0] == 'o' && (*pp)[1] == 'p' && is_cplus_marker ((*pp)[2]))
        {
@@ -2346,8 +2338,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
 
       do
        {
-         new_sublist = XCNEW (struct next_fnfield);
-         make_cleanup (xfree, new_sublist);
+         new_sublist = OBSTACK_ZALLOC (&fip->obstack, struct next_fnfield);
 
          /* Check for and handle cretinous dbx symbol name continuation!  */
          if (look_ahead_type == NULL)
@@ -2377,10 +2368,10 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
            }
 
          /* These are methods, not functions.  */
-         if (TYPE_CODE (new_sublist->fn_field.type) == TYPE_CODE_FUNC)
-           TYPE_CODE (new_sublist->fn_field.type) = TYPE_CODE_METHOD;
+         if (new_sublist->fn_field.type->code () == TYPE_CODE_FUNC)
+           new_sublist->fn_field.type->set_code (TYPE_CODE_METHOD);
          else
-           gdb_assert (TYPE_CODE (new_sublist->fn_field.type)
+           gdb_assert (new_sublist->fn_field.type->code ()
                        == TYPE_CODE_METHOD);
 
          /* If this is just a stub, then we don't have the real name here.  */
@@ -2434,8 +2425,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
            case '.':
              break;
            default:
-             complaint (&symfile_complaints,
-                        _("const/volatile indicator missing, got '%c'"),
+             complaint (_("const/volatile indicator missing, got '%c'"),
                         **pp);
              break;
            }
@@ -2518,10 +2508,10 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
 
            default:
              /* error */
-             complaint (&symfile_complaints,
-                        _("member function type missing, got '%c'"),
+             complaint (_("member function type missing, got '%c'"),
                         (*pp)[-1]);
-             /* Fall through into normal member function.  */
+             /* Normal member function.  */
+             /* Fall through.  */
 
            case '.':
              /* normal member function.  */
@@ -2550,7 +2540,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
        }
       else
        {
-         int has_stub = 0;
          int has_destructor = 0, has_other = 0;
          int is_v3 = 0;
          struct next_fnfield *tmp_sublist;
@@ -2614,8 +2603,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
          tmp_sublist = sublist;
          while (tmp_sublist != NULL)
            {
-             if (tmp_sublist->fn_field.is_stub)
-               has_stub = 1;
              if (tmp_sublist->fn_field.physname[0] == '_'
                  && tmp_sublist->fn_field.physname[1] == 'Z')
                is_v3 = 1;
@@ -2635,8 +2622,8 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
 
              /* Create a new fn_fieldlist for the destructors.  */
 
-             destr_fnlist = XCNEW (struct next_fnfieldlist);
-             make_cleanup (xfree, destr_fnlist);
+             destr_fnlist = OBSTACK_ZALLOC (&fip->obstack,
+                                            struct next_fnfieldlist);
 
              destr_fnlist->fn_fieldlist.name
                = obconcat (&objfile->objfile_obstack, "~",
@@ -2702,29 +2689,9 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
                          "~", main_fn_name, (char *)NULL);
              xfree (main_fn_name);
            }
-         else if (!has_stub)
-           {
-             char dem_opname[256];
-             int ret;
-
-             ret = cplus_demangle_opname (new_fnlist->fn_fieldlist.name,
-                                             dem_opname, DMGL_ANSI);
-             if (!ret)
-               ret = cplus_demangle_opname (new_fnlist->fn_fieldlist.name,
-                                            dem_opname, 0);
-             if (ret)
-               new_fnlist->fn_fieldlist.name
-                 = ((const char *)
-                    obstack_copy0 (&objfile->objfile_obstack, dem_opname,
-                                   strlen (dem_opname)));
-             xfree (main_fn_name);
-           }
 
-         new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
-           obstack_alloc (&objfile->objfile_obstack,
-                          sizeof (struct fn_field) * length);
-         memset (new_fnlist->fn_fieldlist.fn_fields, 0,
-                 sizeof (struct fn_field) * length);
+         new_fnlist->fn_fieldlist.fn_fields
+           = OBSTACK_CALLOC (&objfile->objfile_obstack, length, fn_field);
          for (i = length; (i--, sublist); sublist = sublist->next)
            {
              new_fnlist->fn_fieldlist.fn_fields[i] = sublist->fn_field;
@@ -2756,10 +2723,10 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
    keep parsing and it's time for error_type().  */
 
 static int
-read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type,
-                struct objfile *objfile)
+read_cpp_abbrev (struct stab_field_info *fip, const char **pp,
+                struct type *type, struct objfile *objfile)
 {
-  char *p;
+  const char *p;
   const char *name;
   char cpp_abbrev;
   struct type *context;
@@ -2782,7 +2749,7 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type,
       switch (cpp_abbrev)
        {
        case 'f':               /* $vf -- a virtual function table pointer */
-         name = type_name_no_tag (context);
+         name = context->name ();
          if (name == NULL)
            {
              name = "";
@@ -2792,11 +2759,10 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type,
          break;
 
        case 'b':               /* $vb -- a virtual bsomethingorother */
-         name = type_name_no_tag (context);
+         name = context->name ();
          if (name == NULL)
            {
-             complaint (&symfile_complaints,
-                        _("C++ abbreviated type name "
+             complaint (_("C++ abbreviated type name "
                           "unknown at symtab pos %d"),
                         symnum);
              name = "FOO";
@@ -2852,13 +2818,14 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type,
 }
 
 static void
-read_one_struct_field (struct field_info *fip, char **pp, char *p,
-                      struct type *type, struct objfile *objfile)
+read_one_struct_field (struct stab_field_info *fip, const char **pp,
+                      const char *p, struct type *type,
+                      struct objfile *objfile)
 {
-  struct gdbarch *gdbarch = get_objfile_arch (objfile);
+  struct gdbarch *gdbarch = objfile->arch ();
 
   fip->list->field.name
-    = (const char *) obstack_copy0 (&objfile->objfile_obstack, *pp, p - *pp);
+    = obstack_strndup (&objfile->objfile_obstack, *pp, p - *pp);
   *pp = p + 1;
 
   /* This means we have a visibility for a field coming.  */
@@ -2952,16 +2919,16 @@ read_one_struct_field (struct field_info *fip, char **pp, char *p,
 
       struct type *field_type = check_typedef (FIELD_TYPE (fip->list->field));
 
-      if (TYPE_CODE (field_type) != TYPE_CODE_INT
-         && TYPE_CODE (field_type) != TYPE_CODE_RANGE
-         && TYPE_CODE (field_type) != TYPE_CODE_BOOL
-         && TYPE_CODE (field_type) != TYPE_CODE_ENUM)
+      if (field_type->code () != TYPE_CODE_INT
+         && field_type->code () != TYPE_CODE_RANGE
+         && field_type->code () != TYPE_CODE_BOOL
+         && field_type->code () != TYPE_CODE_ENUM)
        {
          FIELD_BITSIZE (fip->list->field) = 0;
        }
       if ((FIELD_BITSIZE (fip->list->field)
           == TARGET_CHAR_BIT * TYPE_LENGTH (field_type)
-          || (TYPE_CODE (field_type) == TYPE_CODE_ENUM
+          || (field_type->code () == TYPE_CODE_ENUM
               && FIELD_BITSIZE (fip->list->field)
                  == gdbarch_int_bit (gdbarch))
          )
@@ -2995,10 +2962,10 @@ read_one_struct_field (struct field_info *fip, char **pp, char *p,
    Returns 1 for success, 0 for failure.  */
 
 static int
-read_struct_fields (struct field_info *fip, char **pp, struct type *type,
-                   struct objfile *objfile)
+read_struct_fields (struct stab_field_info *fip, const char **pp,
+                   struct type *type, struct objfile *objfile)
 {
-  char *p;
+  const char *p;
   struct nextfield *newobj;
 
   /* We better set p right now, in case there are no fields at all...    */
@@ -3015,8 +2982,7 @@ read_struct_fields (struct field_info *fip, char **pp, struct type *type,
     {
       STABS_CONTINUE (pp, objfile);
       /* Get space to record the next field's data.  */
-      newobj = XCNEW (struct nextfield);
-      make_cleanup (xfree, newobj);
+      newobj = OBSTACK_ZALLOC (&fip->obstack, struct nextfield);
 
       newobj->next = fip->list;
       fip->list = newobj;
@@ -3093,8 +3059,8 @@ read_struct_fields (struct field_info *fip, char **pp, struct type *type,
 
 
 static int
-read_baseclasses (struct field_info *fip, char **pp, struct type *type,
-                 struct objfile *objfile)
+read_baseclasses (struct stab_field_info *fip, const char **pp,
+                 struct type *type, struct objfile *objfile)
 {
   int i;
   struct nextfield *newobj;
@@ -3137,8 +3103,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
 
   for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
     {
-      newobj = XCNEW (struct nextfield);
-      make_cleanup (xfree, newobj);
+      newobj = OBSTACK_ZALLOC (&fip->obstack, struct nextfield);
 
       newobj->next = fip->list;
       fip->list = newobj;
@@ -3157,8 +3122,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
        default:
          /* Unknown character.  Complain and treat it as non-virtual.  */
          {
-           complaint (&symfile_complaints,
-                      _("Unknown virtual character `%c' for baseclass"),
+           complaint (_("Unknown virtual character `%c' for baseclass"),
                       **pp);
          }
        }
@@ -3175,8 +3139,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
          /* Bad visibility format.  Complain and treat it as
             public.  */
          {
-           complaint (&symfile_complaints,
-                      _("Unknown visibility `%c' for baseclass"),
+           complaint (_("Unknown visibility `%c' for baseclass"),
                       newobj->visibility);
            newobj->visibility = VISIBILITY_PUBLIC;
          }
@@ -3199,7 +3162,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
          field's name.  */
 
       newobj->field.type = read_type (pp, objfile);
-      newobj->field.name = type_name_no_tag (newobj->field.type);
+      newobj->field.name = newobj->field.type->name ();
 
       /* Skip trailing ';' and bump count of number of fields seen.  */
       if (**pp == ';')
@@ -3219,10 +3182,10 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
    so we can look for the vptr base class info.  */
 
 static int
-read_tilde_fields (struct field_info *fip, char **pp, struct type *type,
-                  struct objfile *objfile)
+read_tilde_fields (struct stab_field_info *fip, const char **pp,
+                  struct type *type, struct objfile *objfile)
 {
-  char *p;
+  const char *p;
 
   STABS_CONTINUE (pp, objfile);
 
@@ -3270,7 +3233,7 @@ read_tilde_fields (struct field_info *fip, char **pp, struct type *type,
          set_type_vptr_basetype (type, t);
          if (type == t)        /* Our own class provides vtbl ptr.  */
            {
-             for (i = TYPE_NFIELDS (t) - 1;
+             for (i = t->num_fields () - 1;
                   i >= TYPE_N_BASECLASSES (t);
                   --i)
                {
@@ -3284,10 +3247,9 @@ read_tilde_fields (struct field_info *fip, char **pp, struct type *type,
                    }
                }
              /* Virtual function table field not found.  */
-             complaint (&symfile_complaints,
-                        _("virtual function table pointer "
+             complaint (_("virtual function table pointer "
                           "not found when defining class `%s'"),
-                        TYPE_NAME (type));
+                        type->name ());
              return 0;
            }
          else
@@ -3303,7 +3265,7 @@ read_tilde_fields (struct field_info *fip, char **pp, struct type *type,
 }
 
 static int
-attach_fn_fields_to_type (struct field_info *fip, struct type *type)
+attach_fn_fields_to_type (struct stab_field_info *fip, struct type *type)
 {
   int n;
 
@@ -3322,7 +3284,7 @@ attach_fn_fields_to_type (struct field_info *fip, struct type *type)
    for this class's virtual functions.  */
 
 static int
-attach_fields_to_type (struct field_info *fip, struct type *type,
+attach_fields_to_type (struct stab_field_info *fip, struct type *type,
                       struct objfile *objfile)
 {
   int nfields = 0;
@@ -3347,10 +3309,11 @@ attach_fields_to_type (struct field_info *fip, struct type *type,
      non-public fields.  Record the field count, allocate space for the
      array of fields, and create blank visibility bitfields if necessary.  */
 
-  TYPE_NFIELDS (type) = nfields;
-  TYPE_FIELDS (type) = (struct field *)
-    TYPE_ALLOC (type, sizeof (struct field) * nfields);
-  memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields);
+  type->set_num_fields (nfields);
+  type->set_fields
+    ((struct field *)
+     TYPE_ALLOC (type, sizeof (struct field) * nfields));
+  memset (type->fields (), 0, sizeof (struct field) * nfields);
 
   if (non_public_fields)
     {
@@ -3376,7 +3339,7 @@ attach_fields_to_type (struct field_info *fip, struct type *type,
 
   while (nfields-- > 0)
     {
-      TYPE_FIELD (type, nfields) = fip->list->field;
+      type->field (nfields) = fip->list->field;
       switch (fip->list->visibility)
        {
        case VISIBILITY_PRIVATE:
@@ -3397,8 +3360,7 @@ attach_fields_to_type (struct field_info *fip, struct type *type,
        default:
          /* Unknown visibility.  Complain and treat it as public.  */
          {
-           complaint (&symfile_complaints,
-                      _("Unknown visibility `%c' for field"),
+           complaint (_("Unknown visibility `%c' for field"),
                       fip->list->visibility);
          }
          break;
@@ -3417,10 +3379,10 @@ complain_about_struct_wipeout (struct type *type)
   const char *name = "";
   const char *kind = "";
 
-  if (TYPE_TAG_NAME (type))
+  if (type->name ())
     {
-      name = TYPE_TAG_NAME (type);
-      switch (TYPE_CODE (type))
+      name = type->name ();
+      switch (type->code ())
         {
         case TYPE_CODE_STRUCT: kind = "struct "; break;
         case TYPE_CODE_UNION:  kind = "union ";  break;
@@ -3428,19 +3390,13 @@ complain_about_struct_wipeout (struct type *type)
         default: kind = "";
         }
     }
-  else if (TYPE_NAME (type))
-    {
-      name = TYPE_NAME (type);
-      kind = "";
-    }
   else
     {
       name = "<unknown>";
       kind = "";
     }
 
-  complaint (&symfile_complaints,
-            _("struct/union type gets multiply defined: %s%s"), kind, name);
+  complaint (_("struct/union type gets multiply defined: %s%s"), kind, name);
 }
 
 /* Set the length for all variants of a same main_type, which are
@@ -3495,14 +3451,10 @@ set_length_in_type_chain (struct type *type)
  */
 
 static struct type *
-read_struct_type (char **pp, struct type *type, enum type_code type_code,
+read_struct_type (const char **pp, struct type *type, enum type_code type_code,
                   struct objfile *objfile)
 {
-  struct cleanup *back_to;
-  struct field_info fi;
-
-  fi.list = NULL;
-  fi.fnlist = NULL;
+  struct stab_field_info fi;
 
   /* When describing struct/union/class types in stabs, G++ always drops
      all qualifications from the name.  So if you've got:
@@ -3515,7 +3467,7 @@ read_struct_type (char **pp, struct type *type, enum type_code type_code,
      Obviously, GDB can't fix this by itself, but it can at least avoid
      scribbling on existing structure type objects when new definitions
      appear.  */
-  if (! (TYPE_CODE (type) == TYPE_CODE_UNDEF
+  if (! (type->code () == TYPE_CODE_UNDEF
          || TYPE_STUB (type)))
     {
       complain_about_struct_wipeout (type);
@@ -3524,10 +3476,8 @@ read_struct_type (char **pp, struct type *type, enum type_code type_code,
       return type;
     }
 
-  back_to = make_cleanup (null_cleanup, 0);
-
   INIT_CPLUS_SPECIFIC (type);
-  TYPE_CODE (type) = type_code;
+  type->set_code (type_code);
   TYPE_STUB (type) = 0;
 
   /* First comes the total size in bytes.  */
@@ -3537,10 +3487,7 @@ read_struct_type (char **pp, struct type *type, enum type_code type_code,
 
     TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits, 0);
     if (nbits != 0)
-      {
-       do_cleanups (back_to);
-       return error_type (pp, objfile);
-      }
+      return error_type (pp, objfile);
     set_length_in_type_chain (type);
   }
 
@@ -3559,7 +3506,6 @@ read_struct_type (char **pp, struct type *type, enum type_code type_code,
       type = error_type (pp, objfile);
     }
 
-  do_cleanups (back_to);
   return (type);
 }
 
@@ -3569,7 +3515,7 @@ read_struct_type (char **pp, struct type *type, enum type_code type_code,
    array.  */
 
 static struct type *
-read_array_type (char **pp, struct type *type,
+read_array_type (const char **pp, struct type *type,
                 struct objfile *objfile)
 {
   struct type *index_type, *element_type, *range_type;
@@ -3620,7 +3566,7 @@ read_array_type (char **pp, struct type *type,
     }
 
   range_type =
-    create_static_range_type ((struct type *) NULL, index_type, lower, upper);
+    create_static_range_type (NULL, index_type, lower, upper);
   type = create_array_type (type, element_type, range_type);
 
   return type;
@@ -3632,11 +3578,11 @@ read_array_type (char **pp, struct type *type,
    Also defines the symbols that represent the values of the type.  */
 
 static struct type *
-read_enum_type (char **pp, struct type *type,
+read_enum_type (const char **pp, struct type *type,
                struct objfile *objfile)
 {
-  struct gdbarch *gdbarch = get_objfile_arch (objfile);
-  char *p;
+  struct gdbarch *gdbarch = objfile->arch ();
+  const char *p;
   char *name;
   long n;
   struct symbol *sym;
@@ -3652,10 +3598,10 @@ read_enum_type (char **pp, struct type *type,
      to be file-scope, between N_FN entries, using N_LSYM.  What's a mother
      to do?  For now, force all enum values to file scope.  */
   if (within_function)
-    symlist = &local_symbols;
+    symlist = get_local_symbols ();
   else
 #endif
-    symlist = &file_symbols;
+    symlist = get_file_symbols ();
   osyms = *symlist;
   o_nsyms = osyms ? osyms->nsyms : 0;
 
@@ -3680,16 +3626,16 @@ read_enum_type (char **pp, struct type *type,
       p = *pp;
       while (*p != ':')
        p++;
-      name = (char *) obstack_copy0 (&objfile->objfile_obstack, *pp, p - *pp);
+      name = obstack_strndup (&objfile->objfile_obstack, *pp, p - *pp);
       *pp = p + 1;
       n = read_huge_number (pp, ',', &nbits, 0);
       if (nbits != 0)
        return error_type (pp, objfile);
 
-      sym = allocate_symbol (objfile);
-      SYMBOL_SET_LINKAGE_NAME (sym, name);
-      SYMBOL_SET_LANGUAGE (sym, current_subfile->language,
-                          &objfile->objfile_obstack);
+      sym = new (&objfile->objfile_obstack) symbol;
+      sym->set_linkage_name (name);
+      sym->set_language (get_current_subfile ()->language,
+                        &objfile->objfile_obstack);
       SYMBOL_ACLASS_INDEX (sym) = LOC_CONST;
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
       SYMBOL_VALUE (sym) = n;
@@ -3706,14 +3652,15 @@ read_enum_type (char **pp, struct type *type,
 
   TYPE_LENGTH (type) = gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT;
   set_length_in_type_chain (type);
-  TYPE_CODE (type) = TYPE_CODE_ENUM;
+  type->set_code (TYPE_CODE_ENUM);
   TYPE_STUB (type) = 0;
   if (unsigned_enum)
     TYPE_UNSIGNED (type) = 1;
-  TYPE_NFIELDS (type) = nsyms;
-  TYPE_FIELDS (type) = (struct field *)
-    TYPE_ALLOC (type, sizeof (struct field) * nsyms);
-  memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nsyms);
+  type->set_num_fields (nsyms);
+  type->set_fields
+    ((struct field *)
+     TYPE_ALLOC (type, sizeof (struct field) * nsyms));
+  memset (type->fields (), 0, sizeof (struct field) * nsyms);
 
   /* Find the symbols for the values and put them into the type.
      The symbols can be found in the symlist that we put them on
@@ -3733,8 +3680,8 @@ read_enum_type (char **pp, struct type *type,
          struct symbol *xsym = syms->symbol[j];
 
          SYMBOL_TYPE (xsym) = type;
-         TYPE_FIELD_NAME (type, n) = SYMBOL_LINKAGE_NAME (xsym);
-         SET_FIELD_ENUMVAL (TYPE_FIELD (type, n), SYMBOL_VALUE (xsym));
+         TYPE_FIELD_NAME (type, n) = xsym->linkage_name ();
+         SET_FIELD_ENUMVAL (type->field (n), SYMBOL_VALUE (xsym));
          TYPE_FIELD_BITSIZE (type, n) = 0;
        }
       if (syms == osyms)
@@ -3758,20 +3705,20 @@ read_enum_type (char **pp, struct type *type,
    FIXME.  */
 
 static struct type *
-read_sun_builtin_type (char **pp, int typenums[2], struct objfile *objfile)
+read_sun_builtin_type (const char **pp, int typenums[2], struct objfile *objfile)
 {
   int type_bits;
   int nbits;
-  int signed_type;
-  enum type_code code = TYPE_CODE_INT;
+  int unsigned_type;
+  int boolean_type = 0;
 
   switch (**pp)
     {
     case 's':
-      signed_type = 1;
+      unsigned_type = 0;
       break;
     case 'u':
-      signed_type = 0;
+      unsigned_type = 1;
       break;
     default:
       return error_type (pp, objfile);
@@ -3788,7 +3735,7 @@ read_sun_builtin_type (char **pp, int typenums[2], struct objfile *objfile)
     (*pp)++;
   else if (**pp == 'b')
     {
-      code = TYPE_CODE_BOOL;
+      boolean_type = 1;
       (*pp)++;
     }
 
@@ -3819,18 +3766,23 @@ read_sun_builtin_type (char **pp, int typenums[2], struct objfile *objfile)
     ++(*pp);
 
   if (type_bits == 0)
-    return init_type (TYPE_CODE_VOID, 1,
-                     signed_type ? 0 : TYPE_FLAG_UNSIGNED, (char *) NULL,
-                     objfile);
+    {
+      struct type *type = init_type (objfile, TYPE_CODE_VOID,
+                                    TARGET_CHAR_BIT, NULL);
+      if (unsigned_type)
+        TYPE_UNSIGNED (type) = 1;
+      return type;
+    }
+
+  if (boolean_type)
+    return init_boolean_type (objfile, type_bits, unsigned_type, NULL);
   else
-    return init_type (code,
-                     type_bits / TARGET_CHAR_BIT,
-                     signed_type ? 0 : TYPE_FLAG_UNSIGNED, (char *) NULL,
-                     objfile);
+    return init_integer_type (objfile, type_bits, unsigned_type, NULL);
 }
 
 static struct type *
-read_sun_floating_type (char **pp, int typenums[2], struct objfile *objfile)
+read_sun_floating_type (const char **pp, int typenums[2],
+                       struct objfile *objfile)
 {
   int nbits;
   int details;
@@ -3848,16 +3800,16 @@ read_sun_floating_type (char **pp, int typenums[2], struct objfile *objfile)
   if (nbits != 0)
     return error_type (pp, objfile);
 
+  nbits = nbytes * TARGET_CHAR_BIT;
+
   if (details == NF_COMPLEX || details == NF_COMPLEX16
       || details == NF_COMPLEX32)
     {
-      rettype = init_type (TYPE_CODE_COMPLEX, nbytes, 0, NULL, objfile);
-      TYPE_TARGET_TYPE (rettype)
-       = init_type (TYPE_CODE_FLT, nbytes / 2, 0, NULL, objfile);
-      return rettype;
+      rettype = dbx_init_float_type (objfile, nbits / 2);
+      return init_complex_type (NULL, rettype);
     }
 
-  return init_type (TYPE_CODE_FLT, nbytes, 0, NULL, objfile);
+  return dbx_init_float_type (objfile, nbits);
 }
 
 /* Read a number from the string pointed to by *PP.
@@ -3878,9 +3830,10 @@ read_sun_floating_type (char **pp, int typenums[2], struct objfile *objfile)
    If encounter garbage, set *BITS to -1 and return 0.  */
 
 static long
-read_huge_number (char **pp, int end, int *bits, int twos_complement_bits)
+read_huge_number (const char **pp, int end, int *bits,
+                 int twos_complement_bits)
 {
-  char *p = *pp;
+  const char *p = *pp;
   int sign = 1;
   int sign_bit = 0;
   long n = 0;
@@ -3915,7 +3868,7 @@ read_huge_number (char **pp, int end, int *bits, int twos_complement_bits)
         negative number.  */
 
       size_t len;
-      char *p1 = p;
+      const char *p1 = p;
 
       while ((c = *p1) >= '0' && c < '8')
        p1++;
@@ -3926,7 +3879,7 @@ read_huge_number (char **pp, int end, int *bits, int twos_complement_bits)
              && len == twos_complement_bits / 3))
        {
          /* Ok, we have enough characters for a signed value, check
-            for signness by testing if the sign bit is set.  */
+            for signedness by testing if the sign bit is set.  */
          sign_bit = (twos_complement_bits % 3 + 2) % 3;
          c = *p - '0';
          if (c & (1 << sign_bit))
@@ -4042,11 +3995,11 @@ read_huge_number (char **pp, int end, int *bits, int twos_complement_bits)
 }
 
 static struct type *
-read_range_type (char **pp, int typenums[2], int type_size,
+read_range_type (const char **pp, int typenums[2], int type_size,
                  struct objfile *objfile)
 {
-  struct gdbarch *gdbarch = get_objfile_arch (objfile);
-  char *orig_pp = *pp;
+  struct gdbarch *gdbarch = objfile->arch ();
+  const char *orig_pp = *pp;
   int rangenums[2];
   long n2, n3;
   int n2bits, n3bits;
@@ -4120,18 +4073,14 @@ read_range_type (char **pp, int typenums[2], int type_size,
        }
 
       if (got_signed || got_unsigned)
-       {
-         return init_type (TYPE_CODE_INT, nbits / TARGET_CHAR_BIT,
-                           got_unsigned ? TYPE_FLAG_UNSIGNED : 0, NULL,
-                           objfile);
-       }
+       return init_integer_type (objfile, nbits, got_unsigned, NULL);
       else
        return error_type (pp, objfile);
     }
 
   /* A type defined as a subrange of itself, with bounds both 0, is void.  */
   if (self_subrange && n2 == 0 && n3 == 0)
-    return init_type (TYPE_CODE_VOID, 1, 0, NULL, objfile);
+    return init_type (objfile, TYPE_CODE_VOID, TARGET_CHAR_BIT, NULL);
 
   /* If n3 is zero and n2 is positive, we want a floating type, and n2
      is the width in bytes.
@@ -4148,16 +4097,10 @@ read_range_type (char **pp, int typenums[2], int type_size,
   if (n3 == 0 && n2 > 0)
     {
       struct type *float_type
-       = init_type (TYPE_CODE_FLT, n2, 0, NULL, objfile);
+       = dbx_init_float_type (objfile, n2 * TARGET_CHAR_BIT);
 
       if (self_subrange)
-       {
-         struct type *complex_type = 
-           init_type (TYPE_CODE_COMPLEX, 2 * n2, 0, NULL, objfile);
-
-         TYPE_TARGET_TYPE (complex_type) = float_type;
-         return complex_type;
-       }
+       return init_complex_type (NULL, float_type);
       else
        return float_type;
     }
@@ -4176,15 +4119,18 @@ read_range_type (char **pp, int typenums[2], int type_size,
          bits = gdbarch_int_bit (gdbarch);
        }
 
-      return init_type (TYPE_CODE_INT, bits / TARGET_CHAR_BIT,
-                       TYPE_FLAG_UNSIGNED, NULL, objfile);
+      return init_integer_type (objfile, bits, 1, NULL);
     }
 
   /* Special case: char is defined (Who knows why) as a subrange of
      itself with range 0-127.  */
   else if (self_subrange && n2 == 0 && n3 == 127)
-    return init_type (TYPE_CODE_INT, 1, TYPE_FLAG_NOSIGN, NULL, objfile);
-
+    {
+      struct type *type = init_integer_type (objfile, TARGET_CHAR_BIT,
+                                            0, NULL);
+      TYPE_NOSIGN (type) = 1;
+      return type;
+    }
   /* We used to do this only for subrange of self or subrange of int.  */
   else if (n2 == 0)
     {
@@ -4194,8 +4140,7 @@ read_range_type (char **pp, int typenums[2], int type_size,
 
       if (n3 < 0)
        /* n3 actually gives the size.  */
-       return init_type (TYPE_CODE_INT, -n3, TYPE_FLAG_UNSIGNED,
-                         NULL, objfile);
+       return init_integer_type (objfile, -n3 * TARGET_CHAR_BIT, 1, NULL);
 
       /* Is n3 == 2**(8n)-1 for some integer n?  Then it's an
          unsigned n-byte integer.  But do require n to be a power of
@@ -4209,8 +4154,7 @@ read_range_type (char **pp, int typenums[2], int type_size,
          bits >>= 8;
        if (bits == 0
            && ((bytes - 1) & bytes) == 0) /* "bytes is a power of two" */
-         return init_type (TYPE_CODE_INT, bytes, TYPE_FLAG_UNSIGNED, NULL,
-                           objfile);
+         return init_integer_type (objfile, bytes * TARGET_CHAR_BIT, 1, NULL);
       }
     }
   /* I think this is for Convex "long long".  Since I don't know whether
@@ -4220,15 +4164,15 @@ read_range_type (char **pp, int typenums[2], int type_size,
           && (self_subrange
               || n2 == -gdbarch_long_long_bit
                          (gdbarch) / TARGET_CHAR_BIT))
-    return init_type (TYPE_CODE_INT, -n2, 0, NULL, objfile);
+    return init_integer_type (objfile, -n2 * TARGET_CHAR_BIT, 0, NULL);
   else if (n2 == -n3 - 1)
     {
       if (n3 == 0x7f)
-       return init_type (TYPE_CODE_INT, 1, 0, NULL, objfile);
+       return init_integer_type (objfile, 8, 0, NULL);
       if (n3 == 0x7fff)
-       return init_type (TYPE_CODE_INT, 2, 0, NULL, objfile);
+       return init_integer_type (objfile, 16, 0, NULL);
       if (n3 == 0x7fffffff)
-       return init_type (TYPE_CODE_INT, 4, 0, NULL, objfile);
+       return init_integer_type (objfile, 32, 0, NULL);
     }
 
   /* We have a real range type on our hands.  Allocate space and
@@ -4244,14 +4188,13 @@ handle_true_range:
       /* Does this actually ever happen?  Is that why we are worrying
          about dealing with it rather than just calling error_type?  */
 
-      complaint (&symfile_complaints,
-                _("base type %d of range type is not defined"), rangenums[1]);
+      complaint (_("base type %d of range type is not defined"), rangenums[1]);
 
       index_type = objfile_type (objfile)->builtin_int;
     }
 
   result_type
-    = create_static_range_type ((struct type *) NULL, index_type, n2, n3);
+    = create_static_range_type (NULL, index_type, n2, n3);
   return (result_type);
 }
 
@@ -4260,7 +4203,7 @@ handle_true_range:
    if there is an error.  */
 
 static struct field *
-read_args (char **pp, int end, struct objfile *objfile, int *nargsp,
+read_args (const char **pp, int end, struct objfile *objfile, int *nargsp,
           int *varargsp)
 {
   /* FIXME!  Remove this arbitrary limit!  */
@@ -4286,10 +4229,10 @@ read_args (char **pp, int end, struct objfile *objfile, int *nargsp,
         have been present ";-16,(0,43)" reference instead.  This way the
         excessive ";" marker prematurely stops the parameters parsing.  */
 
-      complaint (&symfile_complaints, _("Invalid (empty) method arguments"));
+      complaint (_("Invalid (empty) method arguments"));
       *varargsp = 0;
     }
-  else if (TYPE_CODE (types[n - 1]) != TYPE_CODE_VOID)
+  else if (types[n - 1]->code () != TYPE_CODE_VOID)
     *varargsp = 1;
   else
     {
@@ -4324,17 +4267,15 @@ static char *common_block_name;
    to remain after this function returns.  */
 
 void
-common_block_start (char *name, struct objfile *objfile)
+common_block_start (const char *name, struct objfile *objfile)
 {
   if (common_block_name != NULL)
     {
-      complaint (&symfile_complaints,
-                _("Invalid symbol data: common block within common block"));
+      complaint (_("Invalid symbol data: common block within common block"));
     }
-  common_block = local_symbols;
-  common_block_i = local_symbols ? local_symbols->nsyms : 0;
-  common_block_name = (char *) obstack_copy0 (&objfile->objfile_obstack, name,
-                                             strlen (name));
+  common_block = *get_local_symbols ();
+  common_block_i = common_block ? common_block->nsyms : 0;
+  common_block_name = obstack_strdup (&objfile->objfile_obstack, name);
 }
 
 /* Process a N_ECOMM symbol.  */
@@ -4355,19 +4296,19 @@ common_block_end (struct objfile *objfile)
 
   if (common_block_name == NULL)
     {
-      complaint (&symfile_complaints, _("ECOMM symbol unmatched by BCOMM"));
+      complaint (_("ECOMM symbol unmatched by BCOMM"));
       return;
     }
 
-  sym = allocate_symbol (objfile);
+  sym = new (&objfile->objfile_obstack) symbol;
   /* Note: common_block_name already saved on objfile_obstack.  */
-  SYMBOL_SET_LINKAGE_NAME (sym, common_block_name);
+  sym->set_linkage_name (common_block_name);
   SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
 
   /* Now we copy all the symbols which have been defined since the BCOMM.  */
 
   /* Copy all the struct pendings before common_block.  */
-  for (next = local_symbols;
+  for (next = *get_local_symbols ();
        next != NULL && next != common_block;
        next = next->next)
     {
@@ -4388,7 +4329,7 @@ common_block_end (struct objfile *objfile)
   /* Should we be putting local_symbols back to what it was?
      Does it matter?  */
 
-  i = hashname (SYMBOL_LINKAGE_NAME (sym));
+  i = hashname (sym->linkage_name ());
   SYMBOL_VALUE_CHAIN (sym) = global_sym_chain[i];
   global_sym_chain[i] = sym;
   common_block_name = NULL;
@@ -4408,7 +4349,9 @@ fix_common_block (struct symbol *sym, CORE_ADDR valu)
       int j;
 
       for (j = next->nsyms - 1; j >= 0; j--)
-       SYMBOL_VALUE_ADDRESS (next->symbol[j]) += valu;
+       SET_SYMBOL_VALUE_ADDRESS (next->symbol[j],
+                                 SYMBOL_VALUE_ADDRESS (next->symbol[j])
+                                 + valu);
     }
 }
 \f
@@ -4468,7 +4411,7 @@ add_undefined_type_1 (struct type *type)
 static void
 add_undefined_type (struct type *type, int typenums[2])
 {
-  if (TYPE_TAG_NAME (type) == NULL)
+  if (type->name () == NULL)
     add_undefined_type_noname (type, typenums);
   else
     add_undefined_type_1 (type);
@@ -4487,7 +4430,7 @@ cleanup_undefined_types_noname (struct objfile *objfile)
       struct type **type;
 
       type = dbx_lookup_type (nat.typenums, objfile);
-      if (nat.type != *type && TYPE_CODE (*type) != TYPE_CODE_UNDEF)
+      if (nat.type != *type && (*type)->code () != TYPE_CODE_UNDEF)
         {
           /* The instance flags of the undefined type are still unset,
              and needs to be copied over from the reference type.
@@ -4537,7 +4480,7 @@ cleanup_undefined_types_1 (void)
 
   for (type = undef_types; type < undef_types + undef_types_length; type++)
     {
-      switch (TYPE_CODE (*type))
+      switch ((*type)->code ())
        {
 
        case TYPE_CODE_STRUCT:
@@ -4553,14 +4496,14 @@ cleanup_undefined_types_1 (void)
                struct pending *ppt;
                int i;
                /* Name of the type, without "struct" or "union".  */
-               const char *type_name = TYPE_TAG_NAME (*type);
+               const char *type_name = (*type)->name ();
 
                if (type_name == NULL)
                  {
-                   complaint (&symfile_complaints, _("need a type name"));
+                   complaint (_("need a type name"));
                    break;
                  }
-               for (ppt = file_symbols; ppt; ppt = ppt->next)
+               for (ppt = *get_file_symbols (); ppt; ppt = ppt->next)
                  {
                    for (i = 0; i < ppt->nsyms; i++)
                      {
@@ -4568,12 +4511,11 @@ cleanup_undefined_types_1 (void)
 
                        if (SYMBOL_CLASS (sym) == LOC_TYPEDEF
                            && SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN
-                           && (TYPE_CODE (SYMBOL_TYPE (sym)) ==
-                               TYPE_CODE (*type))
+                           && (SYMBOL_TYPE (sym)->code () ==
+                               (*type)->code ())
                            && (TYPE_INSTANCE_FLAGS (*type) ==
                                TYPE_INSTANCE_FLAGS (SYMBOL_TYPE (sym)))
-                           && strcmp (SYMBOL_LINKAGE_NAME (sym),
-                                      type_name) == 0)
+                           && strcmp (sym->linkage_name (), type_name) == 0)
                           replace_type (*type, SYMBOL_TYPE (sym));
                      }
                  }
@@ -4583,10 +4525,9 @@ cleanup_undefined_types_1 (void)
 
        default:
          {
-           complaint (&symfile_complaints,
-                      _("forward-referenced types left unresolved, "
+           complaint (_("forward-referenced types left unresolved, "
                        "type code %d."),
-                      TYPE_CODE (*type));
+                      (*type)->code ());
          }
          break;
        }
@@ -4595,7 +4536,7 @@ cleanup_undefined_types_1 (void)
   undef_types_length = 0;
 }
 
-/* Try to fix all the undefined types we ecountered while processing
+/* Try to fix all the undefined types we encountered while processing
    this unit.  */
 
 void
@@ -4605,15 +4546,12 @@ cleanup_undefined_stabs_types (struct objfile *objfile)
   cleanup_undefined_types_noname (objfile);
 }
 
-/* Scan through all of the global symbols defined in the object file,
-   assigning values to the debugging symbols that need to be assigned
-   to.  Get these symbols from the minimal symbol table.  */
+/* See stabsread.h.  */
 
 void
 scan_file_globals (struct objfile *objfile)
 {
   int hash;
-  struct minimal_symbol *msymbol;
   struct symbol *sym, *prev;
   struct objfile *resolve_objfile;
 
@@ -4639,7 +4577,7 @@ scan_file_globals (struct objfile *objfile)
       if (hash >= HASHSIZE)
        return;
 
-      ALL_OBJFILE_MSYMBOLS (resolve_objfile, msymbol)
+      for (minimal_symbol *msymbol : resolve_objfile->msymbols ())
        {
          QUIT;
 
@@ -4659,12 +4597,11 @@ scan_file_globals (struct objfile *objfile)
          /* Get the hash index and check all the symbols
             under that hash index.  */
 
-         hash = hashname (MSYMBOL_LINKAGE_NAME (msymbol));
+         hash = hashname (msymbol->linkage_name ());
 
          for (sym = global_sym_chain[hash]; sym;)
            {
-             if (strcmp (MSYMBOL_LINKAGE_NAME (msymbol),
-                         SYMBOL_LINKAGE_NAME (sym)) == 0)
+             if (strcmp (msymbol->linkage_name (), sym->linkage_name ()) == 0)
                {
                  /* Splice this symbol out of the hash chain and
                     assign the value we have to it.  */
@@ -4690,8 +4627,9 @@ scan_file_globals (struct objfile *objfile)
                        }
                      else
                        {
-                         SYMBOL_VALUE_ADDRESS (sym)
-                           = MSYMBOL_VALUE_ADDRESS (resolve_objfile, msymbol);
+                         SET_SYMBOL_VALUE_ADDRESS
+                           (sym, MSYMBOL_VALUE_ADDRESS (resolve_objfile,
+                                                        msymbol));
                        }
                      SYMBOL_SECTION (sym) = MSYMBOL_SECTION (msymbol);
                    }
@@ -4729,16 +4667,15 @@ scan_file_globals (struct objfile *objfile)
 
          /* Change the symbol address from the misleading chain value
             to address zero.  */
-         SYMBOL_VALUE_ADDRESS (prev) = 0;
+         SET_SYMBOL_VALUE_ADDRESS (prev, 0);
 
          /* Complain about unresolved common block symbols.  */
          if (SYMBOL_CLASS (prev) == LOC_STATIC)
            SYMBOL_ACLASS_INDEX (prev) = LOC_UNRESOLVED;
          else
-           complaint (&symfile_complaints,
-                      _("%s: common block `%s' from "
+           complaint (_("%s: common block `%s' from "
                         "global_sym_chain unresolved"),
-                      objfile_name (objfile), SYMBOL_PRINT_NAME (prev));
+                      objfile_name (objfile), prev->print_name ());
        }
     }
   memset (global_sym_chain, 0, sizeof (global_sym_chain));
@@ -4775,6 +4712,7 @@ start_stabs (void)
   n_this_object_header_files = 1;
   type_vector_length = 0;
   type_vector = (struct type **) 0;
+  within_function = 0;
 
   /* FIXME: If common_block_name is not already NULL, we should complain().  */
   common_block_name = NULL;
@@ -4799,7 +4737,7 @@ finish_global_stabs (struct objfile *objfile)
 {
   if (global_stabs)
     {
-      patch_block_stabs (global_symbols, global_stabs, objfile);
+      patch_block_stabs (*get_global_symbols (), global_stabs, objfile);
       xfree (global_stabs);
       global_stabs = NULL;
     }
@@ -4807,10 +4745,10 @@ finish_global_stabs (struct objfile *objfile)
 
 /* Find the end of the name, delimited by a ':', but don't match
    ObjC symbols which look like -[Foo bar::]:bla.  */
-static char *
-find_name_end (char *name)
+static const char *
+find_name_end (const char *name)
 {
-  char *s = name;
+  const char *s = name;
 
   if (s[0] == '-' || *s == '+')
     {
@@ -4832,13 +4770,20 @@ find_name_end (char *name)
     }
 }
 
+/* See stabsread.h.  */
+
+int
+hashname (const char *name)
+{
+  return fast_hash (name, strlen (name)) % HASHSIZE;
+}
+
 /* Initializer for this module.  */
 
+void _initialize_stabsread ();
 void
-_initialize_stabsread (void)
+_initialize_stabsread ()
 {
-  rs6000_builtin_type_data = register_objfile_data ();
-
   undef_types_allocated = 20;
   undef_types_length = 0;
   undef_types = XNEWVEC (struct type *, undef_types_allocated);
This page took 0.059684 seconds and 4 git commands to generate.