mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 15:18:37 +08:00
[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:
@ -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 \
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user