Christophe Lyon via Gcc-patches <gcc-patches@gcc.gnu.org> writes: > Some of the CMSE tests have 'dg-do run', but qemu-arm does not support > the privileged instructions involved; one has to use qemu-system-arm > for this, which in turn requires modifications to the default > newlib/libgloss startup code to enable the FPU as the FP status > registers need to be saved when using CMSE code. > > This patch introduces arm_cmse_hw, similar to arm_neon_hw, to detect > whether the execution engine supports the CMSE instructions. If not, > we set dg-do-what-default to assemble instead of run. We thus remove > all the 'dg-do run' directives from CMSE tests, to rely on > dg-do-what-default instead. > > Note that cmse-16.c used to pass with dg-do run under qemu-arm, > because the property being tested is not available (qemu-arm does not > model secure vs non-secure memory). The patch removes dg-do from it > too, since it is relevant only with an adequate simulator. > > Before the patch, bitfield-[123].c and struct-1.c fail at execution > under qemu-arm. With the patch, execution is skipped. > > The same tests pass under qemu-system-arm both with and without the > patch. > > This avoids failures when testing with > -mthumb/-mfloat-abi=hard/-march=armv8-m.main+fp+dsp under qemu-arm for > cortex-m33. > > I'm also running tests with qemu-system-arm for cortex-m33, but I run > only cmse.exp with a patched newlib in this case: I use qemu-arm for > all combinations except that one because it's faster and supports > semihosting. > > I do not have a setup to check this with actual hardware or another > simulator. > > 2021-04-19 Christophe Lyon <christophe.l...@linaro.org> > > gcc/ > * doc/sourcebuild.texi (arm_cmse_hw): Document. > > gcc/testsuite/ > * gcc.target/arm/cmse/bitfield-1.c: Remove dg-do. > * gcc.target/arm/cmse/bitfield-2.c: Likewise. > * gcc.target/arm/cmse/bitfield-3.c: Likewise. > * gcc.target/arm/cmse/cmse-16.c: Likewise. > * gcc.target/arm/cmse/struct-1.c: Likewise. > * gcc.target/arm/cmse/cmse.exp: Set dg-do-what-default depending > on arm_cmse_hw. > * lib/target-supports.exp (check_effective_target_arm_cmse_hw): > New.
OK, thanks. It feels to me like we're hard-coding the magic rune -Wl,--section-start,.gnu.sgstubs=0x00400000 in too many places, but that's pre-existing. Richard > --- > gcc/doc/sourcebuild.texi | 3 +++ > gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c | 2 +- > gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c | 2 +- > gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c | 2 +- > gcc/testsuite/gcc.target/arm/cmse/cmse-16.c | 6 +++++- > gcc/testsuite/gcc.target/arm/cmse/cmse.exp | 7 ++++++- > gcc/testsuite/gcc.target/arm/cmse/struct-1.c | 2 +- > gcc/testsuite/lib/target-supports.exp | 15 +++++++++++++++ > 8 files changed, 33 insertions(+), 6 deletions(-) > > diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi > index 0104916..616a267 100644 > --- a/gcc/doc/sourcebuild.texi > +++ b/gcc/doc/sourcebuild.texi > @@ -2012,6 +2012,9 @@ div instruction. > ARM target supports ARMv8-M Security Extensions, enabled by the @code{-mcmse} > option. > > +@item arm_cmse_hw > +Test system supports executing CMSE instructions. > + > @item arm_coproc1_ok > @anchor{arm_coproc1_ok} > ARM target supports the following coprocessor instructions: @code{CDP}, > diff --git a/gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c > b/gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c > index cae2f06..5685f74 100644 > --- a/gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c > +++ b/gcc/testsuite/gcc.target/arm/cmse/bitfield-1.c > @@ -1,4 +1,4 @@ > -/* { dg-do run } */ > +/* This test is executed only if the execution engine supports CMSE > instructions. */ > /* { dg-options "--save-temps -mcmse > -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ > > typedef struct > diff --git a/gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c > b/gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c > index 21a53cd..7a794d4 100644 > --- a/gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c > +++ b/gcc/testsuite/gcc.target/arm/cmse/bitfield-2.c > @@ -1,4 +1,4 @@ > -/* { dg-do run } */ > +/* This test is executed only if the execution engine supports CMSE > instructions. */ > /* { dg-options "--save-temps -mcmse > -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ > > typedef struct > diff --git a/gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c > b/gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c > index e8f973e..5875f8df 100644 > --- a/gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c > +++ b/gcc/testsuite/gcc.target/arm/cmse/bitfield-3.c > @@ -1,4 +1,4 @@ > -/* { dg-do run } */ > +/* This test is executed only if the execution engine supports CMSE > instructions. */ > /* { dg-options "--save-temps -mcmse > -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ > > typedef struct > diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c > b/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c > index 3fb0380..6a243d5 100644 > --- a/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c > +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c > @@ -1,4 +1,8 @@ > -/* { dg-do run } */ > +/* This test is executed only if the execution engine supports CMSE > instructions. */ > +/* Note that it "passes" on qemu-arm while it shouldn't because that > simulator > + does not model secure memory: it's better to skip it in this case, and > rely > + on do-what-default as set in cmse.exp. (It works as expected with > + qemu-system-mode). */ > /* { dg-options "-Os -mcmse" } */ > > #include <arm_cmse.h> > diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse.exp > b/gcc/testsuite/gcc.target/arm/cmse/cmse.exp > index 6ce99fe..4da1a46 100644 > --- a/gcc/testsuite/gcc.target/arm/cmse/cmse.exp > +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse.exp > @@ -34,7 +34,12 @@ if ![info exists DEFAULT_CFLAGS] then { > dg-init > > set saved-dg-do-what-default ${dg-do-what-default} > -set dg-do-what-default "assemble" > + > +if {[is-effective-target arm_cmse_hw]} then { > + set dg-do-what-default run > +} else { > + set dg-do-what-default assemble > +} > > set saved-lto_torture_options ${LTO_TORTURE_OPTIONS} > set LTO_TORTURE_OPTIONS "" > diff --git a/gcc/testsuite/gcc.target/arm/cmse/struct-1.c > b/gcc/testsuite/gcc.target/arm/cmse/struct-1.c > index 7555643..75a99f4 100644 > --- a/gcc/testsuite/gcc.target/arm/cmse/struct-1.c > +++ b/gcc/testsuite/gcc.target/arm/cmse/struct-1.c > @@ -1,4 +1,4 @@ > -/* { dg-do run } */ > +/* This test is executed only if the execution engine supports CMSE > instructions. */ > /* { dg-options "--save-temps -mcmse > -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ > > typedef struct > diff --git a/gcc/testsuite/lib/target-supports.exp > b/gcc/testsuite/lib/target-supports.exp > index 1230d19..9b38b41 100644 > --- a/gcc/testsuite/lib/target-supports.exp > +++ b/gcc/testsuite/lib/target-supports.exp > @@ -4861,6 +4861,21 @@ proc check_effective_target_arm_cmse_ok {} { > } "-mcmse"]; > } > > +# Return 1 if the target supports executing CMSE instructions, 0 > +# otherwise. Cache the result. > + > +proc check_effective_target_arm_cmse_hw { } { > + return [check_runtime arm_cmse_hw_available { > + int __attribute__ ((cmse_nonsecure_entry)) ns_func(void) > + { > + return 0; > + } > + int main (void) > + { > + return ns_func(); > + } > + } "-mcmse -Wl,--section-start,.gnu.sgstubs=0x00400000"] > +} > # Return 1 if the target supports executing MVE instructions, 0 > # otherwise.