summaryrefslogtreecommitdiffstats
path: root/lib/libcompiler_rt
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libcompiler_rt')
-rw-r--r--lib/libcompiler_rt/Makefile195
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_add_4.c6
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_add_8.c6
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_and_4.c7
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_and_8.c7
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_op_n.h47
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_or_4.c7
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_or_8.c7
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_sub_4.c6
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_sub_8.c6
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_xor_4.c7
-rw-r--r--lib/libcompiler_rt/__sync_fetch_and_xor_8.c7
-rw-r--r--lib/libcompiler_rt/__sync_lock_test_and_set_4.c7
-rw-r--r--lib/libcompiler_rt/__sync_lock_test_and_set_8.c7
-rw-r--r--lib/libcompiler_rt/__sync_val_compare_and_swap_4.c6
-rw-r--r--lib/libcompiler_rt/__sync_val_compare_and_swap_8.c6
-rw-r--r--lib/libcompiler_rt/__sync_val_compare_and_swap_n.h45
17 files changed, 379 insertions, 0 deletions
diff --git a/lib/libcompiler_rt/Makefile b/lib/libcompiler_rt/Makefile
new file mode 100644
index 0000000..ff9daad
--- /dev/null
+++ b/lib/libcompiler_rt/Makefile
@@ -0,0 +1,195 @@
+# $FreeBSD$
+
+.include <bsd.own.mk>
+
+LIB= compiler_rt
+NO_PIC=
+WARNS?= 2
+
+CFLAGS+=${PICFLAG} -fvisibility=hidden -DVISIBILITY_HIDDEN
+
+.if ${MACHINE_CPUARCH} == "amd64"
+CRTARCH=x86_64
+.else
+CRTARCH=${MACHINE_CPUARCH}
+.endif
+
+CRTSRC=${.CURDIR}/../../contrib/compiler-rt/lib
+
+.PATH: ${CRTSRC}/${CRTARCH} ${CRTSRC}
+
+SRCF= absvdi2 \
+ absvsi2 \
+ absvti2 \
+ addvdi3 \
+ addvsi3 \
+ addvti3 \
+ ashldi3 \
+ ashlti3 \
+ ashrdi3 \
+ ashrti3 \
+ clear_cache \
+ clzdi2 \
+ clzsi2 \
+ clzti2 \
+ cmpdi2 \
+ cmpti2 \
+ comparedf2 \
+ comparesf2 \
+ ctzdi2 \
+ ctzsi2 \
+ ctzti2 \
+ divdc3 \
+ divdi3 \
+ divmoddi4 \
+ divmodsi4 \
+ divsc3 \
+ divti3 \
+ divxc3 \
+ enable_execute_stack \
+ eprintf \
+ ffsdi2 \
+ ffsti2 \
+ fixdfdi \
+ fixdfti \
+ fixsfdi \
+ fixsfti \
+ fixunsdfdi \
+ fixunsdfsi \
+ fixunsdfti \
+ fixunssfdi \
+ fixunssfsi \
+ fixunssfti \
+ fixunsxfdi \
+ fixunsxfsi \
+ fixunsxfti \
+ fixxfdi \
+ fixxfti \
+ floatdidf \
+ floatdisf \
+ floatdixf \
+ floattidf \
+ floattisf \
+ floattixf \
+ floatundidf \
+ floatundisf \
+ floatundixf \
+ floatunsidf \
+ floatunsisf \
+ floatuntidf \
+ floatuntisf \
+ floatuntixf \
+ int_util \
+ lshrdi3 \
+ lshrti3 \
+ moddi3 \
+ modti3 \
+ muldc3 \
+ muldi3 \
+ mulodi4 \
+ mulosi4 \
+ muloti4 \
+ mulsc3 \
+ multi3 \
+ mulvdi3 \
+ mulvsi3 \
+ mulvti3 \
+ mulxc3 \
+ negdf2 \
+ negdi2 \
+ negsf2 \
+ negti2 \
+ negvdi2 \
+ negvsi2 \
+ negvti2 \
+ paritydi2 \
+ paritysi2 \
+ parityti2 \
+ popcountdi2 \
+ popcountsi2 \
+ popcountti2 \
+ powidf2 \
+ powisf2 \
+ powitf2 \
+ powixf2 \
+ subvdi3 \
+ subvsi3 \
+ subvti3 \
+ trampoline_setup \
+ ucmpdi2 \
+ ucmpti2 \
+ udivdi3 \
+ udivmoddi4 \
+ udivmodsi4 \
+ udivmodti4 \
+ udivti3 \
+ umoddi3 \
+ umodti3
+
+# These are already shipped by libc.a on arm and mips
+.if ${MACHINE_CPUARCH} != "arm" && ${MACHINE_CPUARCH} != "mips"
+SRCF+= adddf3 \
+ addsf3 \
+ divdf3 \
+ divsf3 \
+ divsi3 \
+ extendsfdf2 \
+ fixdfsi \
+ fixsfsi \
+ floatsidf \
+ floatsisf \
+ modsi3 \
+ muldf3 \
+ mulsf3 \
+ subdf3 \
+ subsf3 \
+ truncdfsf2 \
+ udivsi3 \
+ umodsi3
+.endif
+
+# 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 \
+ __sync_fetch_and_sub_4 \
+ __sync_fetch_and_xor_4 \
+ __sync_lock_test_and_set_4 \
+ __sync_val_compare_and_swap_4
+.endif
+.if ${MACHINE_ARCH:Mmips64*} != ""
+SRCF+= __sync_fetch_and_add_8 \
+ __sync_fetch_and_and_8 \
+ __sync_fetch_and_or_8 \
+ __sync_fetch_and_sub_8 \
+ __sync_fetch_and_xor_8 \
+ __sync_lock_test_and_set_8 \
+ __sync_val_compare_and_swap_8
+.endif
+
+.for file in ${SRCF}
+. if ${MACHINE_CPUARCH} != "arm" && exists(${CRTSRC}/${CRTARCH}/${file}.S)
+SRCS+= ${file}.S
+. else
+SRCS+= ${file}.c
+. endif
+.endfor
+
+.if ${MACHINE_CPUARCH} != "sparc64" && ${MACHINE_CPUARCH} != "mips"
+. if ${MK_INSTALLLIB} != "no"
+SYMLINKS+=libcompiler_rt.a ${LIBDIR}/libgcc.a
+. endif
+. if ${MK_PROFILE} != "no"
+SYMLINKS+=libcompiler_rt_p.a ${LIBDIR}/libgcc_p.a
+. endif
+.endif
+
+.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" || \
+ ${MACHINE_CPUARCH} == "powerpc"
+AFLAGS+=--noexecstack
+ACFLAGS+=-Wa,--noexecstack
+.endif
+
+
+.include <bsd.lib.mk>
diff --git a/lib/libcompiler_rt/__sync_fetch_and_add_4.c b/lib/libcompiler_rt/__sync_fetch_and_add_4.c
new file mode 100644
index 0000000..3c11a3b
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_add_4.c
@@ -0,0 +1,6 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_add_4
+#define TYPE uint32_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
new file mode 100644
index 0000000..6157c15
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_add_8.c
@@ -0,0 +1,6 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_add_8
+#define TYPE uint64_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
new file mode 100644
index 0000000..1a488ec
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_and_4.c
@@ -0,0 +1,7 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_and_4
+#define TYPE uint32_t
+#define CMPSET atomic_cmpset_32
+#define EXPRESSION t & value
+
+#include "__sync_fetch_and_op_n.h"
diff --git a/lib/libcompiler_rt/__sync_fetch_and_and_8.c b/lib/libcompiler_rt/__sync_fetch_and_and_8.c
new file mode 100644
index 0000000..9923e31
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_and_8.c
@@ -0,0 +1,7 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_and_8
+#define TYPE uint64_t
+#define CMPSET atomic_cmpset_64
+#define EXPRESSION t & value
+
+#include "__sync_fetch_and_op_n.h"
diff --git a/lib/libcompiler_rt/__sync_fetch_and_op_n.h b/lib/libcompiler_rt/__sync_fetch_and_op_n.h
new file mode 100644
index 0000000..f7f0e06
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_op_n.h
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <machine/atomic.h>
+
+TYPE
+NAME(volatile TYPE *ptr, TYPE value)
+{
+ TYPE t;
+
+#ifdef FETCHADD
+ t = FETCHADD(ptr, value);
+#else
+ do {
+ t = *ptr;
+ } while (!CMPSET(ptr, t, EXPRESSION));
+#endif
+
+ return (t);
+}
diff --git a/lib/libcompiler_rt/__sync_fetch_and_or_4.c b/lib/libcompiler_rt/__sync_fetch_and_or_4.c
new file mode 100644
index 0000000..1feeeb1
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_or_4.c
@@ -0,0 +1,7 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_or_4
+#define TYPE uint32_t
+#define CMPSET atomic_cmpset_32
+#define EXPRESSION t | value
+
+#include "__sync_fetch_and_op_n.h"
diff --git a/lib/libcompiler_rt/__sync_fetch_and_or_8.c b/lib/libcompiler_rt/__sync_fetch_and_or_8.c
new file mode 100644
index 0000000..7cb9403
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_or_8.c
@@ -0,0 +1,7 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_or_8
+#define TYPE uint64_t
+#define CMPSET atomic_cmpset_64
+#define EXPRESSION t | value
+
+#include "__sync_fetch_and_op_n.h"
diff --git a/lib/libcompiler_rt/__sync_fetch_and_sub_4.c b/lib/libcompiler_rt/__sync_fetch_and_sub_4.c
new file mode 100644
index 0000000..a251add
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_sub_4.c
@@ -0,0 +1,6 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_sub_4
+#define TYPE uint32_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
new file mode 100644
index 0000000..5a93f97
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_sub_8.c
@@ -0,0 +1,6 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_sub_8
+#define TYPE uint64_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
new file mode 100644
index 0000000..d5f732d
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_xor_4.c
@@ -0,0 +1,7 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_xor_4
+#define TYPE uint32_t
+#define CMPSET atomic_cmpset_32
+#define EXPRESSION t ^ value
+
+#include "__sync_fetch_and_op_n.h"
diff --git a/lib/libcompiler_rt/__sync_fetch_and_xor_8.c b/lib/libcompiler_rt/__sync_fetch_and_xor_8.c
new file mode 100644
index 0000000..610037e
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_fetch_and_xor_8.c
@@ -0,0 +1,7 @@
+/* $FreeBSD$ */
+#define NAME __sync_fetch_and_xor_8
+#define TYPE uint64_t
+#define CMPSET atomic_cmpset_64
+#define EXPRESSION t ^ value
+
+#include "__sync_fetch_and_op_n.h"
diff --git a/lib/libcompiler_rt/__sync_lock_test_and_set_4.c b/lib/libcompiler_rt/__sync_lock_test_and_set_4.c
new file mode 100644
index 0000000..d4965f9
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_lock_test_and_set_4.c
@@ -0,0 +1,7 @@
+/* $FreeBSD$ */
+#define NAME __sync_lock_test_and_set_4
+#define TYPE uint32_t
+#define CMPSET atomic_cmpset_32
+#define EXPRESSION value
+
+#include "__sync_fetch_and_op_n.h"
diff --git a/lib/libcompiler_rt/__sync_lock_test_and_set_8.c b/lib/libcompiler_rt/__sync_lock_test_and_set_8.c
new file mode 100644
index 0000000..1e02203
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_lock_test_and_set_8.c
@@ -0,0 +1,7 @@
+/* $FreeBSD$ */
+#define NAME __sync_lock_test_and_set_8
+#define TYPE uint64_t
+#define CMPSET atomic_cmpset_64
+#define EXPRESSION value
+
+#include "__sync_fetch_and_op_n.h"
diff --git a/lib/libcompiler_rt/__sync_val_compare_and_swap_4.c b/lib/libcompiler_rt/__sync_val_compare_and_swap_4.c
new file mode 100644
index 0000000..e0ab115
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_val_compare_and_swap_4.c
@@ -0,0 +1,6 @@
+/* $FreeBSD$ */
+#define NAME __sync_val_compare_and_swap_4
+#define TYPE uint32_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
new file mode 100644
index 0000000..c6f1101
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_val_compare_and_swap_8.c
@@ -0,0 +1,6 @@
+/* $FreeBSD$ */
+#define NAME __sync_val_compare_and_swap_8
+#define TYPE uint64_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
new file mode 100644
index 0000000..cd4c9a3
--- /dev/null
+++ b/lib/libcompiler_rt/__sync_val_compare_and_swap_n.h
@@ -0,0 +1,45 @@
+/*-
+ * Copyright (c) 2011 Ed Schouten <ed@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <machine/atomic.h>
+
+TYPE
+NAME(volatile TYPE *ptr, TYPE oldval, TYPE newval)
+{
+ TYPE t;
+
+ while (!CMPSET(ptr, oldval, newval)) {
+ t = *ptr;
+ if (t != oldval)
+ return (t);
+ }
+
+ return (oldval);
+}
OpenPOWER on IntegriCloud