git: 50fda38ba0b0 - main - libgcc_s: export integer and floating point __aeabi_ symbols

From: Michal Meloun <mmel_at_FreeBSD.org>
Date: Sun, 04 May 2025 17:09:29 UTC
The branch main has been updated by mmel:

URL: https://cgit.FreeBSD.org/src/commit/?id=50fda38ba0b0a783ccf1375fb889eee5476f4b1a

commit 50fda38ba0b0a783ccf1375fb889eee5476f4b1a
Author:     Michal Meloun <mmel@FreeBSD.org>
AuthorDate: 2025-02-22 18:35:27 +0000
Commit:     Michal Meloun <mmel@FreeBSD.org>
CommitDate: 2025-05-04 11:48:32 +0000

    libgcc_s: export integer and floating point __aeabi_ symbols
    
    Export all integer and floating point __aeabi_ functions defined by
    "Run-time ABI for Arm Architecture" from libgcc, excluding __aeabi_h2f_alt,
    __aeabi_f2h_alt and __aeabi_d2h_alt, which are not yet implemented by
    compiler-rt.
    
    To maintain ABI backward compatibility, convert __aeabi_ floating-point
    symbols previously exported from libc to an explicit non-default version.
    
    Remove guessing of vfp/not-vfp version  for compiler-rt sources. The vfp
    version needs additional runtime logic to select the right implementation
    and we don't have it implemented.
    
    MFC after:      1 month
    Reviewed by:    dim
    PR:             271087
    Differential Revision:  https://reviews.freebsd.org/D50100
---
 lib/libc/arm/aeabi/Symbol.map      | 44 ------------------------
 lib/libc/arm/aeabi/aeabi_int_div.S |  2 ++
 lib/libc/arm/aeabi/aeabi_vfp.h     |  4 ++-
 lib/libcompiler_rt/Makefile.inc    | 18 ++++++----
 lib/libgcc_s/arm/Symbol.map        | 68 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 84 insertions(+), 52 deletions(-)

diff --git a/lib/libc/arm/aeabi/Symbol.map b/lib/libc/arm/aeabi/Symbol.map
index 175884c82881..515794004ba7 100644
--- a/lib/libc/arm/aeabi/Symbol.map
+++ b/lib/libc/arm/aeabi/Symbol.map
@@ -6,50 +6,6 @@
 FBSDprivate_1.0 {
 	__aeabi_atexit;
 
-	__aeabi_dcmpeq;
-	__aeabi_dcmplt;
-	__aeabi_dcmple;
-	__aeabi_dcmpge;
-	__aeabi_dcmpgt;
-	__aeabi_dcmpun;
-
-	__aeabi_cdcmpeq;
-	__aeabi_cdcmple;
-	__aeabi_cdrcmple;
-
-	__aeabi_d2iz;
-	__aeabi_d2f;
-
-	__aeabi_dadd;
-	__aeabi_ddiv;
-	__aeabi_dmul;
-	__aeabi_dsub;
-
-
-	__aeabi_fcmpeq;
-	__aeabi_fcmplt;
-	__aeabi_fcmple;
-	__aeabi_fcmpge;
-	__aeabi_fcmpgt;
-	__aeabi_fcmpun;
-
-	__aeabi_cfcmpeq;
-	__aeabi_cfcmple;
-	__aeabi_cfrcmple;
-
-	__aeabi_f2iz;
-	__aeabi_f2d;
-
-	__aeabi_fadd;
-	__aeabi_fdiv;
-	__aeabi_fmul;
-	__aeabi_fsub;
-
-
-	__aeabi_i2d;
-	__aeabi_i2f;
-
-
 	__aeabi_memclr;
 	__aeabi_memclr4;
 	__aeabi_memclr8;
diff --git a/lib/libc/arm/aeabi/aeabi_int_div.S b/lib/libc/arm/aeabi/aeabi_int_div.S
index 708b478b3881..bb002c2716f7 100644
--- a/lib/libc/arm/aeabi/aeabi_int_div.S
+++ b/lib/libc/arm/aeabi/aeabi_int_div.S
@@ -37,11 +37,13 @@
  */
 
 ENTRY(__aeabi_uidiv_compat)
+	.hidden __aeabi_uidiv_compat
 	.symver __aeabi_uidiv_compat, __aeabi_uidiv@
 	b __udivsi3
 END(__aeabi_uidiv_compat)
 
 ENTRY(__aeabi_idiv_compat)
+	.hidden __aeabi_idiv_compat
 	.symver __aeabi_idiv_compat, __aeabi_idiv@
 	b __divsi3
 END(__aeabi_idiv_compat)
diff --git a/lib/libc/arm/aeabi/aeabi_vfp.h b/lib/libc/arm/aeabi/aeabi_vfp.h
index 3b70fe06fab3..4f3bb2ef969b 100644
--- a/lib/libc/arm/aeabi/aeabi_vfp.h
+++ b/lib/libc/arm/aeabi/aeabi_vfp.h
@@ -40,7 +40,9 @@
 #define	AEABI_ENTRY(x)	ENTRY(__aeabi_ ## x ## _vfp)
 #define	AEABI_END(x)	END(__aeabi_ ## x ## _vfp)
 #else
-#define	AEABI_ENTRY(x)	ENTRY(__aeabi_ ## x)
+#define	AEABI_ENTRY(x)						\
+	ENTRY(__aeabi_ ## x)					\
+	.symver __aeabi_##x, __aeabi_##x##@FBSDprivate_1.0;
 #define	AEABI_END(x)	END(__aeabi_ ## x)
 #endif
 
diff --git a/lib/libcompiler_rt/Makefile.inc b/lib/libcompiler_rt/Makefile.inc
index e2a2618232e1..57cfdee95541 100644
--- a/lib/libcompiler_rt/Makefile.inc
+++ b/lib/libcompiler_rt/Makefile.inc
@@ -208,7 +208,7 @@ SRCF+=		trunctfsf2
 .endif
 
 # These are already shipped by libc.a on some architectures.
-.if ${MACHINE_CPUARCH} != "arm" && ${MACHINE_CPUARCH} != "riscv"
+.if ${MACHINE_CPUARCH} != "riscv"
 SRCF+=		adddf3
 SRCF+=		addsf3
 SRCF+=		divdf3
@@ -225,10 +225,8 @@ SRCF+=		subsf3
 SRCF+=		truncdfsf2
 .endif
 
-.if ${MACHINE_CPUARCH} != "arm"
 SRCF+=		comparedf2
 SRCF+=		comparesf2
-.endif
 
 # Helper to reduce complexity of _Float16 and __bf16 statements below.
 .if ${MACHINE_CPUARCH} == "aarch64" || \
@@ -274,10 +272,7 @@ CFLAGS+=	-DEMIT_SYNC_ATOMICS
 .endif
 
 .for file in ${SRCF}
-.if ${MACHINE_CPUARCH} == "arm" && (!defined(CPUTYPE) || ${CPUTYPE:M*soft*} == "") \
-    && exists(${CRTSRC}/${CRTARCH}/${file}vfp.S)
-SRCS+=		${file}vfp.S
-. elif exists(${CRTSRC}/${CRTARCH}/${file}.S)
+. if exists(${CRTSRC}/${CRTARCH}/${file}.S)
 SRCS+=		${file}.S
 . else
 SRCS+=		${file}.c
@@ -285,7 +280,15 @@ SRCS+=		${file}.c
 .endfor
 
 .if ${MACHINE_CPUARCH} == "arm"
+SRCS+=		aeabi_cdcmp.S
+SRCS+=		aeabi_cdcmpeq_check_nan.c
+SRCS+=		aeabi_cfcmp.S
+SRCS+=		aeabi_cfcmpeq_check_nan.c
+SRCS+=		aeabi_dcmp.S
 SRCS+=		aeabi_div0.c
+SRCS+=		aeabi_drsub.c
+SRCS+=		aeabi_fcmp.S
+SRCS+=		aeabi_frsub.c
 SRCS+=		aeabi_idivmod.S
 SRCS+=		aeabi_ldivmod.S
 SRCS+=		aeabi_memcmp.S
@@ -294,6 +297,7 @@ SRCS+=		aeabi_memmove.S
 SRCS+=		aeabi_memset.S
 SRCS+=		aeabi_uidivmod.S
 SRCS+=		aeabi_uldivmod.S
+
 SRCS+=		switch16.S
 SRCS+=		switch32.S
 SRCS+=		switch8.S
diff --git a/lib/libgcc_s/arm/Symbol.map b/lib/libgcc_s/arm/Symbol.map
index 92b54761d810..ea0189eabaa0 100644
--- a/lib/libgcc_s/arm/Symbol.map
+++ b/lib/libgcc_s/arm/Symbol.map
@@ -2,6 +2,74 @@
  */
 
 GCC_3.5 {
+	__aeabi_cdcmple;
+	__aeabi_cdrcmple;
+	__aeabi_cfcmpeq;
+	__aeabi_cfcmple;
+	__aeabi_cfrcmple;
+	__aeabi_d2f;
+	__aeabi_d2h;
+/*	__aeabi_d2h_alt; */
+	__aeabi_d2iz;
+	__aeabi_d2lz;
+	__aeabi_d2uiz;
+	__aeabi_d2ulz;
+	__aeabi_dadd;
+	__aeabi_dcmpeq;
+	__aeabi_dcmpge;
+	__aeabi_dcmpgt;
+	__aeabi_dcmple;
+	__aeabi_dcmplt;
+	__aeabi_dcmpun;
+	__aeabi_ddiv;
+	__aeabi_dmul;
+	__aeabi_dneg;
+	__aeabi_drsub;
+	__aeabi_dsub;
+	__aeabi_f2d;
+	__aeabi_f2h;
+/*	__aeabi_f2h_alt; */
+	__aeabi_f2iz;
+	__aeabi_f2lz;
+	__aeabi_f2uiz;
+	__aeabi_f2ulz;
+	__aeabi_fadd;
+	__aeabi_fcmpeq;
+	__aeabi_fcmpge;
+	__aeabi_fcmpgt;
+	__aeabi_fcmple;
+	__aeabi_fcmplt;
+	__aeabi_fcmpun;
+	__aeabi_fdiv;
+	__aeabi_fmul;
+	__aeabi_fneg;
+	__aeabi_frsub;
+	__aeabi_fsub;
+	__aeabi_h2f;
+/*	__aeabi_h2f_alt; */
+	__aeabi_i2d;
+	__aeabi_i2f;
+	__aeabi_idiv;
+	__aeabi_idiv0;
+	__aeabi_idivmod;
+	__aeabi_l2d;
+	__aeabi_l2f;
+	__aeabi_lasr;
+	__aeabi_lcmp;
+	__aeabi_ldiv0;
+	__aeabi_ldivmod;
+	__aeabi_llsl;
+	__aeabi_llsr;
+	__aeabi_lmul;
+	__aeabi_ui2d;
+	__aeabi_ui2f;
+	__aeabi_uidiv;
+	__aeabi_uidivmod;
+	__aeabi_ul2d;
+	__aeabi_ul2f;
+	__aeabi_ulcmp;
+	__aeabi_uldivmod;
+
 	_Unwind_Complete;
 	_Unwind_VRS_Get;
 	_Unwind_VRS_Set;