From patchwork Tue Dec 6 11:02:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 61545 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AAE773853D65 for ; Tue, 6 Dec 2022 11:03:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AAE773853D65 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1670324592; bh=vVTW1ChndWGY2jNefU2NaaD2R72QV5HDJTMxw0irXYA=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=VHoNgfiE29ai5EIyjTqKddtj1fR9Yus/Dw7WPC4MyM5XUAvJvTpJgvD0pjc2eo9v0 4hqtKdQOBcEItv39/loLEDja+hRgU+UsIaX8a38iEHrP2wU0xX2uHbVHzxOXF76IG0 wAso6hq/Zticty028vikOazyzsoYsEF1GylCtnc0= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by sourceware.org (Postfix) with ESMTPS id CC7CD3856B67 for ; Tue, 6 Dec 2022 11:02:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CC7CD3856B67 Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id ED4901FE57 for ; Tue, 6 Dec 2022 11:02:11 +0000 (UTC) Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap1.suse-dmz.suse.de (Postfix) with ESMTPS id D9B3B132F3 for ; Tue, 6 Dec 2022 11:02:11 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap1.suse-dmz.suse.de with ESMTPSA id U8UHNDMhj2PmPAAAGKfGzw (envelope-from ) for ; Tue, 06 Dec 2022 11:02:11 +0000 To: gdb-patches@sourceware.org Subject: [pushed 1/2] [gdb/testsuite] Make gdb.base/longjmp.exp FAIL more stable across archs Date: Tue, 6 Dec 2022 12:02:10 +0100 Message-Id: <20221206110211.20786-1-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tom de Vries via Gdb-patches From: Tom de Vries Reply-To: Tom de Vries Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" When running test-case gdb.base/longjmp.exp on x86_64-linux, the master longjmp breakpoint is set using probes and the test-case passes: ... (gdb) PASS: gdb.base/longjmp.exp: next to longjmp (1) next^M 0x00000000004005cc 49 if (setjmp (env) == 0) /* patt1 */^M (gdb) PASS: gdb.base/longjmp.exp: next over longjmp(1) next^M 56 resumes++;^M (gdb) PASS: gdb.base/longjmp.exp: next into else block (1) ... However, if I disable create_longjmp_master_breakpoint_probe, we have instead: ... (gdb) PASS: gdb.base/longjmp.exp: next to longjmp (1) next^M 56 resumes++;^M (gdb) FAIL: gdb.base/longjmp.exp: next over longjmp(1) ... At first glance, the failure mode doesn't look too bad: we stop a few insns later than the passing scenario. For contrast, if we do the same on powerpc64le, the failure mode is: ... (gdb) PASS: gdb.base/longjmp.exp: next to longjmp (1) next^M ^M Breakpoint 3, main () at longjmp.c:59^M 59 i = 1; /* miss_step_1 */^M (gdb) FAIL: gdb.base/longjmp.exp: next over longjmp(1) ... Here we only stop because of running into the safety net breakpoint at miss_step_1. So, how does this happen on x86_64? Let's look at the code: ... 4005c7: e8 94 fe ff ff call 400460 <_setjmp@plt> 4005cc: 85 c0 test %eax,%eax 4005ce: 75 1e jne 4005ee 4005d0: 8b 05 8e 0a 20 00 mov 0x200a8e(%rip),%eax # 601064 4005d6: 83 c0 01 add $0x1,%eax 4005d9: 89 05 85 0a 20 00 mov %eax,0x200a85(%rip) # 601064 4005df: be 01 00 00 00 mov $0x1,%esi 4005e4: bf 80 10 60 00 mov $0x601080,%edi 4005e9: e8 82 fe ff ff call 400470 4005ee: 8b 05 74 0a 20 00 mov 0x200a74(%rip),%eax # 601068 ... The next over the longjmp call at 4005e9 is supposed to stop at the longjmp target at 4005cc, but instead we stop at 4005ee, where we have the step-resume breakpoint inserted by the next. In other words, we accidentally "return" from the longjmp call to the insn immediately after it (even though a longjmp is a noreturn function). Try to avoid this accident and make the failure mode on x86_64 the same as on powerpc64le, by switching the then and else branch. Tested on x86_64-linux. --- gdb/testsuite/gdb.base/longjmp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) base-commit: c8ea5e409b02cf7fa848e44af74b2e8246ad03f1 diff --git a/gdb/testsuite/gdb.base/longjmp.c b/gdb/testsuite/gdb.base/longjmp.c index 4139e49e6f1..ce6990ca99a 100644 --- a/gdb/testsuite/gdb.base/longjmp.c +++ b/gdb/testsuite/gdb.base/longjmp.c @@ -46,14 +46,14 @@ main () volatile int i = 0; /* Pattern 1 - simple longjmp. */ - if (setjmp (env) == 0) /* patt1 */ + if (setjmp (env) != 0) /* patt1 */ { - longjmps++; - longjmp (env, 1); + resumes++; } else { - resumes++; + longjmps++; + longjmp (env, 1); } i = 1; /* miss_step_1 */