diff options
author | Tom Tromey <tromey@redhat.com> | 2010-02-04 21:04:30 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2010-02-04 21:04:30 +0000 |
commit | 1a334831c050446a99a2b5c7ec8e0d452d2f9842 (patch) | |
tree | daa7a9251f3220dddfc69b186fb4de2405e66896 | |
parent | 6ac33a4e87237c25f790fbee916ebdfd83a2e983 (diff) | |
download | gdb-1a334831c050446a99a2b5c7ec8e0d452d2f9842.zip gdb-1a334831c050446a99a2b5c7ec8e0d452d2f9842.tar.gz gdb-1a334831c050446a99a2b5c7ec8e0d452d2f9842.tar.bz2 |
gdb
* valops.c (search_struct_field): Account for
value_embedded_offset. Fix check for virtual base past the end of
the object. Use value_copy when making a slice of the value.
gdb/testsuite
* gdb.cp/virtbase.exp: Make test case names unique.
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/virtbase.exp | 4 | ||||
-rw-r--r-- | gdb/valops.c | 24 |
4 files changed, 21 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3543b1f..2b05b9b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-02-04 Tom Tromey <tromey@redhat.com> + + * valops.c (search_struct_field): Account for + value_embedded_offset. Fix check for virtual base past the end of + the object. Use value_copy when making a slice of the value. + 2010-02-04 H.J. Lu <hongjiu.lu@intel.com> PR tui/9622 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 4e0ba4c..38668ba 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-02-04 Tom Tromey <tromey@redhat.com> + + * gdb.cp/virtbase.exp: Make test case names unique. + 2010-02-02 Tom Tromey <tromey@redhat.com> * gdb.cp/virtbase.exp: Add regression tests. diff --git a/gdb/testsuite/gdb.cp/virtbase.exp b/gdb/testsuite/gdb.cp/virtbase.exp index 5a0de97..3631db5 100644 --- a/gdb/testsuite/gdb.cp/virtbase.exp +++ b/gdb/testsuite/gdb.cp/virtbase.exp @@ -42,13 +42,13 @@ gdb_continue_to_breakpoint "first breakpoint" # In PR 11226, we failed to print x correctly in the "print *this" # case. gdb_test "print *this" " = {<mc::Base> = {x = 2}, _vptr.Middle = $hex, y = 3}" -gdb_test "print x" " = 2" +gdb_test "print x" " = 2" "print x in get_y" gdb_breakpoint [gdb_get_line_number "breakpoint 2"] gdb_continue_to_breakpoint "second breakpoint" # In PR 11226, we could not find x here. -gdb_test "print x" " = 2" +gdb_test "print x" " = 2" "print x in get_z" gdb_breakpoint [gdb_get_line_number "breakpoint 3"] gdb_continue_to_breakpoint "third breakpoint" diff --git a/gdb/valops.c b/gdb/valops.c index cee10fb..cc7eadf 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1903,7 +1903,9 @@ search_struct_field (char *name, struct value *arg1, int offset, boffset = baseclass_offset (type, i, value_contents (arg1) + offset, - value_address (arg1) + offset); + value_address (arg1) + + value_embedded_offset (arg1) + + offset); if (boffset == -1) error (_("virtual baseclass botch")); @@ -1911,8 +1913,9 @@ search_struct_field (char *name, struct value *arg1, int offset, by the user program. Make sure that it still points to a valid memory location. */ - boffset += offset; - if (boffset < 0 || boffset >= TYPE_LENGTH (type)) + boffset += value_embedded_offset (arg1) + offset; + if (boffset < 0 + || boffset >= TYPE_LENGTH (value_enclosing_type (arg1))) { CORE_ADDR base_addr; @@ -1927,18 +1930,9 @@ search_struct_field (char *name, struct value *arg1, int offset, } else { - if (VALUE_LVAL (arg1) == lval_memory && value_lazy (arg1)) - v2 = allocate_value_lazy (basetype); - else - { - v2 = allocate_value (basetype); - memcpy (value_contents_raw (v2), - value_contents_raw (arg1) + boffset, - TYPE_LENGTH (basetype)); - } - set_value_component_location (v2, arg1); - VALUE_FRAME_ID (v2) = VALUE_FRAME_ID (arg1); - set_value_offset (v2, value_offset (arg1) + boffset); + v2 = value_copy (arg1); + deprecated_set_value_type (v2, basetype); + set_value_embedded_offset (v2, boffset); } if (found_baseclass) |