summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Schouten <ed@FreeBSD.org>2013-04-27 04:56:02 +0000
committerEd Schouten <ed@FreeBSD.org>2013-04-27 04:56:02 +0000
commit0315980bb88b04abea42c346f1af558b89d1e29d (patch)
tree4b862626af7bfbb06d0c17477809c39c52c3c91c
parentec8025b5e25e92f69747eb0eaa58452aa9d3d843 (diff)
Notes
-rw-r--r--lib/libcompiler_rt/Makefile5
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_add_4.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_add_8.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_and_4.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_and_8.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_op_n.h9
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_or_4.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_or_8.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_sub_4.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_sub_8.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_xor_4.c2
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_xor_8.c2
-rw-r--r--lib/libcompiler_rt/__sync_lock_test_and_set_4.c2
-rw-r--r--lib/libcompiler_rt/__sync_lock_test_and_set_8.c2
-rw-r--r--lib/libcompiler_rt/__sync_val_compare_and_swap_4.c2
-rw-r--r--lib/libcompiler_rt/__sync_val_compare_and_swap_8.c2
-rw-r--r--lib/libcompiler_rt/__sync_val_compare_and_swap_n.h9
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