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

"Victor L. Do Nascimento" <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
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.  */
 
-- 
2.36.1
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.