From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16940 invoked by alias); 3 Aug 2012 16:03:22 -0000 Received: (qmail 16922 invoked by uid 22791); 3 Aug 2012 16:03:19 -0000 X-SWARE-Spam-Status: No, hits=-6.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 03 Aug 2012 16:03:01 +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 q73G30EM002720 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 3 Aug 2012 12:03:00 -0400 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q73G2xe5030581 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 3 Aug 2012 12:02:59 -0400 From: Tom Tromey To: gdb-patches@sourceware.org Subject: Re: RFC: one approach to fixing PR 14100 References: <87r4rpqnng.fsf@fleche.redhat.com> Date: Fri, 03 Aug 2012 16:03:00 -0000 In-Reply-To: <87r4rpqnng.fsf@fleche.redhat.com> (Tom Tromey's message of "Thu, 02 Aug 2012 10:11:47 -0600") Message-ID: <877gtgneto.fsf@fleche.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain 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 X-SW-Source: 2012-08/txt/msg00117.txt.bz2 >>>>> "Tom" == Tom Tromey writes: Tom> Another approach would be to change dwarf2_frame_cache to set the Tom> prologue_cache at the end of its work rather than at the beginning. Tom> Then, I suppose, we'd have to document this restriction and audit all Tom> the other sniffers. Here is a different fix for PR 14100. It applies on top of my earlier cleanup fix patch. I read through all the frame sniffers in gdb. Of them, only the DWARF sniffer can potentially set the prologue cache and then be interrupted. So, this patch fixes the DWARF sniffer (indirectly, by fixing dwarf2_frame_cache); and then makes this requirement more clear in frame-unwind.h. On the whole I think I prefer this one. Tom * dwarf2-frame.c (dwarf2_frame_cache): Set *this_cache at return only. * frame-unwind.h (frame_sniffer_ftype): Document prologue cache initialization constraint. --- gdb/dwarf2-frame.c | 3 ++- gdb/frame-unwind.h | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index 741a103..b716a63 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -1016,7 +1016,6 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) /* Allocate a new cache. */ cache = FRAME_OBSTACK_ZALLOC (struct dwarf2_frame_cache); cache->reg = FRAME_OBSTACK_CALLOC (num_regs, struct dwarf2_frame_state_reg); - *this_cache = cache; /* Allocate and initialize the frame state. */ fs = XZALLOC (struct dwarf2_frame_state); @@ -1111,6 +1110,7 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) { cache->unavailable_retaddr = 1; do_cleanups (old_chain); + *this_cache = cache; return cache; } @@ -1226,6 +1226,7 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"), (entry_cfa_sp_offset_p ? &entry_cfa_sp_offset : NULL)); + *this_cache = cache; return cache; } diff --git a/gdb/frame-unwind.h b/gdb/frame-unwind.h index f82d763..aa58640 100644 --- a/gdb/frame-unwind.h +++ b/gdb/frame-unwind.h @@ -44,7 +44,9 @@ struct value; /* Given THIS frame, take a whiff of its registers (namely the PC and attributes) and if SELF is the applicable unwinder, - return non-zero. Possibly also initialize THIS_PROLOGUE_CACHE. */ + return non-zero. Possibly also initialize THIS_PROLOGUE_CACHE; but + only if returning 1. Initializing THIS_PROLOGUE_CACHE in other + cases (0 return, or exception) is invalid. */ typedef int (frame_sniffer_ftype) (const struct frame_unwind *self, struct frame_info *this_frame, -- 1.7.7.6