From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21020 invoked by alias); 23 Dec 2016 19:59:45 -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 21009 invoked by uid 89); 23 Dec 2016 19:59:44 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.1 required=5.0 tests=AWL,BAYES_05,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=no version=3.3.2 spammy=synthetic, surprising, sk:dwarf_v, byte_offset X-HELO: gproxy5-pub.mail.unifiedlayer.com Received: from gproxy5-pub.mail.unifiedlayer.com (HELO gproxy5-pub.mail.unifiedlayer.com) (67.222.38.55) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Fri, 23 Dec 2016 19:59:34 +0000 Received: (qmail 31318 invoked by uid 0); 23 Dec 2016 19:59:32 -0000 Received: from unknown (HELO cmgw2) (10.0.90.83) by gproxy5.mail.unifiedlayer.com with SMTP; 23 Dec 2016 19:59:32 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by cmgw2 with id PXzT1u00U2f2jeq01XzWGK; Fri, 23 Dec 2016 12:59:30 -0700 X-Authority-Analysis: v=2.1 cv=KYpB72oD 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=n5n_aSjo0skA:10 a=zstS-IiYAAAA:8 a=qYHjIUWcnmVHUHyt4YoA:9 a=HX8As4ksL-QVcKQ_:21 a=VT-M4pDBl3NPZGmV:21 a=4G6NA9xxw8l3yy4pmD5M:22 Received: from 75-171-175-27.hlrn.qwest.net ([75.171.175.27]:45418 helo=bapiya) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1cKW01-0005tw-0m; Fri, 23 Dec 2016 12:59:29 -0700 From: Tom Tromey To: Tom Tromey Cc: Pedro Alves , gdb-patches@sourceware.org Subject: Re: [RFA 6/8] Use value_freer in dwarf2_evaluate_loc_desc_full References: <1480395946-10924-1-git-send-email-tom@tromey.com> <1480395946-10924-7-git-send-email-tom@tromey.com> <06e2b7b1-feca-29f7-7e49-e05f01d05485@redhat.com> <87bmwgez57.fsf@tromey.com> <87wpeq5uvy.fsf@tromey.com> Date: Fri, 23 Dec 2016 19:59:00 -0000 In-Reply-To: <87wpeq5uvy.fsf@tromey.com> (Tom Tromey's message of "Fri, 23 Dec 2016 12:05:05 -0700") Message-ID: <87lgv65sdb.fsf@tromey.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.90 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-BWhitelist: no X-Exim-ID: 1cKW01-0005tw-0m X-Source-Sender: 75-171-175-27.hlrn.qwest.net (bapiya) [75.171.175.27]:45418 X-Source-Auth: tom+tromey.com X-Email-Count: 6 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTIyLmJsdWVob3N0LmNvbQ== X-SW-Source: 2016-12/txt/msg00407.txt.bz2 Tom> It looks good to me. I've made this change and I'll send the new Tom> patches soon. Here's the new version of the patch to use scoped_value_mark in dwarf2_evaluate_loc_desc_full. Tom commit 63b869373e8dff9fd8648c00712459dd18a9798b Author: Tom Tromey Date: Mon Nov 21 21:04:59 2016 -0700 Use scoped_value_mark in dwarf2_evaluate_loc_desc_full This changes dwarf2_evaluate_loc_desc_full to use scoped_value_mark. 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-12-13 Tom Tromey * value.h (scoped_value_mark::~scoped_value_mark): Call free_to_mark. (scoped_value_mark::free_to_mark): New method. * dwarf2loc.c (dwarf2_evaluate_loc_desc_full): Use scoped_value_mark. diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 01ef9d6..d402851 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2016-12-13 Tom Tromey + * value.h (scoped_value_mark::~scoped_value_mark): Call + free_to_mark. + (scoped_value_mark::free_to_mark): New method. + * dwarf2loc.c (dwarf2_evaluate_loc_desc_full): Use + scoped_value_mark. + +2016-12-13 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 f5ab371..6e36835 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -2283,7 +2283,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) @@ -2297,7 +2296,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 ()); + scoped_value_mark free_values; ctx.gdbarch = get_objfile_arch (objfile); ctx.addr_size = dwarf2_per_cu_addr_size (per_cu); @@ -2312,7 +2311,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.free_to_mark (); retval = allocate_value (type); mark_value_bytes_unavailable (retval, 0, TYPE_LENGTH (type)); return retval; @@ -2321,7 +2320,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.free_to_mark (); return allocate_optimized_out_value (type); } else @@ -2344,7 +2343,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.free_to_mark (); retval = allocate_computed_value (type, &pieced_value_funcs, c); set_value_offset (retval, byte_offset); } @@ -2361,7 +2360,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.free_to_mark (); retval = value_from_register (type, gdb_regnum, frame); if (value_optimized_out (retval)) { @@ -2373,7 +2372,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; @@ -2407,7 +2405,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.free_to_mark (); retval = value_at_lazy (type, address + byte_offset); if (in_stack_memory) set_value_stack (retval, 1); @@ -2420,6 +2418,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 (); @@ -2432,8 +2431,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.free_to_mark (); + cleanup = make_cleanup_value_free (value); retval = allocate_value (type); contents = value_contents_raw (retval); @@ -2446,6 +2445,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; @@ -2458,7 +2459,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.free_to_mark (); retval = allocate_value (type); contents = value_contents_raw (retval); @@ -2478,7 +2479,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.free_to_mark (); retval = allocate_optimized_out_value (type); break; @@ -2494,8 +2495,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 3a0641a..d261148 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -728,7 +728,17 @@ class scoped_value_mark ~scoped_value_mark () { - value_free_to_mark (m_value); + free_to_mark (); + } + + /* Free the values currently on the value stack. */ + void free_to_mark () + { + if (m_value != NULL) + { + value_free_to_mark (m_value); + m_value = NULL; + } } private: