* bsd-kvm.c (bsd_kvm_open): Properly cast sentinel in concat call.
[deliverable/binutils-gdb.git] / gdb / stabsread.c
index abfbefc6f747388d3f97e959a961db5f48d518cb..b387c25cb3f9098f3017d688eb9f891537605f2c 100644 (file)
@@ -1,6 +1,7 @@
 /* Support routines for decoding "stabs" debugging information format.
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -89,11 +90,9 @@ static void
 read_one_struct_field (struct field_info *, char **, char *,
                       struct type *, struct objfile *);
 
-static char *get_substring (char **, int);
-
 static struct type *dbx_alloc_type (int[2], struct objfile *);
 
-static long read_huge_number (char **, int, int *);
+static long read_huge_number (char **, int, int *, int);
 
 static struct type *error_type (char **, struct objfile *);
 
@@ -107,7 +106,7 @@ static int read_type_number (char **, int *);
 
 static struct type *read_type (char **, struct objfile *);
 
-static struct type *read_range_type (char **, int[2], struct objfile *);
+static struct type *read_range_type (char **, int[2], int, struct objfile *);
 
 static struct type *read_sun_builtin_type (char **, int[2], struct objfile *);
 
@@ -153,43 +152,11 @@ static void add_undefined_type (struct type *);
 static int
 read_cpp_abbrev (struct field_info *, char **, struct type *,
                 struct objfile *);
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE  /* new functions added for cfront support */
-
-// OBSOLETE  static int
-// OBSOLETE  copy_cfront_struct_fields (struct field_info *, struct type *,
-// OBSOLETE                       struct objfile *);
-
-// OBSOLETE  static char *get_cfront_method_physname (char *);
-
-// OBSOLETE  static int
-// OBSOLETE  read_cfront_baseclasses (struct field_info *, char **,
-// OBSOLETE                     struct type *, struct objfile *);
-
-// OBSOLETE  static int
-// OBSOLETE  read_cfront_static_fields (struct field_info *, char **,
-// OBSOLETE                       struct type *, struct objfile *);
-// OBSOLETE  static int
-// OBSOLETE  read_cfront_member_functions (struct field_info *, char **,
-// OBSOLETE                          struct type *, struct objfile *);
-
-// OBSOLETE  /* end new functions added for cfront support */
-#endif /* OBSOLETE CFront */
 
 static char *find_name_end (char *name);
 
-static void add_live_range (struct objfile *, struct symbol *, CORE_ADDR,
-                           CORE_ADDR);
-
-static int resolve_live_range (struct objfile *, struct symbol *, char *);
-
 static int process_reference (char **string);
 
-static CORE_ADDR ref_search_value (int refnum);
-
-static int resolve_symbol_reference (struct objfile *, struct symbol *,
-                                    char *);
-
 void stabsread_clear_cache (void);
 
 static const char vptr_name[] = "_vptr$";
@@ -207,15 +174,15 @@ static const char vb_name[] = "_vb$";
 static void
 invalid_cpp_abbrev_complaint (const char *arg1)
 {
-  complaint (&symfile_complaints, "invalid C++ abbreviation `%s'", arg1);
+  complaint (&symfile_complaints, _("invalid C++ abbreviation `%s'"), arg1);
 }
 
 static void
-reg_value_complaint (int arg1, int arg2, const char *arg3)
+reg_value_complaint (int regnum, int num_regs, const char *sym)
 {
   complaint (&symfile_complaints,
-            "register number %d too large (max %d) in symbol %s", arg1, arg2,
-            arg3);
+            _("register number %d too large (max %d) in symbol %s"),
+             regnum, num_regs - 1, sym);
 }
 
 static void
@@ -224,12 +191,6 @@ stabs_general_complaint (const char *arg1)
   complaint (&symfile_complaints, "%s", arg1);
 }
 
-static void
-lrs_general_complaint (const char *arg1)
-{
-  complaint (&symfile_complaints, "%s", arg1);
-}
-
 /* Make a list of forward references which haven't been defined.  */
 
 static struct type **undef_types;
@@ -268,7 +229,7 @@ dbx_lookup_type (int typenums[2])
   if (filenum < 0 || filenum >= n_this_object_header_files)
     {
       complaint (&symfile_complaints,
-                "Invalid symbol data: type number (%d,%d) out of range at symtab pos %d.",
+                _("Invalid symbol data: type number (%d,%d) out of range at symtab pos %d."),
                 filenum, index, symnum);
       goto error_return;
     }
@@ -320,7 +281,7 @@ dbx_lookup_type (int typenums[2])
          struct type *temp_type;
          struct type **temp_type_p;
 
-         warning ("GDB internal error: bad real_filenum");
+         warning (_("GDB internal error: bad real_filenum"));
 
        error_return:
          temp_type = init_type (TYPE_CODE_ERROR, 0, 0, NULL, NULL);
@@ -418,14 +379,14 @@ patch_block_stabs (struct pending *symbols, struct pending_stabs *stabs,
                 ld will remove it from the executable.  There is then
                 a N_GSYM stab for it, but no regular (C_EXT) symbol.  */
              sym = (struct symbol *)
-               obstack_alloc (&objfile->symbol_obstack,
+               obstack_alloc (&objfile->objfile_obstack,
                               sizeof (struct symbol));
 
              memset (sym, 0, sizeof (struct symbol));
              SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
              SYMBOL_CLASS (sym) = LOC_OPTIMIZED_OUT;
              DEPRECATED_SYMBOL_NAME (sym) =
-               obsavestring (name, pp - name, &objfile->symbol_obstack);
+               obsavestring (name, pp - name, &objfile->objfile_obstack);
              pp += 2;
              if (*(pp - 1) == 'F' || *(pp - 1) == 'f')
                {
@@ -474,17 +435,17 @@ read_type_number (char **pp, int *typenums)
   if (**pp == '(')
     {
       (*pp)++;
-      typenums[0] = read_huge_number (pp, ',', &nbits);
+      typenums[0] = read_huge_number (pp, ',', &nbits, 0);
       if (nbits != 0)
        return -1;
-      typenums[1] = read_huge_number (pp, ')', &nbits);
+      typenums[1] = read_huge_number (pp, ')', &nbits, 0);
       if (nbits != 0)
        return -1;
     }
   else
     {
       typenums[0] = 0;
-      typenums[1] = read_huge_number (pp, 0, &nbits);
+      typenums[1] = read_huge_number (pp, 0, &nbits, 0);
       if (nbits != 0)
        return -1;
     }
@@ -497,592 +458,6 @@ read_type_number (char **pp, int *typenums)
 #define VISIBILITY_PUBLIC      '2'     /* Stabs character for public field */
 #define VISIBILITY_IGNORE      '9'     /* Optimized out or zero length */
 
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE  #define CFRONT_VISIBILITY_PRIVATE '2'     /* Stabs character for private field */
-// OBSOLETE  #define CFRONT_VISIBILITY_PUBLIC  '1'     /* Stabs character for public field */
-
-// OBSOLETE  /* This code added to support parsing of ARM/Cfront stabs strings */
-
-// OBSOLETE  /* Get substring from string up to char c, advance string pointer past
-// OBSOLETE     suibstring. */
-
-// OBSOLETE  static char *
-// OBSOLETE  get_substring (char **p, int c)
-// OBSOLETE  {
-// OBSOLETE    char *str;
-// OBSOLETE    str = *p;
-// OBSOLETE    *p = strchr (*p, c);
-// OBSOLETE    if (*p)
-// OBSOLETE      {
-// OBSOLETE        **p = 0;
-// OBSOLETE        (*p)++;
-// OBSOLETE      }
-// OBSOLETE    else
-// OBSOLETE      str = 0;
-// OBSOLETE    return str;
-// OBSOLETE  }
-
-// OBSOLETE  /* Physname gets strcat'd onto sname in order to recreate the mangled
-// OBSOLETE     name (see funtion gdb_mangle_name in gdbtypes.c).  For cfront, make
-// OBSOLETE     the physname look like that of g++ - take out the initial mangling
-// OBSOLETE     eg: for sname="a" and fname="foo__1aFPFs_i" return "FPFs_i" */
-
-// OBSOLETE  static char *
-// OBSOLETE  get_cfront_method_physname (char *fname)
-// OBSOLETE  {
-// OBSOLETE    int len = 0;
-// OBSOLETE    /* FIXME would like to make this generic for g++ too, but 
-// OBSOLETE       that is already handled in read_member_funcctions */
-// OBSOLETE    char *p = fname;
-
-// OBSOLETE    /* search ahead to find the start of the mangled suffix */
-// OBSOLETE    if (*p == '_' && *(p + 1) == '_')       /* compiler generated; probably a ctor/dtor */
-// OBSOLETE      p += 2;
-// OBSOLETE    while (p && (unsigned) ((p + 1) - fname) < strlen (fname) && *(p + 1) != '_')
-// OBSOLETE      p = strchr (p, '_');
-// OBSOLETE    if (!(p && *p == '_' && *(p + 1) == '_'))
-// OBSOLETE      error ("Invalid mangled function name %s", fname);
-// OBSOLETE    p += 2;                 /* advance past '__' */
-
-// OBSOLETE    /* struct name length and name of type should come next; advance past it */
-// OBSOLETE    while (isdigit (*p))
-// OBSOLETE      {
-// OBSOLETE        len = len * 10 + (*p - '0');
-// OBSOLETE        p++;
-// OBSOLETE      }
-// OBSOLETE    p += len;
-
-// OBSOLETE    return p;
-// OBSOLETE  }
-
-// OBSOLETE  static void
-// OBSOLETE  msg_unknown_complaint (const char *arg1)
-// OBSOLETE  {
-// OBSOLETE    complaint (&symfile_complaints, "Unsupported token in stabs string %s", arg1);
-// OBSOLETE  }
-
-// OBSOLETE  /* Read base classes within cfront class definition.
-// OBSOLETE     eg: A:ZcA;1@Bpub v2@Bvirpri;__ct__1AFv func__1AFv *sfunc__1AFv ;as__1A ;;
-// OBSOLETE     ^^^^^^^^^^^^^^^^^^
-
-// OBSOLETE     A:ZcA;;foopri__1AFv foopro__1AFv __ct__1AFv __ct__1AFRC1A foopub__1AFv ;;;
-// OBSOLETE     ^
-// OBSOLETE   */
-
-// OBSOLETE  static int
-// OBSOLETE  read_cfront_baseclasses (struct field_info *fip, char **pp, struct type *type,
-// OBSOLETE                     struct objfile *objfile)
-// OBSOLETE  {
-// OBSOLETE    int bnum = 0;
-// OBSOLETE    char *p;
-// OBSOLETE    int i;
-// OBSOLETE    struct nextfield *new;
-
-// OBSOLETE    if (**pp == ';')                /* no base classes; return */
-// OBSOLETE      {
-// OBSOLETE        ++(*pp);
-// OBSOLETE        return 1;
-// OBSOLETE      }
-
-// OBSOLETE    /* first count base classes so we can allocate space before parsing */
-// OBSOLETE    for (p = *pp; p && *p && *p != ';'; p++)
-// OBSOLETE      {
-// OBSOLETE        if (*p == ' ')
-// OBSOLETE    bnum++;
-// OBSOLETE      }
-// OBSOLETE    bnum++;                 /* add one more for last one */
-
-// OBSOLETE    /* now parse the base classes until we get to the start of the methods 
-// OBSOLETE       (code extracted and munged from read_baseclasses) */
-// OBSOLETE    ALLOCATE_CPLUS_STRUCT_TYPE (type);
-// OBSOLETE    TYPE_N_BASECLASSES (type) = bnum;
-
-// OBSOLETE    /* allocate space */
-// OBSOLETE    {
-// OBSOLETE      int num_bytes = B_BYTES (TYPE_N_BASECLASSES (type));
-// OBSOLETE      char *pointer;
-
-// OBSOLETE      pointer = (char *) TYPE_ALLOC (type, num_bytes);
-// OBSOLETE      TYPE_FIELD_VIRTUAL_BITS (type) = (B_TYPE *) pointer;
-// OBSOLETE    }
-// OBSOLETE    B_CLRALL (TYPE_FIELD_VIRTUAL_BITS (type), TYPE_N_BASECLASSES (type));
-
-// OBSOLETE    for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
-// OBSOLETE      {
-// OBSOLETE        new = (struct nextfield *) xmalloc (sizeof (struct nextfield));
-// OBSOLETE        make_cleanup (xfree, new);
-// OBSOLETE        memset (new, 0, sizeof (struct nextfield));
-// OBSOLETE        new->next = fip->list;
-// OBSOLETE        fip->list = new;
-// OBSOLETE        FIELD_BITSIZE (new->field) = 0;     /* this should be an unpacked field! */
-
-// OBSOLETE        STABS_CONTINUE (pp, objfile);
-
-// OBSOLETE        /* virtual?  eg: v2@Bvir */
-// OBSOLETE        if (**pp == 'v')
-// OBSOLETE    {
-// OBSOLETE      SET_TYPE_FIELD_VIRTUAL (type, i);
-// OBSOLETE      ++(*pp);
-// OBSOLETE    }
-
-// OBSOLETE        /* access?  eg: 2@Bvir */
-// OBSOLETE        /* Note: protected inheritance not supported in cfront */
-// OBSOLETE        switch (*(*pp)++)
-// OBSOLETE    {
-// OBSOLETE    case CFRONT_VISIBILITY_PRIVATE:
-// OBSOLETE      new->visibility = VISIBILITY_PRIVATE;
-// OBSOLETE      break;
-// OBSOLETE    case CFRONT_VISIBILITY_PUBLIC:
-// OBSOLETE      new->visibility = VISIBILITY_PUBLIC;
-// OBSOLETE      break;
-// OBSOLETE    default:
-// OBSOLETE      /* Bad visibility format.  Complain and treat it as
-// OBSOLETE         public.  */
-// OBSOLETE      {
-// OBSOLETE        complaint (&symfile_complaints,
-// OBSOLETE                   "Unknown visibility `%c' for baseclass",
-// OBSOLETE                   new->visibility);
-// OBSOLETE        new->visibility = VISIBILITY_PUBLIC;
-// OBSOLETE      }
-// OBSOLETE    }
-
-// OBSOLETE        /* "@" comes next - eg: @Bvir */
-// OBSOLETE        if (**pp != '@')
-// OBSOLETE    {
-// OBSOLETE      msg_unknown_complaint (*pp);
-// OBSOLETE      return 1;
-// OBSOLETE    }
-// OBSOLETE        ++(*pp);
-
-
-// OBSOLETE        /* Set the bit offset of the portion of the object corresponding 
-// OBSOLETE           to this baseclass.  Always zero in the absence of
-// OBSOLETE           multiple inheritance.  */
-// OBSOLETE        /* Unable to read bit position from stabs;
-// OBSOLETE           Assuming no multiple inheritance for now FIXME! */
-// OBSOLETE        /* We may have read this in the structure definition;
-// OBSOLETE           now we should fixup the members to be the actual base classes */
-// OBSOLETE        FIELD_BITPOS (new->field) = 0;
-
-// OBSOLETE        /* Get the base class name and type */
-// OBSOLETE        {
-// OBSOLETE    char *bname;            /* base class name */
-// OBSOLETE    struct symbol *bsym;    /* base class */
-// OBSOLETE    char *p1, *p2;
-// OBSOLETE    p1 = strchr (*pp, ' ');
-// OBSOLETE    p2 = strchr (*pp, ';');
-// OBSOLETE    if (p1 < p2)
-// OBSOLETE      bname = get_substring (pp, ' ');
-// OBSOLETE    else
-// OBSOLETE      bname = get_substring (pp, ';');
-// OBSOLETE    if (!bname || !*bname)
-// OBSOLETE      {
-// OBSOLETE        msg_unknown_complaint (*pp);
-// OBSOLETE        return 1;
-// OBSOLETE      }
-// OBSOLETE    /* FIXME! attach base info to type */
-// OBSOLETE    bsym = lookup_symbol (bname, 0, STRUCT_DOMAIN, 0, 0);   /*demangled_name */
-// OBSOLETE    if (bsym)
-// OBSOLETE      {
-// OBSOLETE        new->field.type = SYMBOL_TYPE (bsym);
-// OBSOLETE        new->field.name = type_name_no_tag (new->field.type);
-// OBSOLETE      }
-// OBSOLETE    else
-// OBSOLETE      {
-// OBSOLETE        complaint (&symfile_complaints, "Unable to find base type for %s",
-// OBSOLETE                   *pp);
-// OBSOLETE        return 1;
-// OBSOLETE      }
-// OBSOLETE        }
-
-// OBSOLETE        /* If more base classes to parse, loop again.
-// OBSOLETE           We ate the last ' ' or ';' in get_substring,
-// OBSOLETE           so on exit we will have skipped the trailing ';' */
-// OBSOLETE        /* if invalid, return 0; add code to detect  - FIXME! */
-// OBSOLETE      }
-// OBSOLETE    return 1;
-// OBSOLETE  }
-
-// OBSOLETE  /* read cfront member functions.
-// OBSOLETE     pp points to string starting with list of functions
-// OBSOLETE     eg: A:ZcA;1@Bpub v2@Bvirpri;__ct__1AFv func__1AFv *sfunc__1AFv ;as__1A ;;
-// OBSOLETE     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
-// OBSOLETE     A:ZcA;;foopri__1AFv foopro__1AFv __ct__1AFv __ct__1AFRC1A foopub__1AFv ;;;
-// OBSOLETE     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
-// OBSOLETE   */
-
-// OBSOLETE  static int
-// OBSOLETE  read_cfront_member_functions (struct field_info *fip, char **pp,
-// OBSOLETE                          struct type *type, struct objfile *objfile)
-// OBSOLETE  {
-// OBSOLETE    /* This code extracted from read_member_functions 
-// OBSOLETE       so as to do the similar thing for our funcs */
-
-// OBSOLETE    int nfn_fields = 0;
-// OBSOLETE    int length = 0;
-// OBSOLETE    /* Total number of member functions defined in this class.  If the class
-// OBSOLETE       defines two `f' functions, and one `g' function, then this will have
-// OBSOLETE       the value 3.  */
-// OBSOLETE    int total_length = 0;
-// OBSOLETE    int i;
-// OBSOLETE    struct next_fnfield
-// OBSOLETE      {
-// OBSOLETE        struct next_fnfield *next;
-// OBSOLETE        struct fn_field fn_field;
-// OBSOLETE      }
-// OBSOLETE     *sublist;
-// OBSOLETE    struct type *look_ahead_type;
-// OBSOLETE    struct next_fnfieldlist *new_fnlist;
-// OBSOLETE    struct next_fnfield *new_sublist;
-// OBSOLETE    char *main_fn_name;
-// OBSOLETE    char *fname;
-// OBSOLETE    struct symbol *ref_func = 0;
-
-// OBSOLETE    /* Process each list until we find the end of the member functions.
-// OBSOLETE       eg: p = "__ct__1AFv foo__1AFv ;;;" */
-
-// OBSOLETE    STABS_CONTINUE (pp, objfile);   /* handle \\ */
-
-// OBSOLETE    while (**pp != ';' && (fname = get_substring (pp, ' '), fname))
-// OBSOLETE      {
-// OBSOLETE        int is_static = 0;
-// OBSOLETE        int sublist_count = 0;
-// OBSOLETE        char *pname;
-// OBSOLETE        if (fname[0] == '*')        /* static member */
-// OBSOLETE    {
-// OBSOLETE      is_static = 1;
-// OBSOLETE      sublist_count++;
-// OBSOLETE      fname++;
-// OBSOLETE    }
-// OBSOLETE        ref_func = lookup_symbol (fname, 0, VAR_DOMAIN, 0, 0);              /* demangled name */
-// OBSOLETE        if (!ref_func)
-// OBSOLETE    {
-// OBSOLETE      complaint (&symfile_complaints,
-// OBSOLETE                 "Unable to find function symbol for %s", fname);
-// OBSOLETE      continue;
-// OBSOLETE    }
-// OBSOLETE        sublist = NULL;
-// OBSOLETE        look_ahead_type = NULL;
-// OBSOLETE        length = 0;
-
-// OBSOLETE        new_fnlist = (struct next_fnfieldlist *)
-// OBSOLETE    xmalloc (sizeof (struct next_fnfieldlist));
-// OBSOLETE        make_cleanup (xfree, new_fnlist);
-// OBSOLETE        memset (new_fnlist, 0, sizeof (struct next_fnfieldlist));
-
-// OBSOLETE        /* The following is code to work around cfront generated stabs.
-// OBSOLETE           The stabs contains full mangled name for each field.
-// OBSOLETE           We try to demangle the name and extract the field name out of it.  */
-// OBSOLETE        {
-// OBSOLETE    char *dem, *dem_p, *dem_args;
-// OBSOLETE    int dem_len;
-// OBSOLETE    dem = cplus_demangle (fname, DMGL_ANSI | DMGL_PARAMS);
-// OBSOLETE    if (dem != NULL)
-// OBSOLETE      {
-// OBSOLETE        dem_p = strrchr (dem, ':');
-// OBSOLETE        if (dem_p != 0 && *(dem_p - 1) == ':')
-// OBSOLETE          dem_p++;
-// OBSOLETE        /* get rid of args */
-// OBSOLETE        dem_args = strchr (dem_p, '(');
-// OBSOLETE        if (dem_args == NULL)
-// OBSOLETE          dem_len = strlen (dem_p);
-// OBSOLETE        else
-// OBSOLETE          dem_len = dem_args - dem_p;
-// OBSOLETE        main_fn_name =
-// OBSOLETE          obsavestring (dem_p, dem_len, &objfile->type_obstack);
-// OBSOLETE      }
-// OBSOLETE    else
-// OBSOLETE      {
-// OBSOLETE        main_fn_name =
-// OBSOLETE          obsavestring (fname, strlen (fname), &objfile->type_obstack);
-// OBSOLETE      }
-// OBSOLETE        }                           /* end of code for cfront work around */
-
-// OBSOLETE        new_fnlist->fn_fieldlist.name = main_fn_name;
-
-// OBSOLETE  /*-------------------------------------------------*/
-// OBSOLETE        /* Set up the sublists
-// OBSOLETE           Sublists are stuff like args, static, visibility, etc.
-// OBSOLETE           so in ARM, we have to set that info some other way.
-// OBSOLETE           Multiple sublists happen if overloading
-// OBSOLETE           eg: foo::26=##1;:;2A.;
-// OBSOLETE           In g++, we'd loop here thru all the sublists...  */
-
-// OBSOLETE        new_sublist =
-// OBSOLETE    (struct next_fnfield *) xmalloc (sizeof (struct next_fnfield));
-// OBSOLETE        make_cleanup (xfree, new_sublist);
-// OBSOLETE        memset (new_sublist, 0, sizeof (struct next_fnfield));
-
-// OBSOLETE        /* eat 1; from :;2A.; */
-// OBSOLETE        new_sublist->fn_field.type = SYMBOL_TYPE (ref_func);        /* normally takes a read_type */
-// OBSOLETE        /* Make this type look like a method stub for gdb */
-// OBSOLETE        TYPE_FLAGS (new_sublist->fn_field.type) |= TYPE_FLAG_STUB;
-// OBSOLETE        TYPE_CODE (new_sublist->fn_field.type) = TYPE_CODE_METHOD;
-
-// OBSOLETE        /* If this is just a stub, then we don't have the real name here. */
-// OBSOLETE        if (TYPE_STUB (new_sublist->fn_field.type))
-// OBSOLETE    {
-// OBSOLETE      if (!TYPE_DOMAIN_TYPE (new_sublist->fn_field.type))
-// OBSOLETE        TYPE_DOMAIN_TYPE (new_sublist->fn_field.type) = type;
-// OBSOLETE      new_sublist->fn_field.is_stub = 1;
-// OBSOLETE    }
-
-// OBSOLETE        /* physname used later in mangling; eg PFs_i,5 for foo__1aFPFs_i 
-// OBSOLETE           physname gets strcat'd in order to recreate the onto mangled name */
-// OBSOLETE        pname = get_cfront_method_physname (fname);
-// OBSOLETE        new_sublist->fn_field.physname = savestring (pname, strlen (pname));
-
-
-// OBSOLETE        /* Set this member function's visibility fields. 
-// OBSOLETE           Unable to distinguish access from stabs definition!
-// OBSOLETE           Assuming public for now.  FIXME!
-// OBSOLETE           (for private, set new_sublist->fn_field.is_private = 1,
-// OBSOLETE           for public, set new_sublist->fn_field.is_protected = 1) */
-
-// OBSOLETE        /* Unable to distinguish const/volatile from stabs definition!
-// OBSOLETE           Assuming normal for now.  FIXME! */
-
-// OBSOLETE        new_sublist->fn_field.is_const = 0;
-// OBSOLETE        new_sublist->fn_field.is_volatile = 0;      /* volatile not implemented in cfront */
-
-// OBSOLETE        /* Set virtual/static function info
-// OBSOLETE           How to get vtable offsets ? 
-// OBSOLETE           Assuming normal for now FIXME!! 
-// OBSOLETE           For vtables, figure out from whence this virtual function came.
-// OBSOLETE           It may belong to virtual function table of
-// OBSOLETE           one of its baseclasses.
-// OBSOLETE           set:
-// OBSOLETE           new_sublist -> fn_field.voffset = vtable offset,
-// OBSOLETE           new_sublist -> fn_field.fcontext = look_ahead_type;
-// OBSOLETE           where look_ahead_type is type of baseclass */
-// OBSOLETE        if (is_static)
-// OBSOLETE    new_sublist->fn_field.voffset = VOFFSET_STATIC;
-// OBSOLETE        else                        /* normal member function.  */
-// OBSOLETE    new_sublist->fn_field.voffset = 0;
-// OBSOLETE        new_sublist->fn_field.fcontext = 0;
-
-
-// OBSOLETE        /* Prepare new sublist */
-// OBSOLETE        new_sublist->next = sublist;
-// OBSOLETE        sublist = new_sublist;
-// OBSOLETE        length++;
-
-// OBSOLETE        /* In g++, we loop thu sublists - now we set from functions. */
-// OBSOLETE        new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
-// OBSOLETE    obstack_alloc (&objfile->type_obstack,
-// OBSOLETE                   sizeof (struct fn_field) * length);
-// OBSOLETE        memset (new_fnlist->fn_fieldlist.fn_fields, 0,
-// OBSOLETE          sizeof (struct fn_field) * length);
-// OBSOLETE        for (i = length; (i--, sublist); sublist = sublist->next)
-// OBSOLETE    {
-// OBSOLETE      new_fnlist->fn_fieldlist.fn_fields[i] = sublist->fn_field;
-// OBSOLETE    }
-
-// OBSOLETE        new_fnlist->fn_fieldlist.length = length;
-// OBSOLETE        new_fnlist->next = fip->fnlist;
-// OBSOLETE        fip->fnlist = new_fnlist;
-// OBSOLETE        nfn_fields++;
-// OBSOLETE        total_length += length;
-// OBSOLETE        STABS_CONTINUE (pp, objfile);       /* handle \\ */
-// OBSOLETE      }                             /* end of loop */
-
-// OBSOLETE    if (nfn_fields)
-// OBSOLETE      {
-// OBSOLETE        /* type should already have space */
-// OBSOLETE        TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist *)
-// OBSOLETE    TYPE_ALLOC (type, sizeof (struct fn_fieldlist) * nfn_fields);
-// OBSOLETE        memset (TYPE_FN_FIELDLISTS (type), 0,
-// OBSOLETE          sizeof (struct fn_fieldlist) * nfn_fields);
-// OBSOLETE        TYPE_NFN_FIELDS (type) = nfn_fields;
-// OBSOLETE        TYPE_NFN_FIELDS_TOTAL (type) = total_length;
-// OBSOLETE      }
-
-// OBSOLETE    /* end of scope for reading member func */
-
-// OBSOLETE    /* eg: ";;" */
-
-// OBSOLETE    /* Skip trailing ';' and bump count of number of fields seen */
-// OBSOLETE    if (**pp == ';')
-// OBSOLETE      (*pp)++;
-// OBSOLETE    else
-// OBSOLETE      return 0;
-// OBSOLETE    return 1;
-// OBSOLETE  }
-
-// OBSOLETE  /* This routine fixes up partial cfront types that were created
-// OBSOLETE     while parsing the stabs.  The main need for this function is
-// OBSOLETE     to add information such as methods to classes.
-// OBSOLETE     Examples of "p": "sA;;__ct__1AFv foo__1AFv ;;;" */
-// OBSOLETE  int
-// OBSOLETE  resolve_cfront_continuation (struct objfile *objfile, struct symbol *sym,
-// OBSOLETE                         char *p)
-// OBSOLETE  {
-// OBSOLETE    struct symbol *ref_sym = 0;
-// OBSOLETE    char *sname;
-// OBSOLETE    /* snarfed from read_struct_type */
-// OBSOLETE    struct field_info fi;
-// OBSOLETE    struct type *type;
-// OBSOLETE    struct cleanup *back_to;
-
-// OBSOLETE    /* Need to make sure that fi isn't gunna conflict with struct 
-// OBSOLETE       in case struct already had some fnfs */
-// OBSOLETE    fi.list = NULL;
-// OBSOLETE    fi.fnlist = NULL;
-// OBSOLETE    back_to = make_cleanup (null_cleanup, 0);
-
-// OBSOLETE    /* We only accept structs, classes and unions at the moment. 
-// OBSOLETE       Other continuation types include t (typedef), r (long dbl), ... 
-// OBSOLETE       We may want to add support for them as well; 
-// OBSOLETE       right now they are handled by duplicating the symbol information 
-// OBSOLETE       into the type information (see define_symbol) */
-// OBSOLETE    if (*p != 's'                   /* structs */
-// OBSOLETE        && *p != 'c'                /* class */
-// OBSOLETE        && *p != 'u')               /* union */
-// OBSOLETE      return 0;                     /* only handle C++ types */
-// OBSOLETE    p++;
-
-// OBSOLETE    /* Get symbol typs name and validate 
-// OBSOLETE       eg: p = "A;;__ct__1AFv foo__1AFv ;;;" */
-// OBSOLETE    sname = get_substring (&p, ';');
-// OBSOLETE    if (!sname || strcmp (sname, DEPRECATED_SYMBOL_NAME (sym)))
-// OBSOLETE      error ("Internal error: base symbol type name does not match\n");
-
-// OBSOLETE    /* Find symbol's internal gdb reference using demangled_name.
-// OBSOLETE       This is the real sym that we want; 
-// OBSOLETE       sym was a temp hack to make debugger happy */
-// OBSOLETE    ref_sym = lookup_symbol (DEPRECATED_SYMBOL_NAME (sym), 0, STRUCT_DOMAIN, 0, 0);
-// OBSOLETE    type = SYMBOL_TYPE (ref_sym);
-
-
-// OBSOLETE    /* Now read the baseclasses, if any, read the regular C struct or C++
-// OBSOLETE       class member fields, attach the fields to the type, read the C++
-// OBSOLETE       member functions, attach them to the type, and then read any tilde
-// OBSOLETE       field (baseclass specifier for the class holding the main vtable). */
-
-// OBSOLETE    if (!read_cfront_baseclasses (&fi, &p, type, objfile)
-// OBSOLETE    /* g++ does this next, but cfront already did this: 
-// OBSOLETE       || !read_struct_fields (&fi, &p, type, objfile) */
-// OBSOLETE        || !copy_cfront_struct_fields (&fi, type, objfile)
-// OBSOLETE        || !read_cfront_member_functions (&fi, &p, type, objfile)
-// OBSOLETE        || !read_cfront_static_fields (&fi, &p, type, objfile)
-// OBSOLETE        || !attach_fields_to_type (&fi, type, objfile)
-// OBSOLETE        || !attach_fn_fields_to_type (&fi, type)
-// OBSOLETE    /* g++ does this next, but cfront doesn't seem to have this: 
-// OBSOLETE       || !read_tilde_fields (&fi, &p, type, objfile) */
-// OBSOLETE      )
-// OBSOLETE      {
-// OBSOLETE        type = error_type (&p, objfile);
-// OBSOLETE      }
-
-// OBSOLETE    do_cleanups (back_to);
-// OBSOLETE    return 0;
-// OBSOLETE  }
-// OBSOLETE  /* End of code added to support parsing of ARM/Cfront stabs strings */
-#endif /* OBSOLETE CFront */
-
-/* This routine fixes up symbol references/aliases to point to the original
-   symbol definition.  Returns 0 on failure, non-zero on success.  */
-
-static int
-resolve_symbol_reference (struct objfile *objfile, struct symbol *sym, char *p)
-{
-  int refnum;
-  struct symbol *ref_sym = 0;
-  struct alias_list *alias;
-
-  /* If this is not a symbol reference return now.  */
-  if (*p != '#')
-    return 0;
-
-  /* Use "#<num>" as the name; we'll fix the name later.
-     We stored the original symbol name as "#<id>=<name>"
-     so we can now search for "#<id>" to resolving the reference.
-     We'll fix the names later by removing the "#<id>" or "#<id>=" */
-
-/*---------------------------------------------------------*/
-  /* Get the reference id number, and 
-     advance p past the names so we can parse the rest. 
-     eg: id=2 for p : "2=", "2=z:r(0,1)" "2:r(0,1);l(#5,#6),l(#7,#4)" */
-/*---------------------------------------------------------*/
-
-  /* This gets reference name from string.  sym may not have a name. */
-
-  /* Get the reference number associated with the reference id in the
-     gdb stab string.  From that reference number, get the main/primary
-     symbol for this alias.  */
-  refnum = process_reference (&p);
-  ref_sym = ref_search (refnum);
-  if (!ref_sym)
-    {
-      lrs_general_complaint ("symbol for reference not found");
-      return 0;
-    }
-
-  /* Parse the stab of the referencing symbol
-     now that we have the referenced symbol.
-     Add it as a new symbol and a link back to the referenced symbol.
-     eg: p : "=", "=z:r(0,1)" ":r(0,1);l(#5,#6),l(#7,#4)" */
-
-
-  /* If the stab symbol table and string contain:
-     RSYM   0      5      00000000 868    #15=z:r(0,1)
-     LBRAC  0      0      00000000 899    #5=
-     SLINE  0      16     00000003 923    #6=
-     Then the same symbols can be later referenced by:
-     RSYM   0      5      00000000 927    #15:r(0,1);l(#5,#6)
-     This is used in live range splitting to:
-     1) specify that a symbol (#15) is actually just a new storage 
-     class for a symbol (#15=z) which was previously defined.
-     2) specify that the beginning and ending ranges for a symbol 
-     (#15) are the values of the beginning (#5) and ending (#6) 
-     symbols. */
-
-  /* Read number as reference id.
-     eg: p : "=", "=z:r(0,1)" ":r(0,1);l(#5,#6),l(#7,#4)" */
-  /* FIXME! Might I want to use SYMBOL_CLASS (sym) = LOC_OPTIMIZED_OUT;
-     in case of "l(0,0)"? */
-
-/*--------------------------------------------------*/
-  /* Add this symbol to the reference list.           */
-/*--------------------------------------------------*/
-
-  alias = (struct alias_list *) obstack_alloc (&objfile->type_obstack,
-                                              sizeof (struct alias_list));
-  if (!alias)
-    {
-      lrs_general_complaint ("Unable to allocate alias list memory");
-      return 0;
-    }
-
-  alias->next = 0;
-  alias->sym = sym;
-
-  if (!SYMBOL_ALIASES (ref_sym))
-    {
-      SYMBOL_ALIASES (ref_sym) = alias;
-    }
-  else
-    {
-      struct alias_list *temp;
-
-      /* Get to the end of the list.  */
-      for (temp = SYMBOL_ALIASES (ref_sym);
-          temp->next;
-          temp = temp->next)
-       ;
-      temp->next = alias;
-    }
-
-  /* Want to fix up name so that other functions (eg. valops)
-     will correctly print the name.
-     Don't add_symbol_to_list so that lookup_symbol won't find it.
-     nope... needed for fixups. */
-  DEPRECATED_SYMBOL_NAME (sym) = DEPRECATED_SYMBOL_NAME (ref_sym);
-
-  /* Done!  */
-  return 1;
-}
-
 /* Structure for storing pointers to reference definitions for fast lookup 
    during "process_later". */
 
@@ -1149,16 +524,6 @@ ref_search (int refnum)
   return ref_map[refnum].sym;
 }
 
-/* Return value for the reference REFNUM.  */
-
-static CORE_ADDR
-ref_search_value (int refnum)
-{
-  if (refnum < 0 || refnum > ref_count)
-    return 0;
-  return ref_map[refnum].value;
-}
-
 /* Parse a reference id in STRING and return the resulting
    reference number.  Move STRING beyond the reference id.  */
 
@@ -1211,7 +576,6 @@ symbol_reference_defined (char **string)
     }
 }
 
-/* ARGSUSED */
 struct symbol *
 define_symbol (CORE_ADDR valu, char *string, int desc, int type,
               struct objfile *objfile)
@@ -1248,7 +612,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
   nameless = (p == string || ((string[0] == ' ') && (string[1] == ':')));
 
   current_symbol = sym = (struct symbol *)
-    obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
+    obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol));
   memset (sym, 0, sizeof (struct symbol));
 
   switch (type & N_TYPE)
@@ -1282,7 +646,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
        {
        case 't':
          DEPRECATED_SYMBOL_NAME (sym) = obsavestring ("this", strlen ("this"),
-                                           &objfile->symbol_obstack);
+                                           &objfile->objfile_obstack);
          break;
 
        case 'v':               /* $vtbl_ptr_type */
@@ -1291,7 +655,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 
        case 'e':
          DEPRECATED_SYMBOL_NAME (sym) = obsavestring ("eh_throw", strlen ("eh_throw"),
-                                           &objfile->symbol_obstack);
+                                           &objfile->objfile_obstack);
          break;
 
        case '_':
@@ -1305,46 +669,11 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 #endif
 
        default:
-         complaint (&symfile_complaints, "Unknown C++ symbol name `%s'",
+         complaint (&symfile_complaints, _("Unknown C++ symbol name `%s'"),
                     string);
          goto normal;          /* Do *something* with it */
        }
     }
-  else if (string[0] == '#')
-    {
-      /* Special GNU C extension for referencing symbols.  */
-      char *s;
-      int refnum, nlen;
-
-      /* If STRING defines a new reference id, then add it to the
-         reference map.  Else it must be referring to a previously
-         defined symbol, so add it to the alias list of the previously
-         defined symbol.  */
-      s = string;
-      refnum = symbol_reference_defined (&s);
-      if (refnum >= 0)
-       ref_add (refnum, sym, string, SYMBOL_VALUE (sym));
-      else if (!resolve_symbol_reference (objfile, sym, string))
-       return NULL;
-
-      /* S..P contains the name of the symbol.  We need to store
-         the correct name into DEPRECATED_SYMBOL_NAME.  */
-      nlen = p - s;
-      if (refnum >= 0)
-       {
-         if (nlen > 0)
-           SYMBOL_SET_NAMES (sym, s, nlen, objfile);
-         else
-           /* FIXME! Want DEPRECATED_SYMBOL_NAME (sym) = 0;
-              Get error if leave name 0.  So give it something. */
-           {
-             nlen = p - string;
-             SYMBOL_SET_NAMES (sym, string, nlen, objfile);
-           }
-       }
-      /* Advance STRING beyond the reference id.  */
-      string = s;
-    }
   else
     {
     normal:
@@ -1409,7 +738,7 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
            SYMBOL_TYPE (sym) = lookup_fundamental_type (objfile,
                                                         FT_DBL_PREC_FLOAT);
            dbl_valu = (char *)
-             obstack_alloc (&objfile->symbol_obstack,
+             obstack_alloc (&objfile->objfile_obstack,
                             TYPE_LENGTH (SYMBOL_TYPE (sym)));
            store_typed_floating (dbl_valu, SYMBOL_TYPE (sym), d);
            SYMBOL_VALUE_BYTES (sym) = dbl_valu;
@@ -1649,61 +978,17 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
              init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
                         TYPE_FLAG_UNSIGNED, "unsigned int", NULL);
 
-         if (BELIEVE_PCC_PROMOTION_TYPE)
+         /* If PCC says a parameter is a short or a char, it is
+            really an int.  */
+         if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (pcc_promotion_type)
+             && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
            {
-             /* This is defined on machines (e.g. sparc) where we
-                should believe the type of a PCC 'short' argument,
-                but shouldn't believe the address (the address is the
-                address of the corresponding int).
-
-                My guess is that this correction, as opposed to
-                changing the parameter to an 'int' (as done below,
-                for PCC on most machines), is the right thing to do
-                on all machines, but I don't want to risk breaking
-                something that already works.  On most PCC machines,
-                the sparc problem doesn't come up because the calling
-                function has to zero the top bytes (not knowing
-                whether the called function wants an int or a short),
-                so there is little practical difference between an
-                int and a short (except perhaps what happens when the
-                GDB user types "print short_arg = 0x10000;").
-
-                Hacked for SunOS 4.1 by gnu@cygnus.com.  In 4.1, the
-                compiler actually produces the correct address (we
-                don't need to fix it up).  I made this code adapt so
-                that it will offset the symbol if it was pointing at
-                an int-aligned location and not otherwise.  This way
-                you can use the same gdb for 4.0.x and 4.1 systems.
-
-                If the parameter is shorter than an int, and is
-                integral (e.g. char, short, or unsigned equivalent),
-                and is claimed to be passed on an integer boundary,
-                don't believe it!  Offset the parameter's address to
-                the tail-end of that integer.  */
-
-             if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (pcc_promotion_type)
-                 && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT
-             && 0 == SYMBOL_VALUE (sym) % TYPE_LENGTH (pcc_promotion_type))
-               {
-                 SYMBOL_VALUE (sym) += TYPE_LENGTH (pcc_promotion_type)
-                   - TYPE_LENGTH (SYMBOL_TYPE (sym));
-               }
-             break;
-           }
-         else
-           {
-             /* If PCC says a parameter is a short or a char,
-                it is really an int.  */
-             if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (pcc_promotion_type)
-                 && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
-               {
-                 SYMBOL_TYPE (sym) =
-                   TYPE_UNSIGNED (SYMBOL_TYPE (sym))
-                   ? pcc_unsigned_promotion_type
-                   : pcc_promotion_type;
-               }
-             break;
+             SYMBOL_TYPE (sym) =
+               TYPE_UNSIGNED (SYMBOL_TYPE (sym))
+               ? pcc_unsigned_promotion_type
+               : pcc_promotion_type;
            }
+         break;
        }
 
     case 'P':
@@ -1748,17 +1033,20 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
       if (within_function)
        {
-         /* Sun cc uses a pair of symbols, one 'p' and one 'r' with 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 DEPRECATED_REG_STRUCT_HAS_ADDR, because the compiler puts out
-            the 'p' symbol even if it never saves the argument onto the stack.
-
-            On most machines, we want to preserve both symbols, so that
-            we can still get information about what is going on with the
-            stack (VAX for computing args_printed, using stack slots instead
-            of saved registers in backtraces, etc.).
+         /* Sun cc uses a pair of symbols, one 'p' and one 'r', with
+            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
+            the 'p' symbol even if it never saves the argument onto
+            the stack.
+
+            On most machines, we want to preserve both symbols, so
+            that we can still get information about what is going on
+            with the stack (VAX for computing args_printed, using
+            stack slots instead of saved registers in backtraces,
+            etc.).
 
             Note that this code illegally combines
             main(argc) struct foo argc; { register struct foo argc; }
@@ -1767,22 +1055,15 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 
          if (local_symbols
              && local_symbols->nsyms > 0
-#ifndef USE_REGISTER_NOT_ARG
-             && DEPRECATED_REG_STRUCT_HAS_ADDR_P ()
-             && DEPRECATED_REG_STRUCT_HAS_ADDR (processing_gcc_compilation,
-                                     SYMBOL_TYPE (sym))
-             && (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
-                 || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION
-                 || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_SET
-                 || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_BITSTRING)
-#endif
-           )
+             && gdbarch_stabs_argument_has_addr (current_gdbarch,
+                                                 SYMBOL_TYPE (sym)))
            {
              struct symbol *prev_sym;
              prev_sym = local_symbols->symbol[local_symbols->nsyms - 1];
              if ((SYMBOL_CLASS (prev_sym) == LOC_REF_ARG
                   || SYMBOL_CLASS (prev_sym) == LOC_ARG)
-                 && STREQ (DEPRECATED_SYMBOL_NAME (prev_sym), DEPRECATED_SYMBOL_NAME (sym)))
+                 && strcmp (DEPRECATED_SYMBOL_NAME (prev_sym),
+                            DEPRECATED_SYMBOL_NAME (sym)) == 0)
                {
                  SYMBOL_CLASS (prev_sym) = LOC_REGPARM;
                  /* Use the type from the LOC_REGISTER; that is the type
@@ -1913,15 +1194,6 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
 
       if (synonym)
        p++;
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE      /* The semantics of C++ state that "struct foo { ... }" also defines 
-// OBSOLETE         a typedef for "foo".  Unfortunately, cfront never makes the typedef
-// OBSOLETE         when translating C++ into C.  We make the typedef here so that
-// OBSOLETE         "ptype foo" works as expected for cfront translated code.  */
-// OBSOLETE       else if ((current_subfile->language == language_cplus)
-// OBSOLETE           || (current_subfile->language == language_objc))
-// OBSOLETE    synonym = 1;
-#endif /* OBSOLETE CFront */
 
       SYMBOL_TYPE (sym) = read_type (&p, objfile);
  
@@ -1935,21 +1207,21 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
       if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
        TYPE_TAG_NAME (SYMBOL_TYPE (sym))
-         = obconcat (&objfile->type_obstack, "", "", DEPRECATED_SYMBOL_NAME (sym));
+         = obconcat (&objfile->objfile_obstack, "", "", DEPRECATED_SYMBOL_NAME (sym));
       add_symbol_to_list (sym, &file_symbols);
 
       if (synonym)
        {
          /* Clone the sym and then modify it. */
          struct symbol *typedef_sym = (struct symbol *)
-         obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
+         obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol));
          *typedef_sym = *sym;
          SYMBOL_CLASS (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->type_obstack, "", "", DEPRECATED_SYMBOL_NAME (sym));
+             = obconcat (&objfile->objfile_obstack, "", "", DEPRECATED_SYMBOL_NAME (sym));
          add_symbol_to_list (typedef_sym, &file_symbols);
        }
       break;
@@ -2011,32 +1283,6 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
       add_symbol_to_list (sym, &local_symbols);
       break;
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE        /* New code added to support cfront stabs strings.
-// OBSOLETE           Note: case 'P' already handled above */
-// OBSOLETE      case 'Z':
-// OBSOLETE        /* Cfront type continuation coming up!
-// OBSOLETE           Find the original definition and add to it.
-// OBSOLETE           We'll have to do this for the typedef too,
-// OBSOLETE           since we cloned the symbol to define a type in read_type.
-// OBSOLETE           Stabs info examples:
-// OBSOLETE           __1C :Ztl 
-// OBSOLETE           foo__1CFv :ZtF (first def foo__1CFv:F(0,3);(0,24))
-// OBSOLETE           C:ZsC;;__ct__1CFv func1__1CFv func2__1CFv ... ;;;
-// OBSOLETE           where C is the name of the class.
-// OBSOLETE           Unfortunately, we can't lookup the original symbol yet 'cuz 
-// OBSOLETE           we haven't finished reading all the symbols.
-// OBSOLETE           Instead, we save it for processing later */
-// OBSOLETE        process_later (sym, p, resolve_cfront_continuation);
-// OBSOLETE        SYMBOL_TYPE (sym) = error_type (&p, objfile);       /* FIXME! change later */
-// OBSOLETE        SYMBOL_CLASS (sym) = LOC_CONST;
-// OBSOLETE        SYMBOL_VALUE (sym) = 0;
-// OBSOLETE        SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
-// OBSOLETE        /* Don't add to list - we'll delete it later when 
-// OBSOLETE           we add the continuation to the real sym */
-// OBSOLETE        return sym;
-// OBSOLETE        /* End of new code added to support cfront stabs strings */
-#endif /* OBSOLETE CFront */
 
     default:
       SYMBOL_TYPE (sym) = error_type (&p, objfile);
@@ -2047,161 +1293,26 @@ define_symbol (CORE_ADDR valu, char *string, int desc, int type,
       break;
     }
 
-  /* When passing structures to a function, some systems sometimes pass
-     the address in a register, not the structure itself. */
+  /* Some systems pass variables of certain types by reference instead
+     of by value, i.e. they will pass the address of a structure (in a
+     register or on the stack) instead of the structure itself.  */
 
-  if (DEPRECATED_REG_STRUCT_HAS_ADDR_P ()
-      && DEPRECATED_REG_STRUCT_HAS_ADDR (processing_gcc_compilation, SYMBOL_TYPE (sym))
+  if (gdbarch_stabs_argument_has_addr (current_gdbarch, SYMBOL_TYPE (sym))
       && (SYMBOL_CLASS (sym) == LOC_REGPARM || SYMBOL_CLASS (sym) == LOC_ARG))
     {
-      struct type *symbol_type = check_typedef (SYMBOL_TYPE (sym));
-
-      if ((TYPE_CODE (symbol_type) == TYPE_CODE_STRUCT)
-         || (TYPE_CODE (symbol_type) == TYPE_CODE_UNION)
-         || (TYPE_CODE (symbol_type) == TYPE_CODE_BITSTRING)
-         || (TYPE_CODE (symbol_type) == TYPE_CODE_SET))
-       {
-         /* If DEPRECATED_REG_STRUCT_HAS_ADDR yields non-zero we have to convert
-            LOC_REGPARM to LOC_REGPARM_ADDR for structures and unions. */
-         if (SYMBOL_CLASS (sym) == LOC_REGPARM)
-           SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
-         /* Likewise for converting LOC_ARG to LOC_REF_ARG (for the 7th
-            and subsequent arguments on the sparc, for example).  */
-         else if (SYMBOL_CLASS (sym) == LOC_ARG)
-           SYMBOL_CLASS (sym) = LOC_REF_ARG;
-       }
+      /* We have to convert LOC_REGPARM to LOC_REGPARM_ADDR (for
+         variables passed in a register).  */
+      if (SYMBOL_CLASS (sym) == LOC_REGPARM)
+       SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
+      /* Likewise for converting LOC_ARG to LOC_REF_ARG (for the 7th
+        and subsequent arguments on SPARC, for example).  */
+      else if (SYMBOL_CLASS (sym) == LOC_ARG)
+       SYMBOL_CLASS (sym) = LOC_REF_ARG;
     }
 
-  /* Is there more to parse?  For example LRS/alias information?  */
-  while (*p && *p == ';')
-    {
-      p++;
-      if (*p && p[0] == 'l' && p[1] == '(')
-       {
-         /* GNU extensions for live range splitting may be appended to 
-            the end of the stab string.  eg. "l(#1,#2);l(#3,#5)" */
-
-         /* Resolve the live range and add it to SYM's live range list.  */
-         if (!resolve_live_range (objfile, sym, p))
-           return NULL;
-
-         /* Find end of live range info. */
-         p = strchr (p, ')');
-         if (!*p || *p != ')')
-           {
-             lrs_general_complaint ("live range format not recognized");
-             return NULL;
-           }
-         p++;
-       }
-    }
   return sym;
 }
 
-/* Add the live range found in P to the symbol SYM in objfile OBJFILE.  Returns
-   non-zero on success, zero otherwise.  */
-
-static int
-resolve_live_range (struct objfile *objfile, struct symbol *sym, char *p)
-{
-  int refnum;
-  CORE_ADDR start, end;
-
-  /* Sanity check the beginning of the stabs string.  */
-  if (!*p || *p != 'l')
-    {
-      lrs_general_complaint ("live range string 1");
-      return 0;
-    }
-  p++;
-
-  if (!*p || *p != '(')
-    {
-      lrs_general_complaint ("live range string 2");
-      return 0;
-    }
-  p++;
-
-  /* Get starting value of range and advance P past the reference id.
-
-     ?!? In theory, the process_reference should never fail, but we should
-     catch that case just in case the compiler scrogged the stabs.  */
-  refnum = process_reference (&p);
-  start = ref_search_value (refnum);
-  if (!start)
-    {
-      lrs_general_complaint ("Live range symbol not found 1");
-      return 0;
-    }
-
-  if (!*p || *p != ',')
-    {
-      lrs_general_complaint ("live range string 3");
-      return 0;
-    }
-  p++;
-
-  /* Get ending value of range and advance P past the reference id.
-
-     ?!? In theory, the process_reference should never fail, but we should
-     catch that case just in case the compiler scrogged the stabs.  */
-  refnum = process_reference (&p);
-  end = ref_search_value (refnum);
-  if (!end)
-    {
-      lrs_general_complaint ("Live range symbol not found 2");
-      return 0;
-    }
-
-  if (!*p || *p != ')')
-    {
-      lrs_general_complaint ("live range string 4");
-      return 0;
-    }
-
-  /* Now that we know the bounds of the range, add it to the
-     symbol.  */
-  add_live_range (objfile, sym, start, end);
-
-  return 1;
-}
-
-/* Add a new live range defined by START and END to the symbol SYM
-   in objfile OBJFILE.  */
-
-static void
-add_live_range (struct objfile *objfile, struct symbol *sym, CORE_ADDR start,
-               CORE_ADDR end)
-{
-  struct range_list *r, *rs;
-
-  if (start >= end)
-    {
-      lrs_general_complaint ("end of live range follows start");
-      return;
-    }
-
-  /* Alloc new live range structure. */
-  r = (struct range_list *)
-    obstack_alloc (&objfile->type_obstack,
-                  sizeof (struct range_list));
-  r->start = start;
-  r->end = end;
-  r->next = 0;
-
-  /* Append this range to the symbol's range list. */
-  if (!SYMBOL_RANGES (sym))
-    SYMBOL_RANGES (sym) = r;
-  else
-    {
-      /* Get the last range for the symbol. */
-      for (rs = SYMBOL_RANGES (sym); rs->next; rs = rs->next)
-       ;
-      rs->next = r;
-    }
-}
-\f
-
 /* Skip rest of this symbol and return an error type.
 
    General notes on error recovery:  error_type always skips to the
@@ -2234,7 +1345,7 @@ add_live_range (struct objfile *objfile, struct symbol *sym, CORE_ADDR start,
 static struct type *
 error_type (char **pp, struct objfile *objfile)
 {
-  complaint (&symfile_complaints, "couldn't parse type; debugger out of date?");
+  complaint (&symfile_complaints, _("couldn't parse type; debugger out of date?"));
   while (1)
     {
       /* Skip to end of symbol.  */
@@ -2291,11 +1402,21 @@ read_type (char **pp, struct objfile *objfile)
       if (read_type_number (pp, typenums) != 0)
        return error_type (pp, objfile);
 
-      /* Type is not being defined here.  Either it already exists,
-         or this is a forward reference to it.  dbx_alloc_type handles
-         both cases.  */
       if (**pp != '=')
-       return dbx_alloc_type (typenums, objfile);
+        {
+          /* Type is not being defined here.  Either it already
+             exists, or this is a forward reference to it.
+             dbx_alloc_type handles both cases.  */
+          type = dbx_alloc_type (typenums, 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)
+            add_undefined_type (type);
+
+          return type;
+        }
 
       /* Type is being defined here.  */
       /* Skip the '='.
@@ -2345,7 +1466,7 @@ again:
                /* Complain and keep going, so compilers can invent new
                   cross-reference types.  */
                complaint (&symfile_complaints,
-                          "Unrecognized cross-reference type `%c'", (*pp)[0]);
+                          _("Unrecognized cross-reference type `%c'"), (*pp)[0]);
                code = TYPE_CODE_STRUCT;
                break;
              }
@@ -2372,7 +1493,7 @@ again:
                return error_type (pp, objfile);
            }
          to = type_name =
-           (char *) obstack_alloc (&objfile->type_obstack, p - *pp + 1);
+           (char *) obstack_alloc (&objfile->objfile_obstack, p - *pp + 1);
 
          /* Copy the name.  */
          from = *pp + 1;
@@ -2385,11 +1506,9 @@ again:
          *pp = from + 1;
        }
 
-       /* Now check to see whether the type has already been
-          declared.  This was written for arrays of cross-referenced
-          types before we had TYPE_CODE_TARGET_STUBBED, so I'm pretty
-          sure it is not necessary anymore.  But it might be a good
-          idea, to save a little memory.  */
+        /* If this type has already been declared, then reuse the same
+           type, rather than allocating a new one.  This saves some
+           memory.  */
 
        for (ppt = file_symbols; ppt; ppt = ppt->next)
          for (i = 0; i < ppt->nsyms; i++)
@@ -2399,10 +1518,12 @@ again:
              if (SYMBOL_CLASS (sym) == LOC_TYPEDEF
                  && SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN
                  && (TYPE_CODE (SYMBOL_TYPE (sym)) == code)
-                 && STREQ (DEPRECATED_SYMBOL_NAME (sym), type_name))
+                 && strcmp (DEPRECATED_SYMBOL_NAME (sym), type_name) == 0)
                {
-                 obstack_free (&objfile->type_obstack, type_name);
+                 obstack_free (&objfile->objfile_obstack, type_name);
                  type = SYMBOL_TYPE (sym);
+                 if (typenums[0] != -1)
+                   *dbx_lookup_type (typenums) = type;
                  return type;
                }
            }
@@ -2551,7 +1672,7 @@ again:
         else
           {
            complaint (&symfile_complaints,
-                      "Prototyped function type didn't end arguments with `#':\n%s",
+                      _("Prototyped function type didn't end arguments with `#':\n%s"),
                       type_start);
           }
 
@@ -2662,7 +1783,7 @@ again:
          return_type = read_type (pp, objfile);
          if (*(*pp)++ != ';')
            complaint (&symfile_complaints,
-                      "invalid (minimal) member type data format at symtab pos %d.",
+                      _("invalid (minimal) member type data format at symtab pos %d."),
                       symnum);
          type = allocate_stub_method (return_type);
          if (typenums[0] != -1)
@@ -2690,7 +1811,7 @@ again:
       break;
 
     case 'r':                  /* Range type */
-      type = read_range_type (pp, typenums, objfile);
+      type = read_range_type (pp, typenums, type_size, objfile);
       if (typenums[0] != -1)
        *dbx_lookup_type (typenums) = type;
       break;
@@ -2765,7 +1886,7 @@ again:
 
   if (type == 0)
     {
-      warning ("GDB internal error, type is NULL in stabsread.c\n");
+      warning (_("GDB internal error, type is NULL in stabsread.c."));
       return error_type (pp, objfile);
     }
 
@@ -2790,7 +1911,7 @@ rs6000_builtin_type (int typenum)
 
   if (typenum >= 0 || typenum < -NUMBER_RECOGNIZED)
     {
-      complaint (&symfile_complaints, "Unknown builtin type %d", typenum);
+      complaint (&symfile_complaints, _("Unknown builtin type %d"), typenum);
       return builtin_type_error;
     }
   if (negative_types[-typenum] != NULL)
@@ -2955,7 +2076,7 @@ update_method_name_from_physname (char **old_name, char *physname)
   if (method_name == NULL)
     {
       complaint (&symfile_complaints,
-                "Method has bad physname %s\n", physname);
+                _("Method has bad physname %s\n"), physname);
       return;
     }
 
@@ -3153,7 +2274,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
              break;
            default:
              complaint (&symfile_complaints,
-                        "const/volatile indicator missing, got '%c'", **pp);
+                        _("const/volatile indicator missing, got '%c'"), **pp);
              break;
            }
 
@@ -3170,7 +2291,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
                   the sign bit out, and usable as a valid index into
                   the array.  Remove the sign bit here.  */
                new_sublist->fn_field.voffset =
-                 (0x7fffffff & read_huge_number (pp, ';', &nbits)) + 2;
+                 (0x7fffffff & read_huge_number (pp, ';', &nbits, 0)) + 2;
                if (nbits != 0)
                  return 0;
 
@@ -3236,7 +2357,7 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
            default:
              /* error */
              complaint (&symfile_complaints,
-                        "member function type missing, got '%c'", (*pp)[-1]);
+                        _("member function type missing, got '%c'"), (*pp)[-1]);
              /* Fall through into normal member function.  */
 
            case '.':
@@ -3356,11 +2477,11 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
              make_cleanup (xfree, destr_fnlist);
              memset (destr_fnlist, 0, sizeof (struct next_fnfieldlist));
              destr_fnlist->fn_fieldlist.name
-               = obconcat (&objfile->type_obstack, "", "~",
+               = obconcat (&objfile->objfile_obstack, "", "~",
                            new_fnlist->fn_fieldlist.name);
 
              destr_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
-               obstack_alloc (&objfile->type_obstack,
+               obstack_alloc (&objfile->objfile_obstack,
                               sizeof (struct fn_field) * has_destructor);
              memset (destr_fnlist->fn_fieldlist.fn_fields, 0,
                  sizeof (struct fn_field) * has_destructor);
@@ -3406,7 +2527,8 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
            }
          else if (has_destructor && new_fnlist->fn_fieldlist.name[0] != '~')
            {
-             new_fnlist->fn_fieldlist.name = concat ("~", main_fn_name, NULL);
+             new_fnlist->fn_fieldlist.name =
+               concat ("~", main_fn_name, (char *)NULL);
              xfree (main_fn_name);
            }
          else if (!has_stub)
@@ -3421,11 +2543,11 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
              if (ret)
                new_fnlist->fn_fieldlist.name
                  = obsavestring (dem_opname, strlen (dem_opname),
-                                 &objfile->type_obstack);
+                                 &objfile->objfile_obstack);
            }
 
          new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
-           obstack_alloc (&objfile->type_obstack,
+           obstack_alloc (&objfile->objfile_obstack,
                           sizeof (struct fn_field) * length);
          memset (new_fnlist->fn_fieldlist.fn_fields, 0,
                  sizeof (struct fn_field) * length);
@@ -3494,7 +2616,7 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type,
                  name = "";
          }
          fip->list->field.name =
-           obconcat (&objfile->type_obstack, vptr_name, name, "");
+           obconcat (&objfile->objfile_obstack, vptr_name, name, "");
          break;
 
        case 'b':               /* $vb -- a virtual bsomethingorother */
@@ -3502,18 +2624,18 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type,
          if (name == NULL)
            {
              complaint (&symfile_complaints,
-                        "C++ abbreviated type name unknown at symtab pos %d",
+                        _("C++ abbreviated type name unknown at symtab pos %d"),
                         symnum);
              name = "FOO";
            }
          fip->list->field.name =
-           obconcat (&objfile->type_obstack, vb_name, name, "");
+           obconcat (&objfile->objfile_obstack, vb_name, name, "");
          break;
 
        default:
          invalid_cpp_abbrev_complaint (*pp);
          fip->list->field.name =
-           obconcat (&objfile->type_obstack,
+           obconcat (&objfile->objfile_obstack,
                      "INVALID_CPLUSPLUS_ABBREV", "", "");
          break;
        }
@@ -3535,7 +2657,8 @@ read_cpp_abbrev (struct field_info *fip, char **pp, struct type *type,
 
       {
        int nbits;
-       FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ';', &nbits);
+       FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ';', &nbits,
+                                                            0);
        if (nbits != 0)
          return 0;
       }
@@ -3558,39 +2681,8 @@ static void
 read_one_struct_field (struct field_info *fip, char **pp, char *p,
                       struct type *type, struct objfile *objfile)
 {
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE    /* The following is code to work around cfront generated stabs.
-// OBSOLETE       The stabs contains full mangled name for each field.
-// OBSOLETE       We try to demangle the name and extract the field name out of it.
-// OBSOLETE     */
-// OBSOLETE    if (ARM_DEMANGLING && current_subfile->language == language_cplus)
-// OBSOLETE      {
-// OBSOLETE        char save_p;
-// OBSOLETE        char *dem, *dem_p;
-// OBSOLETE        save_p = *p;
-// OBSOLETE        *p = '\0';
-// OBSOLETE        dem = cplus_demangle (*pp, DMGL_ANSI | DMGL_PARAMS);
-// OBSOLETE        if (dem != NULL)
-// OBSOLETE    {
-// OBSOLETE      dem_p = strrchr (dem, ':');
-// OBSOLETE      if (dem_p != 0 && *(dem_p - 1) == ':')
-// OBSOLETE        dem_p++;
-// OBSOLETE      FIELD_NAME (fip->list->field) =
-// OBSOLETE        obsavestring (dem_p, strlen (dem_p), &objfile->type_obstack);
-// OBSOLETE    }
-// OBSOLETE        else
-// OBSOLETE    {
-// OBSOLETE      FIELD_NAME (fip->list->field) =
-// OBSOLETE        obsavestring (*pp, p - *pp, &objfile->type_obstack);
-// OBSOLETE    }
-// OBSOLETE        *p = save_p;
-// OBSOLETE      }
-// OBSOLETE    /* end of code for cfront work around */
-
-// OBSOLETE   else
-#endif /* OBSOLETE CFront */
-    fip->list->field.name =
-      obsavestring (*pp, p - *pp, &objfile->type_obstack);
+  fip->list->field.name =
+    obsavestring (*pp, p - *pp, &objfile->objfile_obstack);
   *pp = p + 1;
 
   /* This means we have a visibility for a field coming. */
@@ -3639,13 +2731,13 @@ read_one_struct_field (struct field_info *fip, char **pp, char *p,
 
   {
     int nbits;
-    FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ',', &nbits);
+    FIELD_BITPOS (fip->list->field) = read_huge_number (pp, ',', &nbits, 0);
     if (nbits != 0)
       {
        stabs_general_complaint ("bad structure-type format");
        return;
       }
-    FIELD_BITSIZE (fip->list->field) = read_huge_number (pp, ';', &nbits);
+    FIELD_BITSIZE (fip->list->field) = read_huge_number (pp, ';', &nbits, 0);
     if (nbits != 0)
       {
        stabs_general_complaint ("bad structure-type format");
@@ -3660,7 +2752,7 @@ read_one_struct_field (struct field_info *fip, char **pp, char *p,
          it is a field which has been optimized out.  The correct stab for
          this case is to use VISIBILITY_IGNORE, but that is a recent
          invention.  (2) It is a 0-size array.  For example
-         union { int num; char str[0]; } foo.  Printing "<no value>" for
+         union { int num; char str[0]; } foo.  Printing _("<no value>" for
          str in "p foo" is OK, since foo.str (and thus foo.str[3])
          will continue to work, and a 0-size array as a whole doesn't
          have any contents to print.
@@ -3841,7 +2933,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
   ALLOCATE_CPLUS_STRUCT_TYPE (type);
   {
     int nbits;
-    TYPE_N_BASECLASSES (type) = read_huge_number (pp, ',', &nbits);
+    TYPE_N_BASECLASSES (type) = read_huge_number (pp, ',', &nbits, 0);
     if (nbits != 0)
       return 0;
   }
@@ -3885,7 +2977,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
          /* Unknown character.  Complain and treat it as non-virtual.  */
          {
            complaint (&symfile_complaints,
-                      "Unknown virtual character `%c' for baseclass", **pp);
+                      _("Unknown virtual character `%c' for baseclass"), **pp);
          }
        }
       ++(*pp);
@@ -3902,7 +2994,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
             public.  */
          {
            complaint (&symfile_complaints,
-                      "Unknown visibility `%c' for baseclass",
+                      _("Unknown visibility `%c' for baseclass"),
                       new->visibility);
            new->visibility = VISIBILITY_PUBLIC;
          }
@@ -3915,7 +3007,7 @@ read_baseclasses (struct field_info *fip, char **pp, struct type *type,
           corresponding to this baseclass.  Always zero in the absence of
           multiple inheritance.  */
 
-       FIELD_BITPOS (new->field) = read_huge_number (pp, ',', &nbits);
+       FIELD_BITPOS (new->field) = read_huge_number (pp, ',', &nbits, 0);
        if (nbits != 0)
          return 0;
       }
@@ -4010,7 +3102,7 @@ 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 not found when defining class `%s'",
+                        _("virtual function table pointer not found when defining class `%s'"),
                         TYPE_NAME (type));
              return 0;
            }
@@ -4041,138 +3133,6 @@ attach_fn_fields_to_type (struct field_info *fip, struct type *type)
   return 1;
 }
 
-#if 0 /* OBSOLETE CFront */
-// OBSOLETE  /* read cfront class static data.
-// OBSOLETE     pp points to string starting with the list of static data
-// OBSOLETE     eg: A:ZcA;1@Bpub v2@Bvirpri;__ct__1AFv func__1AFv *sfunc__1AFv ;as__1A ;;
-// OBSOLETE     ^^^^^^^^
-
-// OBSOLETE     A:ZcA;;foopri__1AFv foopro__1AFv __ct__1AFv __ct__1AFRC1A foopub__1AFv ;;;
-// OBSOLETE     ^
-// OBSOLETE   */
-
-// OBSOLETE  static int
-// OBSOLETE  read_cfront_static_fields (struct field_info *fip, char **pp, struct type *type,
-// OBSOLETE                       struct objfile *objfile)
-// OBSOLETE  {
-// OBSOLETE    struct nextfield *new;
-// OBSOLETE    struct type *stype;
-// OBSOLETE    char *sname;
-// OBSOLETE    struct symbol *ref_static = 0;
-
-// OBSOLETE    if (**pp == ';')                /* no static data; return */
-// OBSOLETE      {
-// OBSOLETE        ++(*pp);
-// OBSOLETE        return 1;
-// OBSOLETE      }
-
-// OBSOLETE    /* Process each field in the list until we find the terminating ";" */
-
-// OBSOLETE    /* eg: p = "as__1A ;;;" */
-// OBSOLETE    STABS_CONTINUE (pp, objfile);   /* handle \\ */
-// OBSOLETE    while (**pp != ';' && (sname = get_substring (pp, ' '), sname))
-// OBSOLETE      {
-// OBSOLETE        ref_static = lookup_symbol (sname, 0, VAR_DOMAIN, 0, 0);    /*demangled_name */
-// OBSOLETE        if (!ref_static)
-// OBSOLETE    {
-// OBSOLETE      complaint (&symfile_complaints,
-// OBSOLETE                 "Unable to find symbol for static data field %s", sname);
-// OBSOLETE      continue;
-// OBSOLETE    }
-// OBSOLETE        stype = SYMBOL_TYPE (ref_static);
-
-// OBSOLETE        /* allocate a new fip */
-// OBSOLETE        new = (struct nextfield *) xmalloc (sizeof (struct nextfield));
-// OBSOLETE        make_cleanup (xfree, new);
-// OBSOLETE        memset (new, 0, sizeof (struct nextfield));
-// OBSOLETE        new->next = fip->list;
-// OBSOLETE        fip->list = new;
-
-// OBSOLETE        /* set visibility */
-// OBSOLETE        /* FIXME! no way to tell visibility from stabs??? */
-// OBSOLETE        new->visibility = VISIBILITY_PUBLIC;
-
-// OBSOLETE        /* set field info into fip */
-// OBSOLETE        fip->list->field.type = stype;
-
-// OBSOLETE        /* set bitpos & bitsize */
-// OBSOLETE        SET_FIELD_PHYSNAME (fip->list->field, savestring (sname, strlen (sname)));
-
-// OBSOLETE        /* set name field */
-// OBSOLETE        /* The following is code to work around cfront generated stabs.
-// OBSOLETE           The stabs contains full mangled name for each field.
-// OBSOLETE           We try to demangle the name and extract the field name out of it.
-// OBSOLETE         */
-// OBSOLETE        if (ARM_DEMANGLING)
-// OBSOLETE    {
-// OBSOLETE      char *dem, *dem_p;
-// OBSOLETE      dem = cplus_demangle (sname, DMGL_ANSI | DMGL_PARAMS);
-// OBSOLETE      if (dem != NULL)
-// OBSOLETE        {
-// OBSOLETE          dem_p = strrchr (dem, ':');
-// OBSOLETE          if (dem_p != 0 && *(dem_p - 1) == ':')
-// OBSOLETE            dem_p++;
-// OBSOLETE          fip->list->field.name =
-// OBSOLETE            obsavestring (dem_p, strlen (dem_p), &objfile->type_obstack);
-// OBSOLETE        }
-// OBSOLETE      else
-// OBSOLETE        {
-// OBSOLETE          fip->list->field.name =
-// OBSOLETE            obsavestring (sname, strlen (sname), &objfile->type_obstack);
-// OBSOLETE        }
-// OBSOLETE    }                       /* end of code for cfront work around */
-// OBSOLETE      }                             /* loop again for next static field */
-// OBSOLETE    return 1;
-// OBSOLETE  }
-
-// OBSOLETE  /* Copy structure fields to fip so attach_fields_to_type will work.
-// OBSOLETE     type has already been created with the initial instance data fields.
-// OBSOLETE     Now we want to be able to add the other members to the class,
-// OBSOLETE     so we want to add them back to the fip and reattach them again
-// OBSOLETE     once we have collected all the class members. */
-
-// OBSOLETE  static int
-// OBSOLETE  copy_cfront_struct_fields (struct field_info *fip, struct type *type,
-// OBSOLETE                       struct objfile *objfile)
-// OBSOLETE  {
-// OBSOLETE    int nfields = TYPE_NFIELDS (type);
-// OBSOLETE    int i;
-// OBSOLETE    struct nextfield *new;
-
-// OBSOLETE    /* Copy the fields into the list of fips and reset the types 
-// OBSOLETE       to remove the old fields */
-
-// OBSOLETE    for (i = 0; i < nfields; i++)
-// OBSOLETE      {
-// OBSOLETE        /* allocate a new fip */
-// OBSOLETE        new = (struct nextfield *) xmalloc (sizeof (struct nextfield));
-// OBSOLETE        make_cleanup (xfree, new);
-// OBSOLETE        memset (new, 0, sizeof (struct nextfield));
-// OBSOLETE        new->next = fip->list;
-// OBSOLETE        fip->list = new;
-
-// OBSOLETE        /* copy field info into fip */
-// OBSOLETE        new->field = TYPE_FIELD (type, i);
-// OBSOLETE        /* set visibility */
-// OBSOLETE        if (TYPE_FIELD_PROTECTED (type, i))
-// OBSOLETE    new->visibility = VISIBILITY_PROTECTED;
-// OBSOLETE        else if (TYPE_FIELD_PRIVATE (type, i))
-// OBSOLETE    new->visibility = VISIBILITY_PRIVATE;
-// OBSOLETE        else
-// OBSOLETE    new->visibility = VISIBILITY_PUBLIC;
-// OBSOLETE      }
-// OBSOLETE    /* Now delete the fields from the type since we will be 
-// OBSOLETE       allocing new space once we get the rest of the fields 
-// OBSOLETE       in attach_fields_to_type.
-// OBSOLETE       The pointer TYPE_FIELDS(type) is left dangling but should 
-// OBSOLETE       be freed later by objstack_free */
-// OBSOLETE    TYPE_FIELDS (type) = 0;
-// OBSOLETE    TYPE_NFIELDS (type) = 0;
-
-// OBSOLETE    return 1;
-// OBSOLETE  }
-#endif /* OBSOLETE CFront */
-
 /* Create the vector of fields, and record how big it is.
    We need this info to record proper virtual function table information
    for this class's virtual functions.  */
@@ -4252,7 +3212,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 (&symfile_complaints, _("Unknown visibility `%c' for field"),
                       fip->list->visibility);
          }
          break;
@@ -4294,7 +3254,7 @@ complain_about_struct_wipeout (struct type *type)
     }
 
   complaint (&symfile_complaints,
-            "struct/union type gets multiply defined: %s%s", kind, name);
+            _("struct/union type gets multiply defined: %s%s"), kind, name);
 }
 
 
@@ -4352,7 +3312,7 @@ read_struct_type (char **pp, struct type *type, enum type_code type_code,
 
   {
     int nbits;
-    TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits);
+    TYPE_LENGTH (type) = read_huge_number (pp, 0, &nbits, 0);
     if (nbits != 0)
       return error_type (pp, objfile);
   }
@@ -4410,7 +3370,7 @@ read_array_type (char **pp, struct type *type,
       (*pp)++;
       adjustable = 1;
     }
-  lower = read_huge_number (pp, ';', &nbits);
+  lower = read_huge_number (pp, ';', &nbits, 0);
 
   if (nbits != 0)
     return error_type (pp, objfile);
@@ -4420,7 +3380,7 @@ read_array_type (char **pp, struct type *type,
       (*pp)++;
       adjustable = 1;
     }
-  upper = read_huge_number (pp, ';', &nbits);
+  upper = read_huge_number (pp, ';', &nbits, 0);
   if (nbits != 0)
     return error_type (pp, objfile);
 
@@ -4492,14 +3452,14 @@ read_enum_type (char **pp, struct type *type,
       p = *pp;
       while (*p != ':')
        p++;
-      name = obsavestring (*pp, p - *pp, &objfile->symbol_obstack);
+      name = obsavestring (*pp, p - *pp, &objfile->objfile_obstack);
       *pp = p + 1;
-      n = read_huge_number (pp, ',', &nbits);
+      n = read_huge_number (pp, ',', &nbits, 0);
       if (nbits != 0)
        return error_type (pp, objfile);
 
       sym = (struct symbol *)
-       obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
+       obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol));
       memset (sym, 0, sizeof (struct symbol));
       DEPRECATED_SYMBOL_NAME (sym) = name;
       SYMBOL_LANGUAGE (sym) = current_subfile->language;
@@ -4606,17 +3566,17 @@ read_sun_builtin_type (char **pp, int typenums[2], struct objfile *objfile)
      by this type, except that unsigned short is 4 instead of 2.
      Since this information is redundant with the third number,
      we will ignore it.  */
-  read_huge_number (pp, ';', &nbits);
+  read_huge_number (pp, ';', &nbits, 0);
   if (nbits != 0)
     return error_type (pp, objfile);
 
   /* The second number is always 0, so ignore it too. */
-  read_huge_number (pp, ';', &nbits);
+  read_huge_number (pp, ';', &nbits, 0);
   if (nbits != 0)
     return error_type (pp, objfile);
 
   /* The third number is the number of bits for this type. */
-  type_bits = read_huge_number (pp, 0, &nbits);
+  type_bits = read_huge_number (pp, 0, &nbits, 0);
   if (nbits != 0)
     return error_type (pp, objfile);
   /* The type *should* end with a semicolon.  If it are embedded
@@ -4649,12 +3609,12 @@ read_sun_floating_type (char **pp, int typenums[2], struct objfile *objfile)
 
   /* The first number has more details about the type, for example
      FN_COMPLEX.  */
-  details = read_huge_number (pp, ';', &nbits);
+  details = read_huge_number (pp, ';', &nbits, 0);
   if (nbits != 0)
     return error_type (pp, objfile);
 
   /* The second number is the number of bytes occupied by this type */
-  nbytes = read_huge_number (pp, ';', &nbits);
+  nbytes = read_huge_number (pp, ';', &nbits, 0);
   if (nbits != 0)
     return error_type (pp, objfile);
 
@@ -4677,22 +3637,30 @@ read_sun_floating_type (char **pp, int typenums[2], struct objfile *objfile)
    and that character is skipped if it does match.
    If END is zero, *PP is left pointing to that character.
 
+   If TWOS_COMPLEMENT_BITS is set to a strictly positive value and if
+   the number is represented in an octal representation, assume that
+   it is represented in a 2's complement representation with a size of
+   TWOS_COMPLEMENT_BITS.
+
    If the number fits in a long, set *BITS to 0 and return the value.
    If not, set *BITS to be the number of bits in the number and return 0.
 
    If encounter garbage, set *BITS to -1 and return 0.  */
 
 static long
-read_huge_number (char **pp, int end, int *bits)
+read_huge_number (char **pp, int end, int *bits, int twos_complement_bits)
 {
   char *p = *pp;
   int sign = 1;
+  int sign_bit;
   long n = 0;
+  long sn = 0;
   int radix = 10;
   char overflow = 0;
   int nbits = 0;
   int c;
   long upper_limit;
+  int twos_complement_representation = radix == 8 && twos_complement_bits > 0;
 
   if (*p == '-')
     {
@@ -4713,12 +3681,36 @@ read_huge_number (char **pp, int end, int *bits)
   while ((c = *p++) >= '0' && c < ('0' + radix))
     {
       if (n <= upper_limit)
-       {
-         n *= radix;
-         n += c - '0';         /* FIXME this overflows anyway */
-       }
+        {
+          if (twos_complement_representation)
+            {
+              /* Octal, signed, twos complement representation. In this case,
+                 sn is the signed value, n is the corresponding absolute
+                 value. signed_bit is the position of the sign bit in the
+                 first three bits.  */
+              if (sn == 0)
+                {
+                  sign_bit = (twos_complement_bits % 3 + 2) % 3;
+                  sn = c - '0' - ((2 * (c - '0')) | (2 << sign_bit));
+                }
+              else
+                {
+                  sn *= radix;
+                  sn += c - '0';
+                }
+
+              if (sn < 0)
+                n = -sn;
+            }
+          else
+            {
+              /* unsigned representation */
+              n *= radix;
+              n += c - '0';            /* FIXME this overflows anyway */
+            }
+        }
       else
-       overflow = 1;
+        overflow = 1;
 
       /* This depends on large values being output in octal, which is
          what GCC does. */
@@ -4775,14 +3767,18 @@ read_huge_number (char **pp, int end, int *bits)
     {
       if (bits)
        *bits = 0;
-      return n * sign;
+      if (twos_complement_representation)
+        return sn;
+      else
+        return n * sign;
     }
   /* It's *BITS which has the interesting information.  */
   return 0;
 }
 
 static struct type *
-read_range_type (char **pp, int typenums[2], struct objfile *objfile)
+read_range_type (char **pp, int typenums[2], int type_size,
+                 struct objfile *objfile)
 {
   char *orig_pp = *pp;
   int rangenums[2];
@@ -4811,8 +3807,8 @@ read_range_type (char **pp, int typenums[2], struct objfile *objfile)
 
   /* The remaining two operands are usually lower and upper bounds
      of the range.  But in some special cases they mean something else.  */
-  n2 = read_huge_number (pp, ';', &n2bits);
-  n3 = read_huge_number (pp, ';', &n3bits);
+  n2 = read_huge_number (pp, ';', &n2bits, type_size);
+  n3 = read_huge_number (pp, ';', &n3bits, type_size);
 
   if (n2bits == -1 || n3bits == -1)
     return error_type (pp, objfile);
@@ -4828,8 +3824,19 @@ read_range_type (char **pp, int typenums[2], struct objfile *objfile)
       /* Number of bits in the type.  */
       int nbits = 0;
 
+      /* If a type size attribute has been specified, the bounds of
+         the range should fit in this size. If the lower bounds needs
+         more bits than the upper bound, then the type is signed.  */
+      if (n2bits <= type_size && n3bits <= type_size)
+        {
+          if (n2bits == type_size && n2bits > n3bits)
+            got_signed = 1;
+          else
+            got_unsigned = 1;
+          nbits = type_size;
+        }
       /* Range from 0 to <large number> is an unsigned large integral type.  */
-      if ((n2bits == 0 && n2 == 0) && n3bits != 0)
+      else if ((n2bits == 0 && n2 == 0) && n3bits != 0)
        {
          got_unsigned = 1;
          nbits = n3bits;
@@ -4965,7 +3972,7 @@ handle_true_range:
       static struct type *range_type_index;
 
       complaint (&symfile_complaints,
-                "base type %d of range type is not defined", rangenums[1]);
+                _("base type %d of range type is not defined"), rangenums[1]);
       if (range_type_index == NULL)
        range_type_index =
          init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
@@ -5042,12 +4049,12 @@ common_block_start (char *name, struct objfile *objfile)
   if (common_block_name != NULL)
     {
       complaint (&symfile_complaints,
-                "Invalid symbol data: common block within common block");
+                _("Invalid symbol data: common block within common block"));
     }
   common_block = local_symbols;
   common_block_i = local_symbols ? local_symbols->nsyms : 0;
   common_block_name = obsavestring (name, strlen (name),
-                                   &objfile->symbol_obstack);
+                                   &objfile->objfile_obstack);
 }
 
 /* Process a N_ECOMM symbol.  */
@@ -5068,14 +4075,14 @@ common_block_end (struct objfile *objfile)
 
   if (common_block_name == NULL)
     {
-      complaint (&symfile_complaints, "ECOMM symbol unmatched by BCOMM");
+      complaint (&symfile_complaints, _("ECOMM symbol unmatched by BCOMM"));
       return;
     }
 
   sym = (struct symbol *)
-    obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
+    obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol));
   memset (sym, 0, sizeof (struct symbol));
-  /* Note: common_block_name already saved on symbol_obstack */
+  /* Note: common_block_name already saved on objfile_obstack */
   DEPRECATED_SYMBOL_NAME (sym) = common_block_name;
   SYMBOL_CLASS (sym) = LOC_BLOCK;
 
@@ -5181,7 +4188,7 @@ cleanup_undefined_types (void)
 
                if (typename == NULL)
                  {
-                   complaint (&symfile_complaints, "need a type name");
+                   complaint (&symfile_complaints, _("need a type name"));
                    break;
                  }
                for (ppt = file_symbols; ppt; ppt = ppt->next)
@@ -5194,7 +4201,7 @@ cleanup_undefined_types (void)
                            && SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN
                            && (TYPE_CODE (SYMBOL_TYPE (sym)) ==
                                TYPE_CODE (*type))
-                           && STREQ (DEPRECATED_SYMBOL_NAME (sym), typename))
+                           && strcmp (DEPRECATED_SYMBOL_NAME (sym), typename) == 0)
                           replace_type (*type, SYMBOL_TYPE (sym));
                      }
                  }
@@ -5205,7 +4212,8 @@ cleanup_undefined_types (void)
        default:
          {
            complaint (&symfile_complaints,
-                      "GDB internal error.  cleanup_undefined_types with bad type %d.",
+                      _("forward-referenced types left unresolved, "
+                       "type code %d."),
                       TYPE_CODE (*type));
          }
          break;
@@ -5224,7 +4232,7 @@ scan_file_globals (struct objfile *objfile)
 {
   int hash;
   struct minimal_symbol *msymbol;
-  struct symbol *sym, *prev, *rsym;
+  struct symbol *sym, *prev;
   struct objfile *resolve_objfile;
 
   /* SVR4 based linkers copy referenced global symbols from shared
@@ -5276,11 +4284,8 @@ scan_file_globals (struct objfile *objfile)
          for (sym = global_sym_chain[hash]; sym;)
            {
              if (DEPRECATED_SYMBOL_NAME (msymbol)[0] == DEPRECATED_SYMBOL_NAME (sym)[0] &&
-                 STREQ (DEPRECATED_SYMBOL_NAME (msymbol) + 1, DEPRECATED_SYMBOL_NAME (sym) + 1))
+                 strcmp (DEPRECATED_SYMBOL_NAME (msymbol) + 1, DEPRECATED_SYMBOL_NAME (sym) + 1) == 0)
                {
-
-                 struct alias_list *aliases;
-
                  /* Splice this symbol out of the hash chain and
                     assign the value we have to it. */
                  if (prev)
@@ -5295,38 +4300,21 @@ scan_file_globals (struct objfile *objfile)
                  /* Check to see whether we need to fix up a common block.  */
                  /* Note: this code might be executed several times for
                     the same symbol if there are multiple references.  */
-
-                 /* If symbol has aliases, do minimal symbol fixups for each.
-                    These live aliases/references weren't added to 
-                    global_sym_chain hash but may also need to be fixed up. */
-                 /* FIXME: Maybe should have added aliases to the global chain,                     resolved symbol name, then treated aliases as normal 
-                    symbols?  Still, we wouldn't want to add_to_list. */
-                 /* Now do the same for each alias of this symbol */
-                 rsym = sym;
-                 aliases = SYMBOL_ALIASES (sym);
-                 while (rsym)
+                 if (sym)
                    {
-                     if (SYMBOL_CLASS (rsym) == LOC_BLOCK)
+                     if (SYMBOL_CLASS (sym) == LOC_BLOCK)
                        {
-                         fix_common_block (rsym,
+                         fix_common_block (sym,
                                            SYMBOL_VALUE_ADDRESS (msymbol));
                        }
                      else
                        {
-                         SYMBOL_VALUE_ADDRESS (rsym)
+                         SYMBOL_VALUE_ADDRESS (sym)
                            = SYMBOL_VALUE_ADDRESS (msymbol);
                        }
-                     SYMBOL_SECTION (rsym) = SYMBOL_SECTION (msymbol);
-                     if (aliases)
-                       {
-                         rsym = aliases->sym;
-                         aliases = aliases->next;
-                       }
-                     else
-                       rsym = NULL;
+                     SYMBOL_SECTION (sym) = SYMBOL_SECTION (msymbol);
                    }
 
-
                  if (prev)
                    {
                      sym = SYMBOL_VALUE_CHAIN (prev);
@@ -5367,7 +4355,7 @@ scan_file_globals (struct objfile *objfile)
            SYMBOL_CLASS (prev) = LOC_UNRESOLVED;
          else
            complaint (&symfile_complaints,
-                      "%s: common block `%s' from global_sym_chain unresolved",
+                      _("%s: common block `%s' from global_sym_chain unresolved"),
                       objfile->name, DEPRECATED_SYMBOL_NAME (prev));
        }
     }
@@ -5446,12 +4434,12 @@ find_name_end (char *name)
       /* Must be an ObjC method symbol.  */
       if (s[1] != '[')
        {
-         error ("invalid symbol name \"%s\"", name);
+         error (_("invalid symbol name \"%s\""), name);
        }
       s = strchr (s, ']');
       if (s == NULL)
        {
-         error ("invalid symbol name \"%s\"", name);
+         error (_("invalid symbol name \"%s\""), name);
        }
       return strchr (s, ':');
     }
This page took 0.051546 seconds and 4 git commands to generate.