aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/value.c11
2 files changed, 13 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1d5912f..b511e1a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,9 @@
2012-03-01 Tom Tromey <tromey@redhat.com>
+ * value.c (value_primitive_field): Handle virtual base classes.
+
+2012-03-01 Tom Tromey <tromey@redhat.com>
+
* gdbtypes.h (struct vbase): Remove.
2012-03-01 Tom Tromey <tromey@redhat.com>
diff --git a/gdb/value.c b/gdb/value.c
index 85ea970..68e5f02 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
{