Message ID | VI1PR0802MB2368F8720A257B1A398AB0F49B349@VI1PR0802MB2368.eurprd08.prod.outlook.com |
---|---|
State | New |
Headers | show |
Series | arm: Fix the mve multilib for the broken cmse support (pr99939). | expand |
On 11/06/2021 14:02, Srinath Parvathaneni via Gcc-patches wrote: > Hi Richard, > > I have addressed all your review comments in https://gcc.gnu.org/pipermail/gcc-patches/2021-June/571739.html > in the following patch. > > The current CMSE support in the multilib build for "-march=armv8.1-m.main+mve -mfloat-abi=hard -mfpu=auto" > is broken as specified in PR99939 and this patch fixes the issue. > > Regression tested on arm-none-eabi and found no regressions. > > Ok for master? and Ok for GCC-10 branch? > > Regards, > Srinath. > > gcc/testsuite/ChangeLog: > > 2021-06-11 Srinath Parvathaneni <srinath.parvathaneni@arm.com> > > PR target/99939 > * gcc.target/arm/cmse/cmse-18.c: Add separate scan-assembler > directives check for target is v8.1-m.main+mve or not before > comparing the assembly output. > * gcc.target/arm/cmse/cmse-20.c: New test. > > libgcc/ChangeLog: > > 2021-06-11 Srinath Parvathaneni <srinath.parvathaneni@arm.com> > > PR target/99939 > * config/arm/cmse_nonsecure_call.S: Add __ARM_FEATURE_MVE > macro. > * config/arm/t-arm: To link cmse.o and cmse_nonsecure_call.o > on passing -mcmse option. > > OK. R. > > ############### Attachment also inlined for ease of reply ############### > > > diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-18.c b/gcc/testsuite/gcc.target/arm/cmse/cmse-18.c > index e1ff09257b7900982f49117d4cfc16f3bd79d76c..db7d975a90ea4b3333d1810aea03949ec1e8837e 100644 > --- a/gcc/testsuite/gcc.target/arm/cmse/cmse-18.c > +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-18.c > @@ -8,4 +8,5 @@ void bar(f func, int a) > func(a); > } > > -/* { dg-final { scan-rtl-dump "call unspec\\\[\\\[r4:SI\\\]\\\]" "final" } } */ > +/* { dg-final { scan-rtl-dump "call unspec\\\[\\\[r4:SI\\\]\\\]" "final" { target { ! arm_v8_1m_mve_ok } } } } */ > +/* { dg-final { scan-rtl-dump "call unspec\\\[\\\[r\[0-7\]:SI\\\]\\\]" "final" { target { arm_v8_1m_mve_ok } } } } */ > diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c b/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c > new file mode 100644 > index 0000000000000000000000000000000000000000..08e89bff6378f1f96950fc40f3ab3946bd433773 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c > @@ -0,0 +1,28 @@ > +/* This test is executed only if the execution engine supports CMSE instructions. */ > +/* { dg-options "--save-temps -mcmse -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ > + > +#include <arm_cmse.h> > +#include <stdlib.h> > +#include <stdio.h> > + > +void __attribute__((cmse_nonsecure_entry)) > +secure_fun (int a, int *p) > +{ > + void *b = cmse_check_address_range ((void *)p, a, 1); > + > + if (b == NULL) > + __builtin_abort (); > + printf("%d", *((int *)b)); > +} > + > +int > +main (void) > +{ > + int *ptr; > + int size = 1; > + ptr = (int *) calloc (1, sizeof(int *)); > + *ptr = 1315852292; > + secure_fun (size, ptr); > + free (ptr); > + return 0; > +} > diff --git a/libgcc/config/arm/cmse_nonsecure_call.S b/libgcc/config/arm/cmse_nonsecure_call.S > index 146f3ed52e9c7e915e5dbd9b70624ec3bd7cd5b5..00830ade98ea650c328c709d5d308fbc96f7f21c 100644 > --- a/libgcc/config/arm/cmse_nonsecure_call.S > +++ b/libgcc/config/arm/cmse_nonsecure_call.S > @@ -25,7 +25,7 @@ > > .syntax unified > #ifdef __ARM_PCS_VFP > -# if __ARM_FP & 0x8 > +# if (__ARM_FP & 0x8) || (__ARM_FEATURE_MVE & 1) > .fpu fpv5-d16 > # else > .fpu fpv4-sp-d16 > @@ -59,7 +59,7 @@ vmov s24, s25, r5, r5 > vmov s26, s27, r5, r5 > vmov s28, s29, r5, r5 > vmov s30, s31, r5, r5 > -#elif __ARM_FP & 0x08 > +#elif (__ARM_FP & 0x8) || (__ARM_FEATURE_MVE & 1) > vmov.f64 d9, d8 > vmov.f64 d10, d8 > vmov.f64 d11, d8 > diff --git a/libgcc/config/arm/t-arm b/libgcc/config/arm/t-arm > index 3625a2590beec4e4e0e0881be9ad284c595c7190..c1553d4e5d80751b13dc2e9c9e36d5ebe82e5f8c 100644 > --- a/libgcc/config/arm/t-arm > +++ b/libgcc/config/arm/t-arm > @@ -3,18 +3,17 @@ LIB1ASMFUNCS = _thumb1_case_sqi _thumb1_case_uqi _thumb1_case_shi \ > _thumb1_case_uhi _thumb1_case_si _speculation_barrier > > HAVE_CMSE:=$(findstring __ARM_FEATURE_CMSE,$(shell $(gcc_compile_bare) -dM -E - </dev/null)) > -HAVE_V81M:=$(findstring armv8.1-m.main,$(gcc_compile_bare)) > ifeq ($(shell $(gcc_compile_bare) -E -mcmse - </dev/null >/dev/null 2>/dev/null; echo $$?),0) > CMSE_OPTS:=-mcmse > endif > > ifdef HAVE_CMSE > -ifndef HAVE_V81M > + > libgcc-objects += cmse.o cmse_nonsecure_call.o > > cmse.o: $(srcdir)/config/arm/cmse.c > $(gcc_compile) -c $(CMSE_OPTS) $< > + > cmse_nonsecure_call.o: $(srcdir)/config/arm/cmse_nonsecure_call.S > $(gcc_compile) -c $< > endif > -endif >
diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-18.c b/gcc/testsuite/gcc.target/arm/cmse/cmse-18.c index e1ff09257b7900982f49117d4cfc16f3bd79d76c..db7d975a90ea4b3333d1810aea03949ec1e8837e 100644 --- a/gcc/testsuite/gcc.target/arm/cmse/cmse-18.c +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-18.c @@ -8,4 +8,5 @@ void bar(f func, int a) func(a); } -/* { dg-final { scan-rtl-dump "call unspec\\\[\\\[r4:SI\\\]\\\]" "final" } } */ +/* { dg-final { scan-rtl-dump "call unspec\\\[\\\[r4:SI\\\]\\\]" "final" { target { ! arm_v8_1m_mve_ok } } } } */ +/* { dg-final { scan-rtl-dump "call unspec\\\[\\\[r\[0-7\]:SI\\\]\\\]" "final" { target { arm_v8_1m_mve_ok } } } } */ diff --git a/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c b/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c new file mode 100644 index 0000000000000000000000000000000000000000..08e89bff6378f1f96950fc40f3ab3946bd433773 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/cmse/cmse-20.c @@ -0,0 +1,28 @@ +/* This test is executed only if the execution engine supports CMSE instructions. */ +/* { dg-options "--save-temps -mcmse -Wl,--section-start,.gnu.sgstubs=0x00400000" } */ + +#include <arm_cmse.h> +#include <stdlib.h> +#include <stdio.h> + +void __attribute__((cmse_nonsecure_entry)) +secure_fun (int a, int *p) +{ + void *b = cmse_check_address_range ((void *)p, a, 1); + + if (b == NULL) + __builtin_abort (); + printf("%d", *((int *)b)); +} + +int +main (void) +{ + int *ptr; + int size = 1; + ptr = (int *) calloc (1, sizeof(int *)); + *ptr = 1315852292; + secure_fun (size, ptr); + free (ptr); + return 0; +} diff --git a/libgcc/config/arm/cmse_nonsecure_call.S b/libgcc/config/arm/cmse_nonsecure_call.S index 146f3ed52e9c7e915e5dbd9b70624ec3bd7cd5b5..00830ade98ea650c328c709d5d308fbc96f7f21c 100644 --- a/libgcc/config/arm/cmse_nonsecure_call.S +++ b/libgcc/config/arm/cmse_nonsecure_call.S @@ -25,7 +25,7 @@ .syntax unified #ifdef __ARM_PCS_VFP -# if __ARM_FP & 0x8 +# if (__ARM_FP & 0x8) || (__ARM_FEATURE_MVE & 1) .fpu fpv5-d16 # else .fpu fpv4-sp-d16 @@ -59,7 +59,7 @@ vmov s24, s25, r5, r5 vmov s26, s27, r5, r5 vmov s28, s29, r5, r5 vmov s30, s31, r5, r5 -#elif __ARM_FP & 0x08 +#elif (__ARM_FP & 0x8) || (__ARM_FEATURE_MVE & 1) vmov.f64 d9, d8 vmov.f64 d10, d8 vmov.f64 d11, d8 diff --git a/libgcc/config/arm/t-arm b/libgcc/config/arm/t-arm index 3625a2590beec4e4e0e0881be9ad284c595c7190..c1553d4e5d80751b13dc2e9c9e36d5ebe82e5f8c 100644 --- a/libgcc/config/arm/t-arm +++ b/libgcc/config/arm/t-arm @@ -3,18 +3,17 @@ LIB1ASMFUNCS = _thumb1_case_sqi _thumb1_case_uqi _thumb1_case_shi \ _thumb1_case_uhi _thumb1_case_si _speculation_barrier HAVE_CMSE:=$(findstring __ARM_FEATURE_CMSE,$(shell $(gcc_compile_bare) -dM -E - </dev/null)) -HAVE_V81M:=$(findstring armv8.1-m.main,$(gcc_compile_bare)) ifeq ($(shell $(gcc_compile_bare) -E -mcmse - </dev/null >/dev/null 2>/dev/null; echo $$?),0) CMSE_OPTS:=-mcmse endif ifdef HAVE_CMSE -ifndef HAVE_V81M + libgcc-objects += cmse.o cmse_nonsecure_call.o cmse.o: $(srcdir)/config/arm/cmse.c $(gcc_compile) -c $(CMSE_OPTS) $< + cmse_nonsecure_call.o: $(srcdir)/config/arm/cmse_nonsecure_call.S $(gcc_compile) -c $< endif -endif