diff options
| author | Ed Schouten <ed@FreeBSD.org> | 2013-04-27 04:56:02 +0000 |
|---|---|---|
| committer | Ed Schouten <ed@FreeBSD.org> | 2013-04-27 04:56:02 +0000 |
| commit | 0315980bb88b04abea42c346f1af558b89d1e29d (patch) | |
| tree | 4b862626af7bfbb06d0c17477809c39c52c3c91c | |
| parent | ec8025b5e25e92f69747eb0eaa58452aa9d3d843 (diff) | |
Notes
| -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 2e869ccd19d9a..c75ae07d26cde 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 3c11a3b87dd14..6126cfa822d1f 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 6157c151767ad..2738d5dd82e9a 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 1a488ec278878..49fab808a796d 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 9923e31158bdf..f681785b64aed 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 f7f0e06e83a01..994e271ed0883 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 1feeeb17a1d67..879b9aece7137 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 7cb9403bed173..c88a37b7f20cd 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 a251adde54f07..e0fe14c0ad54b 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 5a93f977ec89d..4f239b3e9209a 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 d5f732d65f6ba..8a6aec67be9d8 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 610037ef28bcc..be677f5794c5e 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 d4965f96484f6..73d1bab83f8c6 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 1e02203d2be57..83c1a6acc6a82 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 e0ab11515efd1..d69b6f5052912 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 c6f1101a72c0c..6b7a17d5b3c35 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 cd4c9a3d16634..ee9d025783974 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 |
