summaryrefslogtreecommitdiff
path: root/gdb/value.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2012-03-01 18:28:15 +0000
committerTom Tromey <tromey@redhat.com>2012-03-01 18:28:15 +0000
commit5c4b7c74f38156e80e2b3c1c57f070ea45bcde1c (patch)
tree645ea56596c17dee06e267db35d50eccc68de781 /gdb/value.c
parent727f73957133e2122c87df9c0889b5c28a4a83ee (diff)
downloadgdb-5c4b7c74f38156e80e2b3c1c57f070ea45bcde1c.tar.gz
* value.c (value_primitive_field): Handle virtual base classes.
Diffstat (limited to 'gdb/value.c')
-rw-r--r--gdb/value.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gdb/value.c b/gdb/value.c
index 85ea9703be0..68e5f0229dd 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -41,6 +41,7 @@
#include "python/python.h"
#include <ctype.h>
#include "tracepoint.h"
+#include "cp-abi.h"
/* Prototypes for exported functions. */
@@ -2549,11 +2550,18 @@ value_primitive_field (struct value *arg1, int offset,
/* This field is actually a base subobject, so preserve the
entire object's contents for later references to virtual
bases, etc. */
+ int boffset;
/* Lazy register values with offsets are not supported. */
if (VALUE_LVAL (arg1) == lval_register && value_lazy (arg1))
value_fetch_lazy (arg1);
+ boffset = baseclass_offset (arg_type, fieldno,
+ value_contents (arg1),
+ value_embedded_offset (arg1),
+ value_address (arg1),
+ arg1);
+
if (value_lazy (arg1))
v = allocate_value_lazy (value_enclosing_type (arg1));
else
@@ -2564,8 +2572,7 @@ value_primitive_field (struct value *arg1, int offset,
}
v->type = type;
v->offset = value_offset (arg1);
- v->embedded_offset = (offset + value_embedded_offset (arg1)
- + TYPE_FIELD_BITPOS (arg_type, fieldno) / 8);
+ v->embedded_offset = offset + value_embedded_offset (arg1) + boffset;
}
else
{