From 197a63068b10d50c01fbe024a45d47cd25a907e3 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Mon, 6 Dec 2021 16:01:47 +0100 Subject: [PATCH] [gdb/testsuite] Fix data alignment in gdb.arch/i386-{avx,sse}.exp When running test-case gdb.arch/i386-avx.exp with clang I ran into: ... (gdb) PASS: gdb.arch/i386-avx.exp: set first breakpoint in main continue^M Continuing.^M ^M Program received signal SIGSEGV, Segmentation fault.^M 0x000000000040052b in main (argc=1, argv=0x7fffffffd3c8) at i386-avx.c:54^M 54 asm ("vmovaps 0(%0), %%ymm0\n\t"^M (gdb) FAIL: gdb.arch/i386-avx.exp: continue to breakpoint: \ continue to first breakpoint in main ... The problem is that the vmovaps insn requires an 256-bit (or 32-byte) aligned address, and it's only 16-byte aligned: ... (gdb) p /x $rax $1 = 0x601030 ... Fix this by using a sufficiently aligned address, using _Alignas. Compile using -std=gnu11 to support _Alignas. Likewise in gdb.arch/i386-sse.exp. Tested on x86_64-linux, with both gcc and clang. --- gdb/testsuite/gdb.arch/i386-avx.c | 5 ++++- gdb/testsuite/gdb.arch/i386-avx.exp | 11 ++++++++--- gdb/testsuite/gdb.arch/i386-sse.c | 5 ++++- gdb/testsuite/gdb.arch/i386-sse.exp | 11 ++++++++--- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/gdb/testsuite/gdb.arch/i386-avx.c b/gdb/testsuite/gdb.arch/i386-avx.c index 4e938399a24..765026c83fb 100644 --- a/gdb/testsuite/gdb.arch/i386-avx.c +++ b/gdb/testsuite/gdb.arch/i386-avx.c @@ -20,8 +20,11 @@ #include #include "nat/x86-cpuid.h" +/* Align sufficient to be able to use vmovaps. */ +#define ALIGN 32 + typedef struct { - float f[8]; + _Alignas (ALIGN) float f[8]; } v8sf_t; diff --git a/gdb/testsuite/gdb.arch/i386-avx.exp b/gdb/testsuite/gdb.arch/i386-avx.exp index 1b61a65d605..d721b8c4624 100644 --- a/gdb/testsuite/gdb.arch/i386-avx.exp +++ b/gdb/testsuite/gdb.arch/i386-avx.exp @@ -35,12 +35,17 @@ if [get_compiler_info] { return -1 } -set additional_flags "" +set flags { debug } + +# C11 for _Alignas, gnu for asm. +lappend flags additional_flags=-std=gnu11 + if { [test_compiler_info gcc*] || [test_compiler_info clang*] } { - set additional_flags "additional_flags=-mavx -I${srcdir}/.." + lappend flags "additional_flags=-mavx -I${srcdir}/.." } -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \ + $flags] != "" } { unsupported "compiler does not support AVX" return } diff --git a/gdb/testsuite/gdb.arch/i386-sse.c b/gdb/testsuite/gdb.arch/i386-sse.c index a5941a4071e..10bd4b62ff0 100644 --- a/gdb/testsuite/gdb.arch/i386-sse.c +++ b/gdb/testsuite/gdb.arch/i386-sse.c @@ -20,8 +20,11 @@ #include #include "nat/x86-cpuid.h" +/* Align sufficient to be able to use movaps. */ +#define ALIGN 16 + typedef struct { - float f[4]; + _Alignas (ALIGN) float f[4]; } v4sf_t; diff --git a/gdb/testsuite/gdb.arch/i386-sse.exp b/gdb/testsuite/gdb.arch/i386-sse.exp index 1ee3a8444b3..15649e435f7 100644 --- a/gdb/testsuite/gdb.arch/i386-sse.exp +++ b/gdb/testsuite/gdb.arch/i386-sse.exp @@ -30,12 +30,17 @@ if [get_compiler_info] { return -1 } -set additional_flags "" +set flags { debug } + +# C11 for _Alignas, gnu for asm. +lappend flags additional_flags=-std=gnu11 + if { [test_compiler_info gcc*] || [test_compiler_info clang*] } { - set additional_flags "additional_flags=-msse -I${srcdir}/.." + lappend flags "additional_flags=-msse -I${srcdir}/.." } -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \ + $flags] != "" } { unsupported "compiler does not support SSE" return } -- 2.30.2