[gdb/testsuite] Check avx support in gdb.arch/amd64-disp-step-avx.exp

On a machine on Open Build Service I'm running into a SIGILL for test-case
gdb.arch/amd64-disp-step-avx.exp:
...
Program received signal SIGILL, Illegal instruction.^M
test_rip_vex2 () at gdb.arch/amd64-disp-step-avx.S:40^M
40              vmovsd ro_var(%rip),%xmm0^M
(gdb) FAIL: gdb.arch/amd64-disp-step-avx.exp: vex2: \
  continue to test_rip_vex2_end
...
The SIGILL happens when trying to execute the first avx instruction in the
executable.

I can't directly access the machine, but looking at the log for test-case
gdb.arch/i386-avx.exp, it seems that there's no avx support:
...
Breakpoint 1, main (argc=1, argv=0x7fffffffd6b8) at gdb.arch/i386-avx.c:68^M
68        if (have_avx ())^M
(gdb) print have_avx ()^M
$1 = 0^M
...

Fix this by:
- adding a gdb_caching_proc have_avx, similar to have_mpx, using the have_avx
  function from gdb.arch/i386-avx.c
- using proc have_avx in both gdb/testsuite/gdb.arch/amd64-disp-step-avx.exp
  and gdb/testsuite/gdb.arch/i386-avx.exp.

Tested on my x86_64-linux laptop with avx support, where both test-cases pass.

gdb/testsuite/ChangeLog:

2021-09-04  Tom de Vries  <tdevries@suse.de>

	PR testsuite/26950
	* gdb/testsuite/gdb.arch/i386-avx.c (main): Remove call to have_avx.
	(have_avx): Move ...
	* gdb/testsuite/lib/gdb.exp (have_avx): ... here.  New proc.
	* gdb/testsuite/gdb.arch/amd64-disp-step-avx.exp: Use have_avx.
	* gdb/testsuite/gdb.arch/i386-avx.exp: Same.
This commit is contained in:
Tom de Vries
2021-09-04 10:44:10 +02:00
parent e994f4ef45
commit 10f3fbece9
4 changed files with 102 additions and 82 deletions

View File

@ -23,6 +23,11 @@ if { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
return return
} }
if { ![have_avx] } {
verbose "Skipping x86_64 displaced stepping tests."
return
}
standard_testfile .S standard_testfile .S
set options [list debug \ set options [list debug \

View File

@ -48,24 +48,8 @@ v8sf_t data[] =
}; };
int
have_avx (void)
{
unsigned int eax, ebx, ecx, edx;
if (!x86_cpuid (1, &eax, &ebx, &ecx, &edx))
return 0;
if ((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE))
return 1;
else
return 0;
}
int int
main (int argc, char **argv) main (int argc, char **argv)
{
if (have_avx ())
{ {
asm ("vmovaps 0(%0), %%ymm0\n\t" asm ("vmovaps 0(%0), %%ymm0\n\t"
"vmovaps 32(%0), %%ymm1\n\t" "vmovaps 32(%0), %%ymm1\n\t"
@ -122,7 +106,6 @@ main (int argc, char **argv)
#endif #endif
puts ("Bye!"); /* second breakpoint here */ puts ("Bye!"); /* second breakpoint here */
}
return 0; return 0;
} }

View File

@ -24,6 +24,11 @@ if { ![istarget i?86-*-*] && ![istarget x86_64-*-* ] } {
return return
} }
if { ![have_avx] } {
verbose "Skipping x86 AVX tests."
return
}
standard_testfile .c standard_testfile .c
if [get_compiler_info] { if [get_compiler_info] {
@ -47,23 +52,6 @@ if ![runto_main] then {
return 0 return 0
} }
send_gdb "print have_avx ()\r"
gdb_expect {
-re ".. = 1\r\n$gdb_prompt " {
pass "check whether processor supports AVX"
}
-re ".. = 0\r\n$gdb_prompt " {
verbose "processor does not support AVX; skipping AVX tests"
return
}
-re ".*$gdb_prompt $" {
fail "check whether processor supports AVX"
}
timeout {
fail "check whether processor supports AVX (timeout)"
}
}
gdb_test "break [gdb_get_line_number "first breakpoint here"]" \ gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
"Breakpoint .* at .*i386-avx.c.*" \ "Breakpoint .* at .*i386-avx.c.*" \
"set first breakpoint in main" "set first breakpoint in main"

View File

@ -8123,5 +8123,49 @@ gdb_caching_proc have_mpx {
return $status return $status
} }
# Return 1 if target supports avx, otherwise return 0.
gdb_caching_proc have_avx {
global srcdir
set me "have_avx"
if { ![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] } {
verbose "$me: target does not support avx, returning 0" 2
return 0
}
# Compile a test program.
set src {
#include "nat/x86-cpuid.h"
int main() {
unsigned int eax, ebx, ecx, edx;
if (!x86_cpuid (1, &eax, &ebx, &ecx, &edx))
return 0;
if ((ecx & (bit_AVX | bit_OSXSAVE)) == (bit_AVX | bit_OSXSAVE))
return 1;
else
return 0;
}
}
set compile_flags "incdir=${srcdir}/.."
if {![gdb_simple_compile $me $src executable $compile_flags]} {
return 0
}
set result [remote_exec target $obj]
set status [lindex $result 0]
set output [lindex $result 1]
if { $output != "" } {
set status 0
}
remote_file build delete $obj
verbose "$me: returning $status" 2
return $status
}
# Always load compatibility stuff. # Always load compatibility stuff.
load_lib future.exp load_lib future.exp