This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 2/5] Remove struct main_type.vptr_{fieldno,basetype}: gnu-v3-abi.c
- From: Doug Evans <xdje42 at gmail dot com>
- To: gdb-patches at sourceware dot org
- Date: Sun, 25 Jan 2015 11:53:26 -0800
- Subject: [PATCH 2/5] Remove struct main_type.vptr_{fieldno,basetype}: gnu-v3-abi.c
- Authentication-results: sourceware.org; auth=none
Hi.
While testing this patchset I got an assert failure,
and digging into that I found we were calling INIT_CPLUS_SPECIFIC
on a TYPE_CODE_INT object when doing "info vtbl integer". Oops.
This patch adds some asserts to help clarify what are legitimate
types to pass to these functions (structs and sometimes unions),
and some checks to not call them with other types.
2015-01-24 Doug Evans <xdje42@gmail.com>
* gnu-v3-abi.c (gnuv3_dynamic_class): Assert only passed structs
or unions. Return zero if union.
(gnuv3_get_vtable): Call check_typedef. Assert only passed structs.
(gnuv3_rtti_type): Pass already-check_typedef'd value to
gnuv3_get_vtable.
(compute_vtable_size): Assert only passed structs.
(gnuv3_print_vtable): Don't call gnuv3_get_vtable for non-structs.
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index 41c6735..a62599b 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -202,6 +202,12 @@ gnuv3_dynamic_class (struct type *type)
{
int fieldnum, fieldelem;
+ gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT
+ || TYPE_CODE (type) == TYPE_CODE_UNION);
+
+ if (TYPE_CODE (type) == TYPE_CODE_UNION)
+ return 0;
+
if (TYPE_CPLUS_DYNAMIC (type))
return TYPE_CPLUS_DYNAMIC (type) == 1;
@@ -246,9 +252,12 @@ gnuv3_get_vtable (struct gdbarch *gdbarch,
struct value *vtable_pointer;
CORE_ADDR vtable_address;
+ CHECK_TYPEDEF (container_type);
+ gdb_assert (TYPE_CODE (container_type) == TYPE_CODE_STRUCT);
+
/* If this type does not have a virtual table, don't read the first
field. */
- if (!gnuv3_dynamic_class (check_typedef (container_type)))
+ if (!gnuv3_dynamic_class (container_type))
return NULL;
/* We do not consult the debug information to find the virtual table.
@@ -301,7 +310,7 @@ gnuv3_rtti_type (struct value *value,
if (using_enc_p)
*using_enc_p = 0;
- vtable = gnuv3_get_vtable (gdbarch, value_type (value),
+ vtable = gnuv3_get_vtable (gdbarch, values_type,
value_as_address (value_addr (value)));
if (vtable == NULL)
return NULL;
@@ -821,6 +830,8 @@ compute_vtable_size (htab_t offset_hash,
void **slot;
struct value_and_voffset search_vo, *current_vo;
+ gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT);
+
/* If the object is not dynamic, then we are done; as it cannot have
dynamic base types either. */
if (!gnuv3_dynamic_class (type))
@@ -949,8 +960,11 @@ gnuv3_print_vtable (struct value *value)
}
gdbarch = get_type_arch (type);
- vtable = gnuv3_get_vtable (gdbarch, type,
- value_as_address (value_addr (value)));
+
+ vtable = NULL;
+ if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
+ vtable = gnuv3_get_vtable (gdbarch, type,
+ value_as_address (value_addr (value)));
if (!vtable)
{