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
This commit is contained in:
Michal Meloun 2025-02-22 19:35:27 +01:00
parent 9ee759f367
commit 50fda38ba0
5 changed files with 84 additions and 52 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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;