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 */ From patchwork Tue Dec 6 11:02:11 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: 61544 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 A389D3856B5D for ; Tue, 6 Dec 2022 11:02:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A389D3856B5D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1670324564; bh=MF7HA7tOJDMhZKkJlu0QbrerOvzD41Gia8QOSYsNOko=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=dEyHeTmCAwuDGcD5C2m8rkF5/9jxw/tsly1PN+eI5UCiPppzG+zJKMVgSPqMhKxQa t2DULSC+LZJqz8mGwQ3DtNf98yM36k8WncjXAjQh5GKx/S76OU4u4sm2KQJN92uNrk BMoI3Kgad0ksgqODCrxhWbw4q301n00XOoC60Zvs= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id D93A23856B6E for ; Tue, 6 Dec 2022 11:02:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D93A23856B6E 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-out1.suse.de (Postfix) with ESMTPS id 1F46B21C29 for ; Tue, 6 Dec 2022 11:02:12 +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 F2C71132F3 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 APJGOjMhj2PmPAAAGKfGzw (envelope-from ) for ; Tue, 06 Dec 2022 11:02:11 +0000 To: gdb-patches@sourceware.org Subject: [pushed 2/2] [gdb/testsuite] Fix test names in gdb.base/longjmp.exp Date: Tue, 6 Dec 2022 12:02:11 +0100 Message-Id: <20221206110211.20786-2-tdevries@suse.de> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20221206110211.20786-1-tdevries@suse.de> References: <20221206110211.20786-1-tdevries@suse.de> 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, we have: ... PASS: gdb.base/longjmp.exp: next over setjmp (1) ... PASS: gdb.base/longjmp.exp: next over setjmp (2) ... The trailing " (1)" and " (2)" are interpreted as comments rather than parts of the test name, and therefore this is a duplicate, which is currently not detected by our duplicate detection mechanism (PR testsuite/29772). Fix the duplicate by using with_test_prefix. Tested on x86_64-linux. --- gdb/testsuite/gdb.base/longjmp.exp | 111 ++++++++++++++++------------- 1 file changed, 63 insertions(+), 48 deletions(-) diff --git a/gdb/testsuite/gdb.base/longjmp.exp b/gdb/testsuite/gdb.base/longjmp.exp index bd2fc21a442..10e440bfca8 100644 --- a/gdb/testsuite/gdb.base/longjmp.exp +++ b/gdb/testsuite/gdb.base/longjmp.exp @@ -42,30 +42,35 @@ set bp_start_test_3 [gdb_get_line_number "patt3"] # Pattern 1 - simple longjmp. # -delete_breakpoints - -gdb_test "break $bp_start_test_1" \ - "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_1.*" \ - "breakpoint at pattern 1 start" -gdb_test "continue" "patt1.*" "continue to breakpoint at pattern 1 start" - -# set safe-net break -gdb_test "break $bp_miss_step_1" \ - "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_1.*" \ - "breakpoint at miss_step_1" - -gdb_test "next" "longjmps\\+\\+;.*" "next over setjmp (1)" -gdb_test "next" "longjmp \\(env, 1\\);.*" "next to longjmp (1)" - -set msg "next over longjmp(1)" -gdb_test_multiple "next" $msg { - -re ".*patt1.*$gdb_prompt $" { - pass $msg - gdb_test "next" "resumes\\+\\+.*" "next into else block (1)" - gdb_test "next" "miss_step_1.*" "next into safety net (1)" +with_test_prefix "pattern 1" { + + with_test_prefix setup { + delete_breakpoints + + gdb_test "break $bp_start_test_1" \ + "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_1.*" \ + "breakpoint at pattern start" + gdb_test "continue" "patt1.*" "continue to breakpoint at pattern start" + + # set safe-net break + gdb_test "break $bp_miss_step_1" \ + "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_1.*" \ + "breakpoint at safety net" } - -re "miss_step_1.*$gdb_prompt $" { - fail $msg + + gdb_test "next" "longjmps\\+\\+;.*" "next over setjmp" + gdb_test "next" "longjmp \\(env, 1\\);.*" "next to longjmp" + + set msg "next over longjmp" + gdb_test_multiple "next" $msg { + -re ".*patt1.*$gdb_prompt $" { + pass $msg + gdb_test "next" "resumes\\+\\+.*" "next into else block" + gdb_test "next" "miss_step_1.*" "next into safety net" + } + -re "miss_step_1.*$gdb_prompt $" { + fail $msg + } } } @@ -73,30 +78,35 @@ gdb_test_multiple "next" $msg { # Pattern 2 - longjmp from an inner function. # -delete_breakpoints +with_test_prefix "pattern 2" { + + with_test_prefix setup { + delete_breakpoints -gdb_test "break $bp_start_test_2" \ - "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_2.*" \ - "breakpoint at pattern 2 start" -gdb_test "continue" "patt2.*" "continue to breakpoint at pattern 2 start" + gdb_test "break $bp_start_test_2" \ + "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_2.*" \ + "breakpoint at pattern start" + gdb_test "continue" "patt2.*" "continue to breakpoint at pattern start" -# set safe-net break -gdb_test "break $bp_miss_step_2" \ - "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_2.*" \ - "breakpoint at miss_step_2" + # set safe-net break + gdb_test "break $bp_miss_step_2" \ + "Breakpoint.*at.* file .*$srcfile, line.*$bp_miss_step_2.*" \ + "breakpoint at safety net" + } -gdb_test "next" "call_longjmp.*" "next over setjmp (2)" + gdb_test "next" "call_longjmp.*" "next over setjmp" -set msg "next over call_longjmp (2)" -gdb_test_multiple "next" $msg { - -re ".*patt2.*$gdb_prompt $" { - pass $msg + set msg "next over call_longjmp" + gdb_test_multiple "next" $msg { + -re ".*patt2.*$gdb_prompt $" { + pass $msg - gdb_test "next" "resumes\\+\\+.*" "next into else block (2)" - gdb_test "next" "miss_step_2.*" "next into safety net (2)" - } - -re "miss_step_2.*$gdb_prompt $" { - fail $msg + gdb_test "next" "resumes\\+\\+.*" "next into else block" + gdb_test "next" "miss_step_2.*" "next into safety net" + } + -re "miss_step_2.*$gdb_prompt $" { + fail $msg + } } } @@ -104,11 +114,16 @@ gdb_test_multiple "next" $msg { # Pattern 3 - setjmp/longjmp inside stepped-over function. # -delete_breakpoints +with_test_prefix "pattern 3" { -gdb_test "break $bp_start_test_3" \ - "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_3.*" \ - "breakpoint at pattern 3 start" -gdb_test "continue" "patt3.*" "continue to breakpoint at pattern 3 start" + with_test_prefix setup { + delete_breakpoints -gdb_test "next" "longjmp caught.*" "next over patt3" + gdb_test "break $bp_start_test_3" \ + "Breakpoint.*at.* file .*$srcfile, line.*$bp_start_test_3.*" \ + "breakpoint at pattern start" + gdb_test "continue" "patt3.*" "continue to breakpoint at pattern start" + } + + gdb_test "next" "longjmp caught.*" "next over pattern" +}