gdb/
authorPedro Alves <palves@redhat.com>
Wed, 2 Feb 2011 17:41:54 +0000 (17:41 +0000)
committerPedro Alves <palves@redhat.com>
Wed, 2 Feb 2011 17:41:54 +0000 (17:41 +0000)
* c-valprint.c (c_value_print): When doing virtual base pointer
adjustment, create a new value with adjusted contents rather than
changing the contents of the value being printed (and getting it
wrong).

gdb/testsuite/
* gdb.cp/virtbase.cc (VirtualBase, VirtualMiddleA, VirtualMiddleB)
(Virtual): New structs.
(virtual_o, virtual_middle_b): New globals.
* gdb.cp/virtbase.exp: New tests.

gdb/ChangeLog
gdb/c-valprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/virtbase.cc
gdb/testsuite/gdb.cp/virtbase.exp

index aa694be1bc756c1e049677c3e52d60055d658e76..b57bbdf1cf3e489653c4e0fe3bd196879cacb920 100644 (file)
@@ -1,3 +1,10 @@
+2011-02-02  Pedro Alves  <pedro@codesourcery.com>
+
+       * c-valprint.c (c_value_print): When doing virtual base pointer
+       adjustment, create a new value with adjusted contents rather than
+       changing the contents of the value being printed (and getting it
+       wrong).
+
 2011-02-02  Pedro Alves  <pedro@codesourcery.com>
 
        * xml-support.c (xml_find_attribute): New.
index 3bd4db25650bc305089bd7a6d820f4393f06ab93..287dc0ba2a7f259ebc3338a0bd7d82698acf41be 100644 (file)
@@ -706,8 +706,7 @@ c_value_print (struct value *val, struct ui_file *stream,
                   type = lookup_reference_type (real_type);
                 }
              /* JYG: Need to adjust pointer value.  */
-             /* NOTE: cagney/2005-01-02: THIS IS BOGUS.  */
-              value_contents_writeable (val)[0] -= top;
+             val = value_from_pointer (type, value_as_address (val) - top);
 
               /* Note: When we look up RTTI entries, we don't get any 
                  information on const or volatile attributes.  */
index 3afe2e5390923b741876a0cc716d0b6cb0a64b8e..0b6095c8d1c29be1b9afbaf8b42e7a51ed1e61ef 100644 (file)
@@ -1,3 +1,10 @@
+2011-02-02  Pedro Alves  <pedro@codesourcery.com>
+
+       * gdb.cp/virtbase.cc (VirtualBase, VirtualMiddleA, VirtualMiddleB)
+       (Virtual): New structs.
+       (virtual_o, virtual_middle_b): New globals.
+       * gdb.cp/virtbase.exp: New tests.
+
 2011-01-31  Paul Pluzhnikov  <ppluzhnikov@google.com>
 
        * gdb.base/jit.exp: New file.
index 1e6874fd3b0d595bff3e52c556bb3964a1d0b783..e23dbda813a56acbbf487b952a9f4528a1a41e0c 100644 (file)
@@ -88,6 +88,37 @@ public:
   RTTI_data() : data(1) {}
 };
 
+/* These classes are for testing pointer adjustment when printing a
+   pointer into a virtual base, with print object on.  */
+struct VirtualBase {
+  int x;
+
+  virtual ~VirtualBase() {}
+};
+
+struct VirtualMiddleA : public virtual VirtualBase {
+  /* Make sure the vbase offset of Virtual::VirtualBaseB is larger
+     than what fits in one byte.  */
+  int y[300];
+
+  virtual ~VirtualMiddleA() {}
+};
+
+struct VirtualMiddleB : public virtual VirtualBase {
+  int y;
+
+  virtual ~VirtualMiddleB() {}
+};
+
+struct Virtual : public virtual VirtualMiddleA, public virtual VirtualMiddleB {
+  int z;
+
+  virtual ~Virtual() {}
+};
+
+Virtual virtual_o;
+VirtualMiddleB *virtual_middle_b = &virtual_o;
+
 int main() {
   ph::Derived tst;
   tst.get_y();
index 460c96893cfc950f8ce5b9edf09157e99b4e5e5b..4bfec44574fb0cf82b7231a86062338971a9428e 100644 (file)
@@ -65,3 +65,18 @@ gdb_test "print/x b->mA" " = 0xaaaaaaaa"
 # https://bugzilla.redhat.com/show_bug.cgi?id=606660
 # `set print object on' is expected.
 gdb_test "print rtti_data" " = .*, data = 1\}"
+
+# Printing a pointer into a virtual base of a larger object used to do
+# pointer adjusment directly into the value being printed, in-place
+# (and did it wrong, too).  Print the pointer, and then access the
+# value history to check the pointer value is not changed.  If it had
+# been changed, then we'd not be able to find the real type anymore.
+gdb_test "print virtual_middle_b" \
+    " = \\(Virtual \\*\\) $hex" \
+    "print pointer to virtual base at non-zero offset of larger object"
+gdb_test "print $" \
+    " = \\(Virtual \\*\\) $hex" \
+    "print same pointer from history value"
+gdb_test "print *$$" \
+    " = \\(Virtual\\) {<VirtualMiddleA> = {<VirtualBase> = {_vptr.VirtualBase = $hex, x = 0}, _vptr.VirtualMiddleA = $hex, y = \\{0 <repeats 300 times>\\}}, <VirtualMiddleB> = {_vptr.VirtualMiddleB = $hex, y = 0}, _vptr.Virtual = $hex, z = 0}" \
+    "print whole pointed-to object, starting from the virtual base pointer"
This page took 0.043973 seconds and 4 git commands to generate.