From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16320 invoked by alias); 11 Feb 2013 18:06:24 -0000 Received: (qmail 16307 invoked by uid 22791); 11 Feb 2013 18:06:23 -0000 X-SWARE-Spam-Status: No, hits=-6.2 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_SPAMHAUS_DROP,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 11 Feb 2013 18:06:02 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r1BI62fT026836 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 11 Feb 2013 13:06:02 -0500 Received: from psique (ovpn-113-130.phx2.redhat.com [10.3.113.130]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r1BI5xFB001376; Mon, 11 Feb 2013 13:06:00 -0500 From: Sergio Durigan Junior To: Jan Kratochvil Cc: GDB Patches Subject: Re: [PATCH] Handle bitfields inside inner structs for internalvars References: <20130208204702.GA22467@host2.jankratochvil.net> <20130209073923.GA13418@host2.jankratochvil.net> X-URL: http://www.redhat.com Date: Mon, 11 Feb 2013 18:06:00 -0000 In-Reply-To: <20130209073923.GA13418@host2.jankratochvil.net> (Jan Kratochvil's message of "Sat, 9 Feb 2013 08:39:23 +0100") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-02/txt/msg00252.txt.bz2 On Saturday, February 09 2013, Jan Kratochvil wrote: > On Sat, 09 Feb 2013 05:52:32 +0100, Sergio Durigan Junior wrote: >> On Friday, February 08 2013, Jan Kratochvil wrote: >> >> + if (value_bitsize (toval)) >> >> + offset += value_offset (value_parent (toval)); >> > >> > value_address rather tests for value_parent existence; although value_bitsize >> > is right as value_parent is currently not used elsewhere. >> > >> > if (value_parent (toval)) >> >> Do you think it's clearer to use `value_parent' here instead of >> `value_bitsize'? > > Choose any way but therefore put there a comment that value_parent is non-NULL > iff value_bitsize is non-zero. Ok, thanks, I committed the patch below. > Otherwise I was curious - what to do if value_parent exists but TOVAL is not > a bitfield? Isn't it a forgotten case? (It is not but...) According to comments in gdb/value.{c,h}, value_parent is only used iff the we are dealing with bitfields, so I guess this case is covered (otherwise it is a bug). Was it a rhetorical question? Checked-in: http://sourceware.org/ml/gdb-cvs/2013-02/msg00071.html Thanks, -- Sergio 2013-02-11 Sergio Durigan Junior * valops.c (value_assign): Handling bitfield offset in `lval_internalvar_component' case. 2013-02-11 Sergio Durigan Junior * gdb.base/bitfields.c (struct internalvartest): New declaration. * gdb.base/bitfields.exp (bitfield_internalvar): New function. --- gdb/testsuite/gdb.base/bitfields.c | 16 ++++++++++++++++ gdb/testsuite/gdb.base/bitfields.exp | 26 ++++++++++++++++++++++++++ gdb/valops.c | 26 +++++++++++++++++++++----- 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/gdb/testsuite/gdb.base/bitfields.c b/gdb/testsuite/gdb.base/bitfields.c index ed1634c..3a6b76f 100644 --- a/gdb/testsuite/gdb.base/bitfields.c +++ b/gdb/testsuite/gdb.base/bitfields.c @@ -23,6 +23,22 @@ struct fields signed char sc ; } flags; +struct internalvartest +{ + unsigned int a : 1; + struct + { + unsigned int b : 1; + struct + { + unsigned int c : 1; + signed int d : 1; + } deep; + signed int e : 1; + } inner; + signed int f : 1; +} dummy_internalvartest; + void break1 () { } diff --git a/gdb/testsuite/gdb.base/bitfields.exp b/gdb/testsuite/gdb.base/bitfields.exp index 9095736..82f7b10 100644 --- a/gdb/testsuite/gdb.base/bitfields.exp +++ b/gdb/testsuite/gdb.base/bitfields.exp @@ -245,6 +245,31 @@ proc bitfield_at_offset {} { gdb_test "print container.two.u3" ".* = 3" } +proc bitfield_internalvar {} { + global gdb_prompt + + # First, we create an internal var holding an instance of + # the struct (zeroed out). + gdb_test "set \$myvar = (struct internalvartest) \{0\}" "" \ + "set internal var" + + # Now, we set the proper bits. + gdb_test_no_output "set \$myvar.a = 0" + gdb_test_no_output "set \$myvar.inner.b = 1" + gdb_test_no_output "set \$myvar.inner.deep.c = 0" + gdb_test_no_output "set \$myvar.inner.deep.d = -1" + gdb_test_no_output "set \$myvar.inner.e = 1" + gdb_test_no_output "set \$myvar.f = 1" + + # Here comes the true testing. + gdb_test "print \$myvar.a" "\\$\[0-9\]\+ = 0" + gdb_test "print \$myvar.inner.b" "\\$\[0-9\]\+ = 1" + gdb_test "print \$myvar.inner.deep.c" "\\$\[0-9\]\+ = 0" + gdb_test "print \$myvar.inner.deep.d" "\\$\[0-9\]\+ = -1" + gdb_test "print \$myvar.inner.e" "\\$\[0-9\]\+ = -1" + gdb_test "print \$myvar.f" "\\$\[0-9\]\+ = -1" +} + gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} @@ -256,3 +281,4 @@ bitfield_containment bitfield_unsignedness bitfield_signedness bitfield_at_offset +bitfield_internalvar diff --git a/gdb/valops.c b/gdb/valops.c index 2132f3e..93c09d8 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1233,11 +1233,27 @@ value_assign (struct value *toval, struct value *fromval) VALUE_INTERNALVAR (toval)); case lval_internalvar_component: - set_internalvar_component (VALUE_INTERNALVAR (toval), - value_offset (toval), - value_bitpos (toval), - value_bitsize (toval), - fromval); + { + int offset = value_offset (toval); + + /* Are we dealing with a bitfield? + + It is important to mention that `value_parent (toval)' is + non-NULL iff `value_bitsize (toval)' is non-zero. */ + if (value_bitsize (toval)) + { + /* VALUE_INTERNALVAR below refers to the parent value, while + the offset is relative to this parent value. */ + gdb_assert (value_parent (value_parent (toval)) == NULL); + offset += value_offset (value_parent (toval)); + } + + set_internalvar_component (VALUE_INTERNALVAR (toval), + offset, + value_bitpos (toval), + value_bitsize (toval), + fromval); + } break; case lval_memory: -- 1.7.7.6