From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15130 invoked by alias); 29 Nov 2016 05:06:13 -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 14801 invoked by uid 89); 29 Nov 2016 05:06:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=no version=3.3.2 spammy=H*F:U*tom, frame_info, H*m:10924, H*r:4.86_1 X-HELO: gproxy1.mail.unifiedlayer.com Received: from gproxy1-pub.mail.unifiedlayer.com (HELO gproxy1.mail.unifiedlayer.com) (69.89.25.95) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 29 Nov 2016 05:06:00 +0000 Received: from cmgw4 (cmgw5 [10.0.90.85]) by gproxy1.mail.unifiedlayer.com (Postfix) with ESMTP id A243A17609A for ; Mon, 28 Nov 2016 22:05:59 -0700 (MST) Received: from box522.bluehost.com ([74.220.219.122]) by cmgw4 with id Dh5w1u00g2f2jeq01h5zbv; Mon, 28 Nov 2016 22:05:59 -0700 X-Authority-Analysis: v=2.1 cv=Zpp+dbLG c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=L24OOQBejmoA:10 a=zstS-IiYAAAA:8 a=LgKKxCmfL4kmpfnsm1sA:9 a=LJKfZI6uCTFDIa3E:21 a=IhSkXTOgkKEZa312:21 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 71-218-195-233.hlrn.qwest.net ([71.218.195.233]:46172 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1cBac8-0000aB-FR; Mon, 28 Nov 2016 22:05:56 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA 6/8] Use value_freer in dwarf2_evaluate_loc_desc_full Date: Tue, 29 Nov 2016 05:06:00 -0000 Message-Id: <1480395946-10924-7-git-send-email-tom@tromey.com> In-Reply-To: <1480395946-10924-1-git-send-email-tom@tromey.com> References: <1480395946-10924-1-git-send-email-tom@tromey.com> X-BWhitelist: no X-Exim-ID: 1cBac8-0000aB-FR X-Source-Sender: 71-218-195-233.hlrn.qwest.net (bapiya.Home) [71.218.195.233]:46172 X-Source-Auth: tom+tromey.com X-Email-Count: 7 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== X-SW-Source: 2016-11/txt/msg00936.txt.bz2 This changes dwarf2_evaluate_loc_desc_full to use value_freer. Note that this function previously called do_cleanup using the same cleanup multiple times. I had thought this was buggy, but re-reading make_my_cleanup2 indicates that it is not. Nevertheless it is surprising, and at least one of the calls (the one that is completely removed in this patch) seems to have been done under the assumption that it would still have some effect. 2016-11-28 Tom Tromey * value.h (value_freer::~value_freer): Call release. (value_freer::release): New method. * dwarf2loc.c (dwarf2_evaluate_loc_desc_full): Use value_freer. --- gdb/ChangeLog | 6 ++++++ gdb/dwarf2loc.c | 27 +++++++++++++-------------- gdb/value.h | 12 +++++++++++- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6197bfb..cf61306 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2016-11-28 Tom Tromey + * value.h (value_freer::~value_freer): Call release. + (value_freer::release): New method. + * dwarf2loc.c (dwarf2_evaluate_loc_desc_full): Use value_freer. + +2016-11-28 Tom Tromey + * python/py-value.c (valpy_dereference, valpy_referenced_value) (valpy_reference_value, valpy_const_value, valpy_get_address) (valpy_get_dynamic_type, valpy_lazy_string, valpy_do_cast) diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 0d8a47c..43c95b8 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -2321,7 +2321,6 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, LONGEST byte_offset) { struct value *retval; - struct cleanup *value_chain; struct objfile *objfile = dwarf2_per_cu_objfile (per_cu); if (byte_offset < 0) @@ -2335,7 +2334,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, ctx.per_cu = per_cu; ctx.obj_address = 0; - value_chain = make_cleanup_value_free_to_mark (value_mark ()); + value_freer free_values; ctx.gdbarch = get_objfile_arch (objfile); ctx.addr_size = dwarf2_per_cu_addr_size (per_cu); @@ -2350,7 +2349,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, { if (ex.error == NOT_AVAILABLE_ERROR) { - do_cleanups (value_chain); + free_values.release (); retval = allocate_value (type); mark_value_bytes_unavailable (retval, 0, TYPE_LENGTH (type)); return retval; @@ -2359,7 +2358,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, { if (entry_values_debug) exception_print (gdb_stdout, ex); - do_cleanups (value_chain); + free_values.release (); return allocate_optimized_out_value (type); } else @@ -2382,7 +2381,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, ctx.addr_size, frame); /* We must clean up the value chain after creating the piece closure but before allocating the result. */ - do_cleanups (value_chain); + free_values.release (); retval = allocate_computed_value (type, &pieced_value_funcs, c); set_value_offset (retval, byte_offset); } @@ -2399,7 +2398,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, if (byte_offset != 0) error (_("cannot use offset on synthetic pointer to register")); - do_cleanups (value_chain); + free_values.release (); retval = value_from_register (type, gdb_regnum, frame); if (value_optimized_out (retval)) { @@ -2411,7 +2410,6 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, inspecting a register ($pc, $sp, etc.), return a generic optimized out value instead, so that we show instead of . */ - do_cleanups (value_chain); tmp = allocate_value (type); value_contents_copy (tmp, 0, retval, 0, TYPE_LENGTH (type)); retval = tmp; @@ -2445,7 +2443,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, } address = value_as_address (value_from_pointer (ptr_type, address)); - do_cleanups (value_chain); + free_values.release (); retval = value_at_lazy (type, address + byte_offset); if (in_stack_memory) set_value_stack (retval, 1); @@ -2458,6 +2456,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, gdb_byte *contents; const gdb_byte *val_bytes; size_t n = TYPE_LENGTH (value_type (value)); + struct cleanup *cleanup; if (byte_offset + TYPE_LENGTH (type) > n) invalid_synthetic_pointer (); @@ -2470,8 +2469,8 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, to the mark, but we still need the value contents below. */ value_incref (value); - do_cleanups (value_chain); - make_cleanup_value_free (value); + free_values.release (); + cleanup = make_cleanup_value_free (value); retval = allocate_value (type); contents = value_contents_raw (retval); @@ -2484,6 +2483,8 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, n = TYPE_LENGTH (type); } memcpy (contents, val_bytes, n); + + do_cleanups (cleanup); } break; @@ -2496,7 +2497,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, if (byte_offset + TYPE_LENGTH (type) > n) invalid_synthetic_pointer (); - do_cleanups (value_chain); + free_values.release (); retval = allocate_value (type); contents = value_contents_raw (retval); @@ -2516,7 +2517,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, break; case DWARF_VALUE_OPTIMIZED_OUT: - do_cleanups (value_chain); + free_values.release (); retval = allocate_optimized_out_value (type); break; @@ -2532,8 +2533,6 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, set_value_initialized (retval, ctx.initialized); - do_cleanups (value_chain); - return retval; } diff --git a/gdb/value.h b/gdb/value.h index 399bf48..43dfe14 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -728,7 +728,17 @@ class value_freer ~value_freer () { - value_free_to_mark (m_value); + release (); + } + + /* Free the values currently on the value stack. */ + void release () + { + if (m_value != NULL) + { + value_free_to_mark (m_value); + m_value = NULL; + } } private: -- 2.7.4