diff options
author | Daniel Jacobowitz <drow@false.org> | 2003-08-22 20:45:55 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2003-08-22 20:45:55 +0000 |
commit | 7ed85d2635d9485f39af469ab0dab11611113800 (patch) | |
tree | f910a7a96a8ba326d8cbb906fdd8d6101f76722a /gdb | |
parent | eb0d3137b16dbf08ca4870613155080963e36752 (diff) | |
download | fsf-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/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gnu-v3-abi.c | 9 |
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>"); |