git: 7b67d47c70cc - releng/11.4 - MFC r364753: Add atomic and bswap functions to libcompiler_rt

Ed Maste emaste at FreeBSD.org
Fri Jan 29 00:18:48 UTC 2021


The branch releng/11.4 has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=7b67d47c70cca47f65fbbc9d8607b7516c2a82ee

commit 7b67d47c70cca47f65fbbc9d8607b7516c2a82ee
Author:     Dimitry Andric <dim at FreeBSD.org>
AuthorDate: 2020-09-12 16:33:05 +0000
Commit:     Ed Maste <emaste at FreeBSD.org>
CommitDate: 2021-01-29 00:07:08 +0000

    MFC r364753: Add atomic and bswap functions to libcompiler_rt
    
    There have been several mentions on our mailing lists about missing
    atomic functions in our system libraries (e.g. __atomic_load_8 and
    friends), and recently I saw __bswapdi2 and __bswapsi2 mentioned too.
    
    To address this, add implementations for the functions from compiler-rt
    to the system compiler support libraries, e.g. libcompiler_rt.a and and
    libgcc_s.so.
    
    This also needs a small fixup in compiler-rt's atomic.c, to ensure that
    32-bit mips can build correctly.
    
    Bump __FreeBSD_version to make it easier for port maintainers to detect
    when these functions were added.
    
    Differential Revision: https://reviews.freebsd.org/D26159
    
    MFC r364782:
    
    After r364753, there should be no need to suppress -Watomic-alignment
    warnings anymore for compiler-rt's atomic.c. This occurred because the
    IS_LOCK_FREE_8 macro was not correctly defined to 0 for mips, and this
    caused the compiler to emit a runtime call to __atomic_is_lock_free(),
    and that triggers the warning.
    
    MFC r365509:
    
    Follow-up r364753 by enabling compiler-rt's atomic implementation only
    for clang, as it uses clang specific builtins, and does not compile
    correctly with gcc. Note that gcc packages usually come with their own
    libatomic, providing these primitives.
    
    MFC r365588:
    
    Follow-up r364753 by only using arm's stdatomic.c implementation, as it
    already covers the functions in compiler-rt's atomic.c, leading to
    conflicts when linking.
    
    PR:             230888
    (cherry picked from commit 7c73d99e6cf7b69630856acac4a2ab82f5c9f218)
    
    Approved by:    so
---
 .../llvm-project/compiler-rt/lib/builtins/atomic.c |  4 ++--
 lib/libcompiler_rt/Makefile.inc                    | 25 +++++++++-------------
 2 files changed, 12 insertions(+), 17 deletions(-)

diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/atomic.c b/contrib/llvm-project/compiler-rt/lib/builtins/atomic.c
index ee790235cb8f..4573a547eb67 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/atomic.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/atomic.c
@@ -124,8 +124,8 @@ static __inline Lock *lock_for_pointer(void *ptr) {
 #define IS_LOCK_FREE_2 __c11_atomic_is_lock_free(2)
 #define IS_LOCK_FREE_4 __c11_atomic_is_lock_free(4)
 
-/// 32 bit PowerPC doesn't support 8-byte lock_free atomics
-#if !defined(__powerpc64__) && defined(__powerpc__)
+/// 32 bit MIPS and PowerPC don't support 8-byte lock_free atomics
+#if defined(__mips__) || (!defined(__powerpc64__) && defined(__powerpc__))
 #define IS_LOCK_FREE_8 0
 #else
 #define IS_LOCK_FREE_8 __c11_atomic_is_lock_free(8)
diff --git a/lib/libcompiler_rt/Makefile.inc b/lib/libcompiler_rt/Makefile.inc
index 9f7d9a26549a..192114df1468 100644
--- a/lib/libcompiler_rt/Makefile.inc
+++ b/lib/libcompiler_rt/Makefile.inc
@@ -18,6 +18,8 @@ SRCF+=		ashldi3
 SRCF+=		ashlti3
 SRCF+=		ashrdi3
 SRCF+=		ashrti3
+SRCF+=		bswapdi2
+SRCF+=		bswapsi2
 SRCF+=		clear_cache
 SRCF+=		clzdi2
 SRCF+=		clzsi2
@@ -117,6 +119,14 @@ SRCF+=		udivti3
 SRCF+=		umoddi3
 SRCF+=		umodti3
 
+# Enable compiler-rt's atomic implementation only for clang, as it uses clang
+# specific builtins, and gcc packages usually come with their own libatomic.
+# Exclude arm which has its own implementations of atomic functions, below.
+.if "${COMPILER_TYPE}" == "clang" && \
+    !(${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "armv6")
+SRCF+=		atomic
+.endif
+
 # Avoid using SSE2 instructions on i386, if unsupported.
 .if ${MACHINE_CPUARCH} == "i386" && empty(MACHINE_CPU:Msse2)
 SRCS+=		floatdidf.c
@@ -215,12 +225,6 @@ CFLAGS+=	-DEMIT_SYNC_ATOMICS
 SRCF+=		stdatomic
 .endif
 
-.if "${COMPILER_TYPE}" == "clang" && \
-    (${MACHINE_ARCH} == "powerpc" || ${MACHINE_ARCH} == "powerpcspe")
-SRCS+=          atomic.c
-CFLAGS.atomic.c+=      -Wno-atomic-alignment
-.endif
-
 .for file in ${SRCF}
 .if ${MACHINE_ARCH:Marmv6*} && (!defined(CPUTYPE) || ${CPUTYPE:M*soft*} == "") \
     && exists(${CRTSRC}/${CRTARCH}/${file}vfp.S)
@@ -242,18 +246,9 @@ SRCS+=		aeabi_memmove.S
 SRCS+=		aeabi_memset.S
 SRCS+=		aeabi_uidivmod.S
 SRCS+=		aeabi_uldivmod.S
-SRCS+=		bswapdi2.S
-SRCS+=		bswapsi2.S
 SRCS+=		switch16.S
 SRCS+=		switch32.S
 SRCS+=		switch8.S
 SRCS+=		switchu8.S
 SRCS+=		sync_synchronize.S
 .endif
-
-# GCC-6.3 on mips32 requires bswap32 built-in.
-.if ${MACHINE_CPUARCH} == "mips"
-SRCS+=		bswapdi2.c
-SRCS+=		bswapsi2.c
-.endif
-


More information about the dev-commits-src-all mailing list