From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2205) id 390183857437; Fri, 17 Feb 2023 14:33:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 390183857437 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1676644401; bh=p+KljfkOWPTN6Xqav2vz/RAOysFyDTVkk5n6O6k3MVM=; h=From:To:Subject:Date:From; b=ithFwL9ZZFcs+evvwBsgCC9yqgrYrLKqL9OZ659aQVciErAgZffNLb6dEyRGlz7bg zbrBCJjUM5DqH8IvvQTTW0nM6QTkJtu3mNV6WH4qVKl0fUv3gn0cK7dTVpbGRR4Mh0 vkdiE4jBgcVHuGZ31DNZhpo+TCNN/sCHSiGqMjPA= 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] Simplify gdb.arch/amd64-disp-step-avx.exp X-Act-Checkin: binutils-gdb X-Git-Author: Tom de Vries X-Git-Refname: refs/heads/master X-Git-Oldrev: 5f497256bee624f0fa470949aa41534093bc5b25 X-Git-Newrev: ab3fdfe6e4805eff45ec4d701d0cd6511d9c3690 Message-Id: <20230217143321.390183857437@sourceware.org> Date: Fri, 17 Feb 2023 14:33:21 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Dab3fdfe6e480= 5eff45ec4d701d0cd6511d9c3690 commit ab3fdfe6e4805eff45ec4d701d0cd6511d9c3690 Author: Tom de Vries Date: Fri Feb 17 15:33:18 2023 +0100 [gdb/testsuite] Simplify gdb.arch/amd64-disp-step-avx.exp =20 On SLE-11, with glibc 2.11.3, I run into: ... (gdb) PASS: gdb.arch/amd64-disp-step-avx.exp: vex3: \ var128 has expected value after continue^M Continuing.^M ^M Program received signal SIGSEGV, Segmentation fault.^M 0x0000000000400283 in _exit (status=3D0) at \ ../sysdeps/unix/sysv/linux/_exit.c:33^M 33 ../sysdeps/unix/sysv/linux/_exit.c: No such file or directory.^M (gdb) FAIL: gdb.arch/amd64-disp-step-avx.exp: \ continue until exit at amd64-disp-step-avx ... =20 This is not related to gdb, we get the same result by just running the = exec. =20 The problem is that the test-case: - calls glibc's _exit, and - uses -nostartfiles -static, putting the burden for any necessary initialization for calling glibc's _exit on the test-case itself. =20 So, when we get to the second insn in _exit: ... 000000000040acb0 <_exit>: 40acb0: 48 63 d7 movslq %edi,%rdx 40acb3: 64 4c 8b 14 25 00 00 mov %fs:0x0,%r10 ... no glibc-related initialization is done, and we run into the segfault. =20 Adding this (borrowed from __libc_start_main) in _start in the .S file = is sufficient to fix it: ... .rept 200 nop + call __pthread_initialize_minimal .endr ... But that already doesn't compile with say glibc 2.31, and regardless I = think this sort of fix is too fragile. =20 We could of course fix this by simply not running to exit. But ideally= we'd have an exec that doesn't segfault when you just run it. =20 Alternatively, we could hand-code an _exit syscall and bypass glibc all together. But I'd rather fix this in a way that simplifies the tes= t-case. =20 Taking a step back, the -nostartfiles -static was added to address that= the xmm registers were not zero at main (which AFAICT is a valid thing to h= appen). =20 [ The change itself silently broke the test-case, needing further fixin= g by commit 40310f30a51 ("gdb: make gdb.arch/amd64-disp-step-avx.exp actuall= y test displaced stepping"). ] =20 Instead, simplify things by reverting to the original situation: - no -nostartfiles -static compilation flags, - no _start in the .S file, - use exit instead of _exit in the .S file, and fix the original problem by setting the xmm registers to zero rathe= r than checking that they're zero. =20 Now that we're no longer forcing -static, add nopie to the flags to pre= vent compilation failure with target board unix/-fPIE/-pie. =20 Tested on x86_64-linux. =20 PR testsuite/30132 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=3D30132 Diff: --- gdb/testsuite/gdb.arch/amd64-disp-step-avx.S | 12 ++---------- gdb/testsuite/gdb.arch/amd64-disp-step-avx.exp | 14 ++++---------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/gdb/testsuite/gdb.arch/amd64-disp-step-avx.S b/gdb/testsuite/g= db.arch/amd64-disp-step-avx.S index 0e07ab422db..496b37f6739 100644 --- a/gdb/testsuite/gdb.arch/amd64-disp-step-avx.S +++ b/gdb/testsuite/gdb.arch/amd64-disp-step-avx.S @@ -19,15 +19,7 @@ instructions. */ =20 .text - - .global _start,main -_start: - # The area at _start is used as the displaced stepping buffer. Put - # more than enough nop instructions so that the instructions under test - # below don't conflict with it. - .rept 200 - nop - .endr + .global main main: nop =20 @@ -66,7 +58,7 @@ ro_var: =20 done: mov $0,%rdi - call _exit + call exit hlt =20 /* RIP-relative data for VEX3 test above. */ diff --git a/gdb/testsuite/gdb.arch/amd64-disp-step-avx.exp b/gdb/testsuite= /gdb.arch/amd64-disp-step-avx.exp index ef44a248b82..fba9f64d5c5 100644 --- a/gdb/testsuite/gdb.arch/amd64-disp-step-avx.exp +++ b/gdb/testsuite/gdb.arch/amd64-disp-step-avx.exp @@ -22,9 +22,7 @@ require is_x86_64_m64_target have_avx =20 standard_testfile .S =20 -set options [list debug \ - additional_flags=3D-static \ - additional_flags=3D-nostartfiles] +set options [list debug nopie] if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} $opti= ons] } { return -1 } @@ -103,14 +101,10 @@ proc disp_step_func { func } { =20 # Test a VEX2-encoded RIP-relative instruction. with_test_prefix "vex2" { - # This test writes to the 'xmm0' register. As the test is - # statically linked, we know that the XMM registers should all - # have the default value of 0 at this point in time. We're about - # to run an AVX instruction that will modify $xmm0, but lets first - # confirm that all XMM registers are 0. + # Initialize all XMM registers to 0. for {set i 0 } { $i < 16 } { incr i } { - gdb_test "p /x \$xmm${i}.uint128" " =3D 0x0" \ - "xmm${i} has expected value before" + gdb_test_no_output "set \$xmm${i}.uint128 =3D 0" \ + "xmm${i} set to zero" } =20 disp_step_func "test_rip_vex2"