diff options
author | Kevin Buettner <kevinb@redhat.com> | 2008-12-13 00:39:53 +0000 |
---|---|---|
committer | Kevin Buettner <kevinb@redhat.com> | 2008-12-13 00:39:53 +0000 |
commit | ed09d7da47719a337ed84148e371691270ac17a5 (patch) | |
tree | 2e349fce5abeae024cf24587cb81c4a6f7fff230 /gdb/gnu-v3-abi.c | |
parent | 36dcf92c3e08df5aeb5a140c63a43ba3f9056228 (diff) | |
download | gdb-ed09d7da47719a337ed84148e371691270ac17a5.zip gdb-ed09d7da47719a337ed84148e371691270ac17a5.tar.gz gdb-ed09d7da47719a337ed84148e371691270ac17a5.tar.bz2 |
* 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.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c index c2c348a..1027baf 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); } |