From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28919 invoked by alias); 10 Jul 2013 00:44:39 -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 28908 invoked by uid 89); 10 Jul 2013 00:44:38 -0000 X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_HOSTKARMA_NO,TW_CP autolearn=ham version=3.3.1 Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Wed, 10 Jul 2013 00:44:37 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 3C9CC1C67D1; Tue, 9 Jul 2013 20:44:36 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id Fu6m5z2vuAym; Tue, 9 Jul 2013 20:44:36 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id E78E01C67BE; Tue, 9 Jul 2013 20:44:35 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id 22E2CC1073; Tue, 9 Jul 2013 17:44:34 -0700 (PDT) Date: Wed, 10 Jul 2013 00:44:00 -0000 From: Joel Brobecker To: Pedro Alves Cc: gdb-patches@sourceware.org, Andrew Burgess Subject: Re: [PATCH] ada-lang.c:coerce_unspec_val_to_type: Preserve laziness. Message-ID: <20130710004434.GE8063@adacore.com> References: <20130704182244.16683.55719.stgit@brno.lan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130704182244.16683.55719.stgit@brno.lan> User-Agent: Mutt/1.5.21 (2010-09-15) X-SW-Source: 2013-07/txt/msg00255.txt.bz2 Hi Pedro, > 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. > > (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. > 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. Thanks for the patch! We can actually demonstrate a regression which your patch fixes. Consider: type Small is range -64 .. 63; for Small'Size use 7; type Arr is array (1..10) of Small; pragma Pack (Arr); type Arr_Ptr is access Arr; An_Arr_Ptr : Arr_Ptr := new Arr'(10, 20, 30, 40, 50, 60, 62, 63, -23, 42); Trying to print one element of An_Arr_Ptr yields: (gdb) p an_arr_ptr(3) Cannot access memory at address 0x0 I've updated one of the testcases that deals with array "pointers" (we call them access types in Ada) to add this case: http://www.sourceware.org/ml/gdb-patches/2013-07/msg00254.html Since your patch looks correct to me, you had answers to Andrew's comments, this is a regression, you are away for a while and no one else commented on your patch, I've taken the liberty of checking it in. > --- > 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); -- Joel