From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2205) id 805FC3856B44; Tue, 6 Dec 2022 11:01:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 805FC3856B44 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1670324510; bh=8C6JoWKAoIU0likaH8QWeGFJTGXuZA4d6wboQDTonLo=; h=From:To:Subject:Date:From; b=ci1MocJrV/lHCcPSw9mTTo5hsYcBY2IGZKQ8opvG305Z/obAl/MoVlIaJdCbCf4r5 I+N93UBwQibuHSNr8pGOiIv/PdfzbvWieAebcDj6+RIGbuLsx3ghza2n7QdrEv5kbM DDP133kXsKlV+VGmOOARojarDvZZHYlMrbIcYgII= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Tom de Vries To: gdb-cvs@sourceware.org Subject: [binutils-gdb] [gdb/testsuite] Make gdb.base/longjmp.exp FAIL more stable across archs X-Act-Checkin: binutils-gdb X-Git-Author: Tom de Vries X-Git-Refname: refs/heads/master X-Git-Oldrev: c8ea5e409b02cf7fa848e44af74b2e8246ad03f1 X-Git-Newrev: 6e41445bb006f3afc784862f8eb1bf0f2691a94a Message-Id: <20221206110150.805FC3856B44@sourceware.org> Date: Tue, 6 Dec 2022 11:01:50 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D6e41445bb006= f3afc784862f8eb1bf0f2691a94a commit 6e41445bb006f3afc784862f8eb1bf0f2691a94a Author: Tom de Vries Date: Tue Dec 6 12:01:46 2022 +0100 [gdb/testsuite] Make gdb.base/longjmp.exp FAIL more stable across archs =20 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) =3D=3D 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) ... =20 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) ... =20 At first glance, the failure mode doesn't look too bad: we stop a few insns later than the passing scenario. =20 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 =3D 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. =20 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 lon= gjmp 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 "retu= rn" from the longjmp call to the insn immediately after it (even though a longjmp is a noreturn function). =20 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. =20 Tested on x86_64-linux. Diff: --- gdb/testsuite/gdb.base/longjmp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gdb/testsuite/gdb.base/longjmp.c b/gdb/testsuite/gdb.base/long= jmp.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 =3D 0; =20 /* Pattern 1 - simple longjmp. */ - if (setjmp (env) =3D=3D 0) /* patt1 */ + if (setjmp (env) !=3D 0) /* patt1 */ { - longjmps++; - longjmp (env, 1); + resumes++; } else { - resumes++; + longjmps++; + longjmp (env, 1); } =20 i =3D 1; /* miss_step_1 */