diff options
-rw-r--r-- | lib/libcompiler_rt/Makefile | 5 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_add_4.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_add_8.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_and_4.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_and_8.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_op_n.h | 9 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_or_4.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_or_8.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_sub_4.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_sub_8.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_xor_4.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_xor_8.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_lock_test_and_set_4.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_lock_test_and_set_8.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_val_compare_and_swap_4.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_val_compare_and_swap_8.c | 2 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_val_compare_and_swap_n.h | 9 |
17 files changed, 34 insertions, 17 deletions
diff --git a/lib/libcompiler_rt/Makefile b/lib/libcompiler_rt/Makefile index 2e869cc..c75ae07 100644 --- a/lib/libcompiler_rt/Makefile +++ b/lib/libcompiler_rt/Makefile @@ -156,9 +156,8 @@ SRCF+= divsi3 \ umodsi3 .endif -# FreeBSD-specific atomic intrinsics. Clang provides them as a builtin. -.if (${MACHINE_CPUARCH} == "arm" && ${COMPILER_TYPE} != "clang") || \ - ${MACHINE_CPUARCH} == "mips" +# FreeBSD-specific atomic intrinsics. +.if ${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "mips" SRCF+= __sync_fetch_and_add_4 \ __sync_fetch_and_and_4 \ __sync_fetch_and_or_4 \ diff --git a/lib/libcompiler_rt/__sync_fetch_and_add_4.c b/lib/libcompiler_rt/__sync_fetch_and_add_4.c index 3c11a3b..6126cfa 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_add_4.c +++ b/lib/libcompiler_rt/__sync_fetch_and_add_4.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_add_4 -#define TYPE uint32_t +#define TYPE int32_t #define FETCHADD(x, y) atomic_fetchadd_32(x, y) #include "__sync_fetch_and_op_n.h" diff --git a/lib/libcompiler_rt/__sync_fetch_and_add_8.c b/lib/libcompiler_rt/__sync_fetch_and_add_8.c index 6157c15..2738d5d 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_add_8.c +++ b/lib/libcompiler_rt/__sync_fetch_and_add_8.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_add_8 -#define TYPE uint64_t +#define TYPE int64_t #define FETCHADD(x, y) atomic_fetchadd_64(x, y) #include "__sync_fetch_and_op_n.h" diff --git a/lib/libcompiler_rt/__sync_fetch_and_and_4.c b/lib/libcompiler_rt/__sync_fetch_and_and_4.c index 1a488ec..49fab80 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_and_4.c +++ b/lib/libcompiler_rt/__sync_fetch_and_and_4.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_and_4 -#define TYPE uint32_t +#define TYPE int32_t #define CMPSET atomic_cmpset_32 #define EXPRESSION t & value diff --git a/lib/libcompiler_rt/__sync_fetch_and_and_8.c b/lib/libcompiler_rt/__sync_fetch_and_and_8.c index 9923e31..f681785 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_and_8.c +++ b/lib/libcompiler_rt/__sync_fetch_and_and_8.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_and_8 -#define TYPE uint64_t +#define TYPE int64_t #define CMPSET atomic_cmpset_64 #define EXPRESSION t & value diff --git a/lib/libcompiler_rt/__sync_fetch_and_op_n.h b/lib/libcompiler_rt/__sync_fetch_and_op_n.h index f7f0e06..994e271 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_op_n.h +++ b/lib/libcompiler_rt/__sync_fetch_and_op_n.h @@ -30,8 +30,13 @@ __FBSDID("$FreeBSD$"); #include <sys/types.h> #include <machine/atomic.h> +#if defined __clang__ +static TYPE +atomic_func(volatile TYPE *ptr, TYPE value, ...) +#else TYPE NAME(volatile TYPE *ptr, TYPE value) +#endif { TYPE t; @@ -45,3 +50,7 @@ NAME(volatile TYPE *ptr, TYPE value) return (t); } + +#ifdef __clang__ +__strong_reference(atomic_func, NAME); +#endif diff --git a/lib/libcompiler_rt/__sync_fetch_and_or_4.c b/lib/libcompiler_rt/__sync_fetch_and_or_4.c index 1feeeb1..879b9ae 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_or_4.c +++ b/lib/libcompiler_rt/__sync_fetch_and_or_4.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_or_4 -#define TYPE uint32_t +#define TYPE int32_t #define CMPSET atomic_cmpset_32 #define EXPRESSION t | value diff --git a/lib/libcompiler_rt/__sync_fetch_and_or_8.c b/lib/libcompiler_rt/__sync_fetch_and_or_8.c index 7cb9403..c88a37b 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_or_8.c +++ b/lib/libcompiler_rt/__sync_fetch_and_or_8.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_or_8 -#define TYPE uint64_t +#define TYPE int64_t #define CMPSET atomic_cmpset_64 #define EXPRESSION t | value diff --git a/lib/libcompiler_rt/__sync_fetch_and_sub_4.c b/lib/libcompiler_rt/__sync_fetch_and_sub_4.c index a251add..e0fe14c 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_sub_4.c +++ b/lib/libcompiler_rt/__sync_fetch_and_sub_4.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_sub_4 -#define TYPE uint32_t +#define TYPE int32_t #define FETCHADD(x, y) atomic_fetchadd_32(x, -(y)) #include "__sync_fetch_and_op_n.h" diff --git a/lib/libcompiler_rt/__sync_fetch_and_sub_8.c b/lib/libcompiler_rt/__sync_fetch_and_sub_8.c index 5a93f97..4f239b3 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_sub_8.c +++ b/lib/libcompiler_rt/__sync_fetch_and_sub_8.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_sub_8 -#define TYPE uint64_t +#define TYPE int64_t #define FETCHADD(x, y) atomic_fetchadd_64(x, -(y)) #include "__sync_fetch_and_op_n.h" diff --git a/lib/libcompiler_rt/__sync_fetch_and_xor_4.c b/lib/libcompiler_rt/__sync_fetch_and_xor_4.c index d5f732d..8a6aec6 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_xor_4.c +++ b/lib/libcompiler_rt/__sync_fetch_and_xor_4.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_xor_4 -#define TYPE uint32_t +#define TYPE int32_t #define CMPSET atomic_cmpset_32 #define EXPRESSION t ^ value diff --git a/lib/libcompiler_rt/__sync_fetch_and_xor_8.c b/lib/libcompiler_rt/__sync_fetch_and_xor_8.c index 610037e..be677f57 100644 --- a/lib/libcompiler_rt/__sync_fetch_and_xor_8.c +++ b/lib/libcompiler_rt/__sync_fetch_and_xor_8.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_fetch_and_xor_8 -#define TYPE uint64_t +#define TYPE int64_t #define CMPSET atomic_cmpset_64 #define EXPRESSION t ^ value diff --git a/lib/libcompiler_rt/__sync_lock_test_and_set_4.c b/lib/libcompiler_rt/__sync_lock_test_and_set_4.c index d4965f9..73d1bab 100644 --- a/lib/libcompiler_rt/__sync_lock_test_and_set_4.c +++ b/lib/libcompiler_rt/__sync_lock_test_and_set_4.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_lock_test_and_set_4 -#define TYPE uint32_t +#define TYPE int32_t #define CMPSET atomic_cmpset_32 #define EXPRESSION value diff --git a/lib/libcompiler_rt/__sync_lock_test_and_set_8.c b/lib/libcompiler_rt/__sync_lock_test_and_set_8.c index 1e02203..83c1a6a 100644 --- a/lib/libcompiler_rt/__sync_lock_test_and_set_8.c +++ b/lib/libcompiler_rt/__sync_lock_test_and_set_8.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_lock_test_and_set_8 -#define TYPE uint64_t +#define TYPE int64_t #define CMPSET atomic_cmpset_64 #define EXPRESSION value diff --git a/lib/libcompiler_rt/__sync_val_compare_and_swap_4.c b/lib/libcompiler_rt/__sync_val_compare_and_swap_4.c index e0ab115..d69b6f5 100644 --- a/lib/libcompiler_rt/__sync_val_compare_and_swap_4.c +++ b/lib/libcompiler_rt/__sync_val_compare_and_swap_4.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_val_compare_and_swap_4 -#define TYPE uint32_t +#define TYPE int32_t #define CMPSET atomic_cmpset_32 #include "__sync_val_compare_and_swap_n.h" diff --git a/lib/libcompiler_rt/__sync_val_compare_and_swap_8.c b/lib/libcompiler_rt/__sync_val_compare_and_swap_8.c index c6f1101..6b7a17d 100644 --- a/lib/libcompiler_rt/__sync_val_compare_and_swap_8.c +++ b/lib/libcompiler_rt/__sync_val_compare_and_swap_8.c @@ -1,6 +1,6 @@ /* $FreeBSD$ */ #define NAME __sync_val_compare_and_swap_8 -#define TYPE uint64_t +#define TYPE int64_t #define CMPSET atomic_cmpset_64 #include "__sync_val_compare_and_swap_n.h" diff --git a/lib/libcompiler_rt/__sync_val_compare_and_swap_n.h b/lib/libcompiler_rt/__sync_val_compare_and_swap_n.h index cd4c9a3..ee9d025 100644 --- a/lib/libcompiler_rt/__sync_val_compare_and_swap_n.h +++ b/lib/libcompiler_rt/__sync_val_compare_and_swap_n.h @@ -30,8 +30,13 @@ __FBSDID("$FreeBSD$"); #include <sys/types.h> #include <machine/atomic.h> +#if defined __clang__ +static TYPE +atomic_func(volatile TYPE *ptr, TYPE oldval, TYPE newval, ...) +#else TYPE NAME(volatile TYPE *ptr, TYPE oldval, TYPE newval) +#endif { TYPE t; @@ -43,3 +48,7 @@ NAME(volatile TYPE *ptr, TYPE oldval, TYPE newval) return (oldval); } + +#ifdef __clang__ +__strong_reference(atomic_func, NAME); +#endif |