aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2003-08-22 20:45:55 +0000
committerDaniel Jacobowitz <drow@false.org>2003-08-22 20:45:55 +0000
commit7ed85d2635d9485f39af469ab0dab11611113800 (patch)
treef910a7a96a8ba326d8cbb906fdd8d6101f76722a /gdb
parenteb0d3137b16dbf08ca4870613155080963e36752 (diff)
downloadfsf-binutils-gdb-7ed85d2635d9485f39af469ab0dab11611113800.zip
fsf-binutils-gdb-7ed85d2635d9485f39af469ab0dab11611113800.tar.gz
fsf-binutils-gdb-7ed85d2635d9485f39af469ab0dab11611113800.tar.bz2
* gnu-v3-abi.c (gnuv3_baseclass_offset): Check whether
TYPE_VPTR_FIELDNO is valid.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/gnu-v3-abi.c9
2 files changed, 12 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0efa2ae..c995ae2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2003-08-22 Daniel Jacobowitz <drow@mvista.com>
+
+ * gnu-v3-abi.c (gnuv3_baseclass_offset): Check whether
+ TYPE_VPTR_FIELDNO is valid.
+
2003-08-19 Mark Kettenis <kettenis@gnu.org>
* utils.c (set_width_command): Remove prototypes.
diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c
index d9947f9..b18e644 100644
--- a/gdb/gnu-v3-abi.c
+++ b/gdb/gnu-v3-abi.c
@@ -412,10 +412,15 @@ gnuv3_baseclass_offset (struct type *type, int index, char *valaddr,
v3 C++ ABI Section 2.4.I.2.b. Fortunately the ABI guarantees that the
vtable pointer will be located at the beginning of the object, so we can
bypass the casting. Verify that the TYPE_VPTR_FIELDNO is in fact at the
- start of whichever baseclass it resides in, as a sanity measure. */
+ start of whichever baseclass it resides in, as a sanity measure - iff
+ we have debugging information for that baseclass. */
vbasetype = TYPE_VPTR_BASETYPE (type);
- if (TYPE_FIELD_BITPOS (vbasetype, TYPE_VPTR_FIELDNO (vbasetype)) != 0)
+ if (TYPE_VPTR_FIELDNO (vbasetype) < 0)
+ fill_in_vptr_fieldno (vbasetype);
+
+ if (TYPE_VPTR_FIELDNO (vbasetype) >= 0
+ && TYPE_FIELD_BITPOS (vbasetype, TYPE_VPTR_FIELDNO (vbasetype)) != 0)
error ("Illegal vptr offset in class %s",
TYPE_NAME (vbasetype) ? TYPE_NAME (vbasetype) : "<unknown>");