From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 39654 invoked by alias); 9 Jun 2015 15:01:32 -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 39641 invoked by uid 89); 9 Jun 2015 15:01:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 09 Jun 2015 15:01:21 +0000 Received: from svr-orw-fem-03.mgc.mentorg.com ([147.34.97.39]) by relay1.mentorg.com with esmtp id 1Z2L1i-0000AE-HH from Luis_Gustavo@mentor.com for gdb-patches@sourceware.org; Tue, 09 Jun 2015 08:01:18 -0700 Received: from opsys.world.mentorg.com (147.34.91.1) by svr-orw-fem-03.mgc.mentorg.com (147.34.97.39) with Microsoft SMTP Server id 14.3.224.2; Tue, 9 Jun 2015 08:01:17 -0700 From: Luis Machado To: Subject: [PATCH] Fix problems with finishing a dummy function call on simulators. Date: Tue, 09 Jun 2015 15:01:00 -0000 Message-ID: <1433862056-18237-1-git-send-email-lgustavo@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2015-06/txt/msg00135.txt.bz2 This is in line with what was done by Joel's patch here: https://sourceware.org/ml/gdb-patches/2014-11/msg00478.html And it also answers Pedro's question about whether this is specific to SPARC QEMU or not. This indeed seems to affect multiple QEMU targets and also other simulators (proprietary). I ran into this weird issue of not being able to "finish" an inferior function call. It looks as if the program is running away, but it really is stuck somewhere. "finish" still works fine for regular functions not called manually by GDB. I tracked this failure down to GDB having both a bp_call_dummy and bp_finish in its breakpoint list. As a result of one not being considered permanent and the other considered permanent, GDB will not issue a Z packet to force the insertion of that location's breakpoint, confusing the simulator that does not know how to deal properly with these permanent breakpoints that GDB inserted beforehand. The attached patch fixes this, though i'm inclined to say we could probably check if both bp_call_dummy and bp_finish are present and force the insertion of that location's breakpoint. It isn't clear to me where exactly that check would go or if it would be cleaner than checking that information in the same function Joel used. I see no regressions on x86-64 and it fixes a bunch of failures for simulator targets we use (MIPS and PowerPC to name two). gdb/ChangeLog: 2015-06-09 Luis Machado * breakpoint.c (bp_loc_is_permanent): Return 0 for bp_finish as well. --- gdb/breakpoint.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 657c58e..eb3df02 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -8984,8 +8984,16 @@ bp_loc_is_permanent (struct bp_location *loc) 0x02 while interrupts disabled, Error state) instead of reporting a SIGTRAP. QEMU should probably be fixed, but in the interest of compatibility with versions that behave this way, we always consider - bp_call_dummy breakpoint locations as non-permanent. */ - if (loc->owner->type == bp_call_dummy) + bp_call_dummy breakpoint locations as non-permanent. + + Another situation arises when we have a bp_call_dummy breakpoint inserted + and then the user issues a finish, triggering GDB to create a bp_finish + breakpoint to handle the return from the inferior function call. When + both bp_call_dummy and bp_finish breakpoints are present, GDB will not + force the insertion of these locations, triggering, once again, the + problem described above. Therefore we check for bp_finish here as + well. */ + if (loc->owner->type == bp_call_dummy || loc->owner->type == bp_finish) return 0; cleanup = save_current_space_and_thread (); -- 1.9.1