* value.c (value_primitive_field): Handle virtual base classes.
authorTom Tromey <tromey@redhat.com>
Thu, 1 Mar 2012 18:28:16 +0000 (18:28 +0000)
committerTom Tromey <tromey@redhat.com>
Thu, 1 Mar 2012 18:28:16 +0000 (18:28 +0000)
gdb/ChangeLog
gdb/value.c

index 1d5912f4293891b30d2d3943f73fb2586ed42299..b511e1a90b40924c3bcfb858beaba1102fc4f8c5 100644 (file)
@@ -1,3 +1,7 @@
+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.
index 85ea9703be07946227a3391a22c79ab90f73bd65..68e5f0229dd746b963e485492743a995169a6e10 100644 (file)
@@ -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
     {