From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29713 invoked by alias); 4 Jul 2013 18:23:08 -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 29640 invoked by uid 89); 4 Jul 2013 18:23:01 -0000 X-Spam-SWARE-Status: No, score=-6.7 required=5.0 tests=AWL,BAYES_00,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,RP_MATCHES_RCVD,SPF_HELO_PASS,SPF_PASS,TW_CP autolearn=ham version=3.3.1 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Thu, 04 Jul 2013 18:22:48 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r64IMkwn024519 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Jul 2013 14:22:46 -0400 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r64IMi1H016733; Thu, 4 Jul 2013 14:22:45 -0400 Subject: [PATCH] ada-lang.c:coerce_unspec_val_to_type: Preserve laziness. To: gdb-patches@sourceware.org From: Pedro Alves Cc: Andrew Burgess Date: Thu, 04 Jul 2013 18:23:00 -0000 Message-ID: <20130704182244.16683.55719.stgit@brno.lan> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-SW-Source: 2013-07/txt/msg00178.txt.bz2 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. 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);