diff options
author | Tom Tromey <tromey@redhat.com> | 2010-09-30 18:58:08 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2010-09-30 18:58:08 +0000 |
commit | 38f12cfce28f77a63b324a65a30d143f92cc0af4 (patch) | |
tree | 4ca23e8cfbc7ec213d42eea9986541017e486d0c | |
parent | 9ae8282da74ec1fbc0f89d87e645cbaabfa609ce (diff) | |
download | gdb-38f12cfce28f77a63b324a65a30d143f92cc0af4.zip gdb-38f12cfce28f77a63b324a65a30d143f92cc0af4.tar.gz gdb-38f12cfce28f77a63b324a65a30d143f92cc0af4.tar.bz2 |
gdb
* value.c (value_primitive_field): Take 'offset' into account for
packed field.
gdb/testsuite
* gdb.base/anon.exp: New file.
* gdb.base/anon.c: New file.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/anon.c | 32 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/anon.exp | 32 | ||||
-rw-r--r-- | gdb/value.c | 5 |
5 files changed, 77 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dfbae8b..ed21179 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2010-09-30 Tom Tromey <tromey@redhat.com> + * value.c (value_primitive_field): Take 'offset' into account for + packed field. + +2010-09-30 Tom Tromey <tromey@redhat.com> + * completer.c (count_struct_fields): Handle anonymous structs and unions. (add_struct_fields): Likewise. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 56ee414..6bd5a87 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-09-30 Tom Tromey <tromey@redhat.com> + * gdb.base/anon.exp: New file. + * gdb.base/anon.c: New file. + +2010-09-30 Tom Tromey <tromey@redhat.com> + * gdb.base/completion.exp: Test completion through anonymous union. * gdb.base/break1.c (struct some_struct): Add anonymous union. diff --git a/gdb/testsuite/gdb.base/anon.c b/gdb/testsuite/gdb.base/anon.c new file mode 100644 index 0000000..ca86ce5 --- /dev/null +++ b/gdb/testsuite/gdb.base/anon.c @@ -0,0 +1,32 @@ +/* Test of anonymous union in a struct. */ + +#include <string.h> + +struct outer +{ + int one; + int two; + + struct + { + union { + int three : 3; + int four : 4; + }; + + union { + int five : 3; + int six : 4; + }; + } data; +}; + +int main () +{ + struct outer val; + + memset (&val, 0, sizeof (val)); + val.data.six = 6; + + return 0; /* break here */ +} diff --git a/gdb/testsuite/gdb.base/anon.exp b/gdb/testsuite/gdb.base/anon.exp new file mode 100644 index 0000000..09d9912 --- /dev/null +++ b/gdb/testsuite/gdb.base/anon.exp @@ -0,0 +1,32 @@ +# Copyright 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +set testfile "anon" +set srcfile $testfile.c +if { [prepare_for_testing $testfile.exp $testfile $srcfile {debug}] } { + return -1 +} + +if { ![runto main] } then { + fail "run to main" + return +} + +set loc [gdb_get_line_number "break here"] +gdb_test "break $loc" ".*Breakpoint 2 .*" "set breakpoint in anon.c" +gdb_continue_to_breakpoint "continue to breakpoint in anon.c" + +gdb_test "print val.data.six" " = 6" "print val.data.six" diff --git a/gdb/value.c b/gdb/value.c index c189930..55fcd38 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1973,8 +1973,9 @@ value_primitive_field (struct value *arg1, int offset, v->bitpos = bitpos % container_bitsize; else v->bitpos = bitpos % 8; - v->offset = value_embedded_offset (arg1) - + (bitpos - v->bitpos) / 8; + v->offset = (value_embedded_offset (arg1) + + offset + + (bitpos - v->bitpos) / 8); v->parent = arg1; value_incref (v->parent); if (!value_lazy (arg1)) |