mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-17 16:05:56 +08:00
gdb-2.8.1
This commit is contained in:
148
gdb/values.c
148
gdb/values.c
@ -425,7 +425,12 @@ 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. */
|
||||
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. */
|
||||
|
||||
long
|
||||
unpack_long (type, valaddr)
|
||||
@ -474,11 +479,14 @@ unpack_long (type, valaddr)
|
||||
if (len == sizeof (long))
|
||||
return * (long *) valaddr;
|
||||
}
|
||||
else if (code == TYPE_CODE_PTR)
|
||||
else if (code == TYPE_CODE_PTR
|
||||
|| code == TYPE_CODE_REF)
|
||||
{
|
||||
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.");
|
||||
}
|
||||
@ -543,7 +551,9 @@ 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. */
|
||||
FIELDNO says which field.
|
||||
|
||||
For C++, must also be able to return values from static fields. */
|
||||
|
||||
value
|
||||
value_field (arg1, fieldno)
|
||||
@ -581,6 +591,138 @@ 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;
|
||||
}
|
||||
|
||||
/* Return a virtual function as a value.
|
||||
ARG1 is the object which provides the virtual function
|
||||
table pointer.
|
||||
F is the list of member functions which contains the desired virtual
|
||||
function.
|
||||
J is an index into F which provides the desired virtual function.
|
||||
TYPE is the basetype which first provides the virtual function table. */
|
||||
value
|
||||
value_virtual_fn_field (arg1, f, j, type)
|
||||
value arg1;
|
||||
struct fn_field *f;
|
||||
int j;
|
||||
struct type *type;
|
||||
{
|
||||
/* First, get the virtual function table pointer. That comes
|
||||
with a strange type, so cast it to type `pointer to long' (which
|
||||
should serve just fine as a function type). Then, index into
|
||||
the table, and convert final value to appropriate function type. */
|
||||
value vfn, vtbl;
|
||||
value vi = value_from_long (builtin_type_int, TYPE_FN_FIELD_VOFFSET (f, j));
|
||||
VALUE_TYPE (arg1) = TYPE_VPTR_BASETYPE (type);
|
||||
|
||||
/* This type may have been defined before its virtual function table
|
||||
was. If so, fill in the virtual function table entry for the
|
||||
type now. */
|
||||
if (TYPE_VPTR_FIELDNO (type) < 0)
|
||||
TYPE_VPTR_FIELDNO (type)
|
||||
= fill_in_vptr_fieldno (type);
|
||||
|
||||
/* Pretend that this array is just an array of pointers to integers.
|
||||
This will have to change for multiple inheritance. */
|
||||
vtbl = value_copy (value_field (arg1, TYPE_VPTR_FIELDNO (type)));
|
||||
VALUE_TYPE (vtbl) = lookup_pointer_type (builtin_type_int);
|
||||
|
||||
/* Index into the virtual function table. */
|
||||
vfn = value_subscript (vtbl, vi);
|
||||
|
||||
/* Reinstantiate the function pointer with the correct type. */
|
||||
VALUE_TYPE (vfn) = lookup_pointer_type (TYPE_FN_FIELD_TYPE (f, j));
|
||||
return vfn;
|
||||
}
|
||||
|
||||
/* 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, 1);
|
||||
}
|
||||
|
||||
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, 1);
|
||||
}
|
||||
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