From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 531 invoked by alias); 8 Mar 2011 16:52:10 -0000 Received: (qmail 521 invoked by uid 22791); 8 Mar 2011 16:52:08 -0000 X-SWARE-Spam-Status: No, hits=-6.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,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; Tue, 08 Mar 2011 16:52:01 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p28GpxFf004401 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 8 Mar 2011 11:51:59 -0500 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p28Gpxb0017015; Tue, 8 Mar 2011 11:51:59 -0500 Received: from opsy.redhat.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id p28Gpwvw006851; Tue, 8 Mar 2011 11:51:58 -0500 Received: by opsy.redhat.com (Postfix, from userid 500) id 0304C3782A7; Tue, 8 Mar 2011 09:51:57 -0700 (MST) From: Tom Tromey To: Jan Kratochvil Cc: gdb-patches@sourceware.org Subject: Re: RFC: lazily call save_current_space_and_thread References: <20110305125239.GA31797@host1.jankratochvil.net> Date: Tue, 08 Mar 2011 17:14:00 -0000 In-Reply-To: (Tom Tromey's message of "Mon, 07 Mar 2011 12:48:51 -0700") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 2011-03/txt/msg00541.txt.bz2 Tom> I think I can actually make make_cleanup_restore_current_thread more Tom> efficient. But if not, I will reimplement this with a flag. This turned out to be pretty easy; I'm not sure why I didn't do it before. This patch makes make_cleanup_restore_current_thread more efficient, by having it not compute the current frame when there is no selected frame. This approach let me remove another hack I had in my tree. Built and regtested on x86-64 (compile farm). Let me know what you think. Tom 2011-03-08 Tom Tromey * thread.c (restore_selected_frame): Handle frame_level == -1. (make_cleanup_restore_current_thread): Use get_selected_frame_if_set. * frame.h (get_selected_frame_if_set): Declare. * frame.c (get_selected_frame_if_set): New function. diff --git a/gdb/frame.c b/gdb/frame.c index 36fcefe..8ed20b1 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1247,6 +1247,16 @@ get_selected_frame (const char *message) return selected_frame; } +/* If there is a selected frame, return it. Otherwise, return NULL. */ + +struct frame_info * +get_selected_frame_if_set (void) +{ + if (selected_frame == NULL) + return NULL; + return get_selected_frame (NULL); +} + /* This is a variant of get_selected_frame() which can be called when the inferior does not have a frame; in that case it will return NULL instead of calling error(). */ diff --git a/gdb/frame.h b/gdb/frame.h index 2c5276e..252b75e 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -260,6 +260,9 @@ extern void reinit_frame_cache (void); and then return that thread's previously selected frame. */ extern struct frame_info *get_selected_frame (const char *message); +/* If there is a selected frame, return it. Otherwise, return NULL. */ +extern struct frame_info *get_selected_frame_if_set (void); + /* Select a specific frame. NULL, apparently implies re-select the inner most frame. */ extern void select_frame (struct frame_info *); diff --git a/gdb/thread.c b/gdb/thread.c index 7d8f6da..f7eccfe 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -1019,6 +1019,13 @@ restore_selected_frame (struct frame_id a_frame_id, int frame_level) struct frame_info *frame = NULL; int count; + /* This means there was no selected frame. */ + if (frame_level == -1) + { + select_frame (NULL); + return; + } + gdb_assert (frame_level >= 0); /* Restore by level first, check if the frame id is the same as @@ -1137,7 +1144,13 @@ make_cleanup_restore_current_thread (void) && target_has_registers && target_has_stack && target_has_memory) - frame = get_selected_frame (NULL); + { + /* If we naively call get_selected_frame here, then we can + end up reading debuginfo for the current frame, even + though the user has not selected a frame and we don't + actually need the debuginfo at this point. */ + frame = get_selected_frame_if_set (); + } else frame = NULL;