Re: [PATCH] libc: arm: Implement setjmp GCC backwards compatibility.

Richard Earnshaw <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>

On 01/02/2023 15:10, Victor L. Do Nascimento wrote:
> When compiling Newlib for arm targets with GCC 12.1 onward, the passing
> of architecture extension information to the assembler is automatic,
> making the use of `.fpu' directives instructions in assembly files
> redundant.
> 
> With older versions of GCC, however, the .fpu directive must be
> hard-coded into the arm/setjmp.S file to allow the assembly of
> instructions concerning the storage and subsequent reloading of the
> floating point registers to/from the jump buffer, respectively.
> 
> This patch conditionally adds the `.fpu vfpxd' directive based on
> compile-time preprocessor macros concerning GCC version and target
> architectural features, such that both the assembly and linking of
> setjmp.S succeeds for older versions of Newlib.
> ---
>   newlib/libc/machine/arm/setjmp.S | 16 ++++++++++++++++
>   1 file changed, 16 insertions(+)
> 
> diff --git a/newlib/libc/machine/arm/setjmp.S b/newlib/libc/machine/arm/setjmp.S
> index c615f2428..3a9aa840d 100644
> --- a/newlib/libc/machine/arm/setjmp.S
> +++ b/newlib/libc/machine/arm/setjmp.S
> @@ -64,6 +64,22 @@
>   
>   	.syntax unified
>   
> +/*  GCC 12.1 and later will tell the assembler exactly which floating
> +    point (or MVE) unit is required and we don't want to override
> +    that.  Conversely, older versions of the compiler don't pass this
> +    information so we need to enable the VFP version that is most
> +    appropriate.  The choice here should support all suitable VFP
> +    versions that the older toolchains can handle.  */
> +#if __GNUC__ && __GNUC__ < 12
> +/*  While GCC > 10.1 supports MVE, the MVE instructions do not need an
> +    .fpu directive, so we don't need to handle that case.  VFPxd thus
> +    covers all the cases we need in this file and should be compatible
> +    with all required FPUs that we need to support.  */
> +# if __ARM_FP
> +	.fpu vfpxd
> +# endif
> +#endif
> +
>   #if __ARM_ARCH_ISA_THUMB == 1 && !__ARM_ARCH_ISA_ARM
>   /* ARMv6-M-like has to be implemented in Thumb mode.  */
>   

Since MVE is available in GCC-10 onwards, I don't think that's quite 
enough.  Compiling with -march=armv8.1-m.main+mve still needs the 
extension register set preserving during setjmp, but this will not cause 
__ARM_FP to be defined.

So I think we need something like

# if __ARM_FP
	.fpu vfpxd
# endif
# if __ARM_FEATURE_MVE
	.arch_extension mve
# endif

This should ensure that not only the files assemble correctly but they 
have suitable build attributes as well (otherwise we might get problems 
at link time if integer-only MVE code is linked with code claiming that 
full VFP is needed).

R.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.