On Mon, 26 Apr 2021 at 10:55, Richard Sandiford
<richard.sandif...@arm.com> wrote:
>
> 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.

Yeah, it did change that address in commit
b61184875ec454875b5a47f3bfa94a6d45f5b845,
but it was already hardcoded before.
(see https://gcc.gnu.org/pipermail/gcc-patches/2019-July/525063.html)

Thanks,

Christophe

>
> 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.

Reply via email to