[GCC-10 backport][PATCH] arm: Fix the mve multilib for the broken cmse support (pr99939).
Richard Earnshaw
Richard.Earnshaw@foss.arm.com
Fri Jun 18 12:18:24 GMT 2021
On 14/06/2021 11:34, Srinath Parvathaneni via Gcc-patches wrote:
> Hi,
>
> 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.
>
> This patch have cleanly applied, ok for the 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.
>
> (cherry picked from commit c5ed0148347beea1bd34795de146adddd2454c36)
>
>
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 5ba28692d6b8a919939404d0f0d97d490df472e9..b1954b8714d6badc7311992847492c8c123799e0 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
>
More information about the Gcc-patches
mailing list