From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7098 invoked by alias); 5 Jul 2013 14:42:29 -0000 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 Received: (qmail 7088 invoked by uid 89); 5 Jul 2013 14:42:29 -0000 X-Spam-SWARE-Status: No, score=-4.1 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD autolearn=ham version=3.3.1 Received: from mms3.broadcom.com (HELO mms3.broadcom.com) (216.31.210.19) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 05 Jul 2013 14:42:21 +0000 Received: from [10.9.208.57] by mms3.broadcom.com with ESMTP (Broadcom SMTP Relay (Email Firewall v6.5)); Fri, 05 Jul 2013 07:32:50 -0700 X-Server-Uuid: B86B6450-0931-4310-942E-F00ED04CA7AF Received: from IRVEXCHSMTP2.corp.ad.broadcom.com (10.9.207.52) by IRVEXCHCAS08.corp.ad.broadcom.com (10.9.208.57) with Microsoft SMTP Server (TLS) id 14.1.438.0; Fri, 5 Jul 2013 07:42:14 -0700 Received: from mail-irva-13.broadcom.com (10.10.10.20) by IRVEXCHSMTP2.corp.ad.broadcom.com (10.9.207.52) with Microsoft SMTP Server id 14.1.438.0; Fri, 5 Jul 2013 07:42:14 -0700 Received: from [10.177.73.66] (unknown [10.177.73.66]) by mail-irva-13.broadcom.com (Postfix) with ESMTP id 7321DF2D7B; Fri, 5 Jul 2013 07:42:13 -0700 (PDT) Message-ID: <51D6DB44.1000609@broadcom.com> Date: Fri, 05 Jul 2013 14:42:00 -0000 From: "Andrew Burgess" User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130620 Thunderbird/17.0.7 MIME-Version: 1.0 To: gdb-patches@sourceware.org, "Pedro Alves" Subject: Re: [COMMIT PATCH] value_bits_valid: Fix latent bug. References: <20130704160927.11801.10290.stgit@brno.lan> In-Reply-To: <20130704160927.11801.10290.stgit@brno.lan> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2013-07/txt/msg00198.txt.bz2 On 04/07/2013 5:09 PM, Pedro Alves wrote: > Doing something else, I factored out the bits of the value_bits_valid > function that actually handle the check_validity hook, and > surprisingly found out that the result was misbehaving. Turns out > value_bits_valid has a latent bug. If the value is not lval_computed, > or doesn't have a check_validity hook, then we should assume the value > is entirely valid, not invalid. This is currently masked by the > value->optimized_out check -- I ran the testsuite with a gdb_assert(0) > inserted in place of that return being touched by the patch, and it > never triggers. > > Tested on x86_64 Fedora 17. > > gdb/ > 2013-07-04 Pedro Alves > > * value.c (value_bits_valid): If the value is not lval_computed, > or doesn't have a check_validity hook, assume the value is entirely > valid. > --- > gdb/value.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/gdb/value.c b/gdb/value.c > index ce4b13a..353f62a 100644 > --- a/gdb/value.c > +++ b/gdb/value.c > @@ -1086,7 +1086,7 @@ value_bits_valid (const struct value *value, int offset, int length) > return 1; > if (value->lval != lval_computed > || !value->location.computed.funcs->check_validity) > - return 0; > + return 1; > return value->location.computed.funcs->check_validity (value, offset, > length); > } > There's a small issue with this patch, in the case of an optimized_out, non-computed value we now report that the bits are valid when they should be invalid. Patch below applies on top of the above and fixes both the original issue Pedro spotted, and fixes the non-computed issue. Ok to apply? Thanks, Andrew gdb/ChangeLog 2013-07-05 Andrew Burgess * value.c (value_bits_valid): If the value is not lval_computed then the answer is in the optimized_out flag, otherwise if we have no handler assume bits are valid, if there is a handler use that. diff --git a/gdb/value.c b/gdb/value.c index 353f62a..ca5463b 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -1082,13 +1082,18 @@ value_entirely_optimized_out (const struct value *value) int value_bits_valid (const struct value *value, int offset, int length) { - if (!value->optimized_out) - return 1; - if (value->lval != lval_computed - || !value->location.computed.funcs->check_validity) - return 1; - return value->location.computed.funcs->check_validity (value, offset, - length); + if (value->lval != lval_computed) + return !value->optimized_out; + else + { + /* Computed value, defer to handler if there is one. */ + if (!value->location.computed.funcs->check_validity) + return 1; + else + return value->location.computed.funcs->check_validity (value, + offset, + length); + } } int