From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6903 invoked by alias); 5 Jul 2013 10:29:49 -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 6891 invoked by uid 89); 5 Jul 2013 10:29:49 -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,TW_CP 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 10:29:48 +0000 Received: from [10.9.208.57] by mms3.broadcom.com with ESMTP (Broadcom SMTP Relay (Email Firewall v6.5)); Fri, 05 Jul 2013 03:20:07 -0700 X-Server-Uuid: B86B6450-0931-4310-942E-F00ED04CA7AF Received: from IRVEXCHSMTP3.corp.ad.broadcom.com (10.9.207.53) by IRVEXCHCAS08.corp.ad.broadcom.com (10.9.208.57) with Microsoft SMTP Server (TLS) id 14.1.438.0; Fri, 5 Jul 2013 03:29:31 -0700 Received: from mail-irva-13.broadcom.com (10.10.10.20) by IRVEXCHSMTP3.corp.ad.broadcom.com (10.9.207.53) with Microsoft SMTP Server id 14.1.438.0; Fri, 5 Jul 2013 03:29:31 -0700 Received: from [10.177.73.66] (unknown [10.177.73.66]) by mail-irva-13.broadcom.com (Postfix) with ESMTP id 4EE57F2D72; Fri, 5 Jul 2013 03:29:31 -0700 (PDT) Message-ID: <51D6A00A.2050803@broadcom.com> Date: Fri, 05 Jul 2013 10:29: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: "Pedro Alves" cc: gdb-patches@sourceware.org Subject: Re: [PATCH] ada-lang.c:coerce_unspec_val_to_type: Preserve laziness. References: <20130704182244.16683.55719.stgit@brno.lan> In-Reply-To: <20130704182244.16683.55719.stgit@brno.lan> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2013-07/txt/msg00189.txt.bz2 On 04/07/2013 7:22 PM, Pedro Alves wrote: > ada-lang.c:coerce_unspec_val_to_type does: > > if (value_lazy (val) > || TYPE_LENGTH (type) > TYPE_LENGTH (value_type (val))) > result = allocate_value_lazy (type); > else > { > result = allocate_value (type); > memcpy (value_contents_raw (result), value_contents (val), > TYPE_LENGTH (type)); > } > set_value_component_location (result, val); > set_value_bitsize (result, value_bitsize (val)); > set_value_bitpos (result, value_bitpos (val)); > set_value_address (result, value_address (val)); > set_value_optimized_out (result, value_optimized_out (val)); > > Notice that before value_optimized_out was made to auto-fetch lazy > values, VAL would end up still lazy if it was lazy on entry. It's not > really a problem here if VAL is lazy, and VAL->optimized_out is 0, > because RESULT is also left lazy. IOW, this just wants to copy the > VAL->optimized_out flag to RESULT->optimized_out, nothing else. > > The patch adds the value_optimized_out_const function for that. As an alternative, this patch avoids the new _const function, I move the setting of the optimized_out value into the else case where we know val is no longer lazy. Cheers, Andrew diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 8240fee..ea7b579 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -576,12 +576,14 @@ coerce_unspec_val_to_type (struct value *val, struct type *type) result = allocate_value (type); memcpy (value_contents_raw (result), value_contents (val), TYPE_LENGTH (type)); + /* Only copy the optimized out setting if val is not lazy. If it + is lazy then the optimized_out flag will always be false. */ + set_value_optimized_out (result, value_optimized_out (val)); } set_value_component_location (result, val); set_value_bitsize (result, value_bitsize (val)); set_value_bitpos (result, value_bitpos (val)); set_value_address (result, value_address (val)); - set_value_optimized_out (result, value_optimized_out (val)); return result; } } > > (I found this out by grepping for set_value_optimized_out and trying > to convert the uses I found to instead allocate the value with > allocate_optimized_out_value.) > > Tested on x86_64 Fedora 17. > > WDYT? > > gdb/ > 2013-07-04 Pedro Alves > > * ada-lang.c (coerce_unspec_val_to_type): Use > value_optimized_out_const. > * value.c (value_optimized_out_const): New function. > * value.h (value_optimized_out_const): New declaration. > --- > gdb/ada-lang.c | 2 +- > gdb/value.c | 6 ++++++ > gdb/value.h | 8 +++++++- > 3 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c > index 8240fee..dc5f2b6 100644 > --- a/gdb/ada-lang.c > +++ b/gdb/ada-lang.c > @@ -581,7 +581,7 @@ coerce_unspec_val_to_type (struct value *val, struct type *type) > set_value_bitsize (result, value_bitsize (val)); > set_value_bitpos (result, value_bitpos (val)); > set_value_address (result, value_address (val)); > - set_value_optimized_out (result, value_optimized_out (val)); > + set_value_optimized_out (result, value_optimized_out_const (val)); > return result; > } > } > diff --git a/gdb/value.c b/gdb/value.c > index 353f62a..9e58199 100644 > --- a/gdb/value.c > +++ b/gdb/value.c > @@ -1062,6 +1062,12 @@ value_optimized_out (struct value *value) > return value->optimized_out; > } > > +int > +value_optimized_out_const (const struct value *value) > +{ > + return value->optimized_out; > +} > + > void > set_value_optimized_out (struct value *value, int val) > { > diff --git a/gdb/value.h b/gdb/value.h > index 8a66aa4..8d669ec 100644 > --- a/gdb/value.h > +++ b/gdb/value.h > @@ -319,10 +319,16 @@ extern int value_fetch_lazy (struct value *val); > extern int value_contents_equal (struct value *val1, struct value *val2); > > /* If nonzero, this is the value of a variable which does not actually > - exist in the program. */ > + exist in the program, at least partially. If the value is lazy, > + this may fetch it now. */ > extern int value_optimized_out (struct value *value); > extern void set_value_optimized_out (struct value *value, int val); > > +/* Like value_optimized_out, but don't fetch the value even if it is > + lazy. Mainly useful for constructing other values using VALUE as > + template. */ > +extern int value_optimized_out_const (const struct value *value); > + > /* Like value_optimized_out, but return false if any bit in the object > is valid. */ > extern int value_entirely_optimized_out (const struct value *value); > > > >