mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 22:48:57 +08:00
gdb-2.8
This commit is contained in:
119
gdb/values.c
119
gdb/values.c
@ -286,7 +286,7 @@ history_info (num_exp)
|
||||
{
|
||||
val = access_value_history (i);
|
||||
printf ("$%d = ", i);
|
||||
value_print (val, stdout);
|
||||
value_print (val, stdout, 0);
|
||||
printf ("\n");
|
||||
}
|
||||
}
|
||||
@ -330,6 +330,7 @@ value_of_internalvar (var)
|
||||
register value val = value_copy (var->value);
|
||||
VALUE_LVAL (val) = lval_internalvar;
|
||||
VALUE_INTERNALVAR (val) = var;
|
||||
return val;
|
||||
}
|
||||
|
||||
void
|
||||
@ -397,7 +398,7 @@ use \"set\" as in \"set $foo = 5\" to define them.\n");
|
||||
for (var = internalvars; var; var = var->next)
|
||||
{
|
||||
printf ("$%s: ", var->name);
|
||||
value_print (var->value, stdout);
|
||||
value_print (var->value, stdout, 0);
|
||||
printf ("\n");
|
||||
}
|
||||
}
|
||||
@ -424,12 +425,7 @@ value_as_double (val)
|
||||
/* Unpack raw data (copied from debugee) at VALADDR
|
||||
as a long, or as a double, assuming the raw data is described
|
||||
by type TYPE. Knows how to convert different sizes of values
|
||||
and can convert between fixed and floating point.
|
||||
|
||||
C++: It is assumed that the front-end has taken care of
|
||||
all matters concerning pointers to members. A pointer
|
||||
to member which reaches here is considered to be equivalent
|
||||
to an INT (or some size). After all, it is only an offset. */
|
||||
and can convert between fixed and floating point. */
|
||||
|
||||
long
|
||||
unpack_long (type, valaddr)
|
||||
@ -478,14 +474,11 @@ unpack_long (type, valaddr)
|
||||
if (len == sizeof (long))
|
||||
return * (long *) valaddr;
|
||||
}
|
||||
else if (code == TYPE_CODE_PTR
|
||||
|| code == TYPE_CODE_REF)
|
||||
else if (code == TYPE_CODE_PTR)
|
||||
{
|
||||
if (len == sizeof (char *))
|
||||
return (CORE_ADDR) * (char **) valaddr;
|
||||
}
|
||||
else if (code == TYPE_CODE_MEMBER)
|
||||
error ("not impelmented: member types in unpack_long");
|
||||
|
||||
error ("Value not integer or pointer.");
|
||||
}
|
||||
@ -508,7 +501,13 @@ unpack_double (type, valaddr)
|
||||
return * (float *) valaddr;
|
||||
|
||||
if (len == sizeof (double))
|
||||
return * (double *) valaddr;
|
||||
{
|
||||
/* Some machines require doubleword alignment for doubles.
|
||||
This code works on them, and on other machines. */
|
||||
double temp;
|
||||
bcopy ((char *) valaddr, (char *) &temp, sizeof (double));
|
||||
return temp;
|
||||
}
|
||||
}
|
||||
else if (code == TYPE_CODE_INT && nosign)
|
||||
{
|
||||
@ -544,9 +543,7 @@ unpack_double (type, valaddr)
|
||||
|
||||
/* Given a value ARG1 of a struct or union type,
|
||||
extract and return the value of one of its fields.
|
||||
FIELDNO says which field.
|
||||
|
||||
For C++, must also be able to return values from static fields */
|
||||
FIELDNO says which field. */
|
||||
|
||||
value
|
||||
value_field (arg1, fieldno)
|
||||
@ -584,96 +581,6 @@ value_field (arg1, fieldno)
|
||||
return v;
|
||||
}
|
||||
|
||||
value
|
||||
value_fn_field (arg1, fieldno, subfieldno)
|
||||
register value arg1;
|
||||
register int fieldno;
|
||||
{
|
||||
register value v;
|
||||
struct fn_field *f = TYPE_FN_FIELDLIST1 (VALUE_TYPE (arg1), fieldno);
|
||||
register struct type *type = TYPE_FN_FIELD_TYPE (f, subfieldno);
|
||||
struct symbol *sym;
|
||||
|
||||
sym = lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, subfieldno),
|
||||
0, VAR_NAMESPACE);
|
||||
if (! sym) error ("Internal error: could not find physical method named %s",
|
||||
TYPE_FN_FIELD_PHYSNAME (f, subfieldno));
|
||||
|
||||
v = allocate_value (type);
|
||||
VALUE_ADDRESS (v) = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
|
||||
VALUE_TYPE (v) = type;
|
||||
return v;
|
||||
}
|
||||
|
||||
/* The value of a static class member does not depend
|
||||
on its instance, only on its type. If FIELDNO >= 0,
|
||||
then fieldno is a valid field number and is used directly.
|
||||
Otherwise, FIELDNAME is the name of the field we are
|
||||
searching for. If it is not a static field name, an
|
||||
error is signaled. TYPE is the type in which we look for the
|
||||
static field member. */
|
||||
value
|
||||
value_static_field (type, fieldname, fieldno)
|
||||
register struct type *type;
|
||||
char *fieldname;
|
||||
register int fieldno;
|
||||
{
|
||||
register value v;
|
||||
struct symbol *sym;
|
||||
|
||||
if (fieldno < 0)
|
||||
{
|
||||
register struct type *t = type;
|
||||
/* Look for static field. */
|
||||
while (t)
|
||||
{
|
||||
int i;
|
||||
for (i = TYPE_NFIELDS (t) - 1; i >= 0; i--)
|
||||
if (! strcmp (TYPE_FIELD_NAME (t, i), fieldname))
|
||||
{
|
||||
if (TYPE_FIELD_STATIC (t, i))
|
||||
{
|
||||
fieldno = i;
|
||||
goto found;
|
||||
}
|
||||
else
|
||||
error ("field `%s' is not static");
|
||||
}
|
||||
t = TYPE_BASECLASS (t);
|
||||
}
|
||||
|
||||
t = type;
|
||||
|
||||
if (destructor_name_p (fieldname, t))
|
||||
error ("use `info method' command to print out value of destructor");
|
||||
|
||||
while (t)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = TYPE_NFN_FIELDS (t) - 1; i >= 0; i--)
|
||||
{
|
||||
if (! strcmp (TYPE_FN_FIELDLIST_NAME (t, i), fieldname))
|
||||
{
|
||||
error ("use `info method' command to print value of method \"%s\"", fieldname);
|
||||
}
|
||||
}
|
||||
t = TYPE_BASECLASS (t);
|
||||
}
|
||||
error("there is no field named %s", fieldname);
|
||||
}
|
||||
|
||||
found:
|
||||
|
||||
sym = lookup_symbol (TYPE_FIELD_STATIC_PHYSNAME (type, fieldno),
|
||||
0, VAR_NAMESPACE);
|
||||
if (! sym) error ("Internal error: could not find physical static variable named %s", TYPE_FIELD_BITSIZE (type, fieldno));
|
||||
|
||||
type = TYPE_FIELD_TYPE (type, fieldno);
|
||||
v = value_at (type, (CORE_ADDR)SYMBOL_BLOCK_VALUE (sym));
|
||||
return v;
|
||||
}
|
||||
|
||||
long
|
||||
unpack_field_as_long (type, valaddr, fieldno)
|
||||
struct type *type;
|
||||
|
Reference in New Issue
Block a user