/* Abstraction of GNU v3 abi.
Contributed by Jim Blandy <jimb@redhat.com>
- Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008
+ Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
This file is part of GDB.
}
+/* Return the ptrdiff_t type used in the vtable type. */
+static struct type *
+vtable_ptrdiff_type (struct gdbarch *gdbarch)
+{
+ struct type *vtable_type = gdbarch_data (gdbarch, vtable_type_gdbarch_data);
+
+ /* The "offset_to_top" field has the appropriate (ptrdiff_t) type. */
+ return TYPE_FIELD_TYPE (vtable_type, vtable_field_offset_to_top);
+}
+
/* Return the offset from the start of the imaginary `struct
gdb_gnu_v3_abi_vtable' object to the vtable's "address point"
(i.e., where objects' virtual table pointers point). */
/* Find the linker symbol for this vtable. */
vtable_symbol
- = lookup_minimal_symbol_by_pc (VALUE_ADDRESS (vtable)
- + value_offset (vtable)
+ = lookup_minimal_symbol_by_pc (value_address (vtable)
+ value_embedded_offset (vtable));
if (! vtable_symbol)
return NULL;
start of whichever baseclass it resides in, as a sanity measure - iff
we have debugging information for that baseclass. */
- vbasetype = TYPE_VPTR_BASETYPE (type);
+ vbasetype = check_typedef (TYPE_VPTR_BASETYPE (type));
vbasetype_vptr_fieldno = get_vptr_fieldno (vbasetype, NULL);
if (vbasetype_vptr_fieldno >= 0
which has virtual table index VOFFSET. The method has an associated
"this" adjustment of ADJUSTMENT bytes. */
-const char *
+static const char *
gnuv3_find_method_in (struct type *domain, CORE_ADDR voffset,
LONGEST adjustment)
{
LONGEST *adjustment_p)
{
struct type *funcptr_type = builtin_type (gdbarch)->builtin_func_ptr;
- struct type *offset_type = builtin_type (gdbarch)->builtin_long;
+ struct type *offset_type = vtable_ptrdiff_type (gdbarch);
CORE_ADDR ptr_value;
LONGEST voffset, adjustment;
int vbit;
/* It's a virtual table offset, maybe in this class. Search
for a field with the correct vtable offset. First convert it
to an index, as used in TYPE_FN_FIELD_VOFFSET. */
- voffset = ptr_value / TYPE_LENGTH (builtin_type (gdbarch)->builtin_long);
+ voffset = ptr_value / TYPE_LENGTH (vtable_ptrdiff_type (gdbarch));
physname = gnuv3_find_method_in (domain, voffset, adjustment);
if (vbit)
{
LONGEST voffset;
- voffset = ptr_value / TYPE_LENGTH (builtin_type (gdbarch)->builtin_long);
+ voffset = ptr_value / TYPE_LENGTH (vtable_ptrdiff_type (gdbarch));
return gnuv3_get_virtual_fn (gdbarch, value_ind (*this_p),
method_type, voffset);
}