summaryrefslogtreecommitdiff
path: root/gdb/gnu-v3-abi.c
diff options
context:
space:
mode:
authorKevin Buettner <kevinb@redhat.com>2008-12-13 00:39:52 +0000
committerKevin Buettner <kevinb@redhat.com>2008-12-13 00:39:52 +0000
commit9e3c9b86cf7b0713cf1480d0c6488f5051425f0a (patch)
tree190341b24082baf5ea539a71d3c876024f360e10 /gdb/gnu-v3-abi.c
parent6b96c9a3f78b7128e397bcfde4bc6e5501344eba (diff)
downloadgdb-9e3c9b86cf7b0713cf1480d0c6488f5051425f0a.tar.gz
* gnu-v3-abi.c (vtable_ptrdiff_type): New function.
(gnuv3_decode_method_ptr, gnuv3_print_method_ptr) (gnuv3_method_ptr_to_value): Use a better approximation for `ptrdiff_t' instead of `long'. * m32c-tdep.c (m32c_gdbarch_init): Call set_gdbarch_vbit_in_delta(). (m32c_push_dummy_call): Dereference pointer type.
Diffstat (limited to 'gdb/gnu-v3-abi.c')
-rw-r--r--gdb/gnu-v3-abi.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index c2c348a6103..1027baf70ac 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -187,6 +187,16 @@ build_gdb_vtable_type (struct gdbarch *arch)
}
+/* 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). */
@@ -531,7 +541,7 @@ gnuv3_decode_method_ptr (struct gdbarch *gdbarch,
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;
@@ -595,7 +605,7 @@ gnuv3_print_method_ptr (const gdb_byte *contents,
/* 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);
@@ -722,7 +732,7 @@ gnuv3_method_ptr_to_value (struct value **this_p, struct value *method_ptr)
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);
}