/* 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 (C) 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.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
/* Support routines for reading and decoding debugging information in
the "stabs" format. This format is used with many systems that use
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 *);
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 *);
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$";
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
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;
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;
}
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);
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')
{
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;
}
#define VISIBILITY_PUBLIC '2' /* Stabs character for public field */
#define VISIBILITY_IGNORE '9' /* Optimized out or zero length */
-/* 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". */
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. */
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)
{
case 't':
DEPRECATED_SYMBOL_NAME (sym) = obsavestring ("this", strlen ("this"),
- &objfile->symbol_obstack);
+ &objfile->objfile_obstack);
break;
case 'v': /* $vtbl_ptr_type */
case 'e':
DEPRECATED_SYMBOL_NAME (sym) = obsavestring ("eh_throw", strlen ("eh_throw"),
- &objfile->symbol_obstack);
+ &objfile->objfile_obstack);
break;
case '_':
#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:
case 'r':
{
double d = atof (p);
- char *dbl_valu;
+ gdb_byte *dbl_valu;
/* FIXME-if-picky-about-floating-accuracy: Should be using
target arithmetic to get the value. real.c in GCC
SYMBOL_TYPE (sym) = lookup_fundamental_type (objfile,
FT_DBL_PREC_FLOAT);
- dbl_valu = (char *)
- obstack_alloc (&objfile->symbol_obstack,
+ dbl_valu =
+ 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;
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':
if (local_symbols
&& local_symbols->nsyms > 0
-#ifndef USE_REGISTER_NOT_ARG
&& gdbarch_stabs_argument_has_addr (current_gdbarch,
- SYMBOL_TYPE (sym))
-#endif
- )
+ 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
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;
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
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. */
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 '='.
/* 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;
}
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;
*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++)
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;
}
}
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);
}
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)
return_type = read_type (pp, objfile);
args = read_args (pp, ';', objfile, &nargs, &varargs);
+ if (args == NULL)
+ return error_type (pp, objfile);
type = dbx_alloc_type (typenums, objfile);
smash_to_method_type (type, domain, return_type, args,
nargs, varargs);
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;
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);
}
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)
if (method_name == NULL)
{
complaint (&symfile_complaints,
- "Method has bad physname %s\n", physname);
+ _("Method has bad physname %s\n"), physname);
return;
}
break;
default:
complaint (&symfile_complaints,
- "const/volatile indicator missing, got '%c'", **pp);
+ _("const/volatile indicator missing, got '%c'"), **pp);
break;
}
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;
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 '.':
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);
}
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)
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);
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 */
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;
}
{
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;
}
struct type *type, struct objfile *objfile)
{
fip->list->field.name =
- obsavestring (*pp, p - *pp, &objfile->type_obstack);
+ obsavestring (*pp, p - *pp, &objfile->objfile_obstack);
*pp = p + 1;
/* This means we have a visibility for a field coming. */
{
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");
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.
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;
}
/* 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);
public. */
{
complaint (&symfile_complaints,
- "Unknown visibility `%c' for baseclass",
+ _("Unknown visibility `%c' for baseclass"),
new->visibility);
new->visibility = VISIBILITY_PUBLIC;
}
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;
}
}
/* 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;
}
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;
}
complaint (&symfile_complaints,
- "struct/union type gets multiply defined: %s%s", kind, name);
+ _("struct/union type gets multiply defined: %s%s"), kind, name);
}
{
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);
}
(*pp)++;
adjustable = 1;
}
- lower = read_huge_number (pp, ';', &nbits);
+ lower = read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
(*pp)++;
adjustable = 1;
}
- upper = read_huge_number (pp, ';', &nbits);
+ upper = read_huge_number (pp, ';', &nbits, 0);
if (nbits != 0)
return error_type (pp, objfile);
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;
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
/* 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);
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 == '-')
{
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. */
{
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];
/* 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);
/* 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;
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,
}
/* Read in an argument list. This is a list of types, separated by commas
- and terminated with END. Return the list of types read in, or (struct type
- **)-1 if there is an error. */
+ and terminated with END. Return the list of types read in, or NULL
+ if there is an error. */
static struct field *
read_args (char **pp, int end, struct objfile *objfile, int *nargsp,
{
if (**pp != ',')
/* Invalid argument list: no ','. */
- return (struct field *) -1;
+ return NULL;
(*pp)++;
STABS_CONTINUE (pp, objfile);
types[n++] = read_type (pp, 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. */
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;
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)
&& 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));
}
}
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;
{
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
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)
/* 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);
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));
}
}
/* 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, ':');
}