diff options
Diffstat (limited to 'lib/libcompiler_rt')
-rw-r--r-- | lib/libcompiler_rt/Makefile | 215 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_add_4.c | 6 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_add_8.c | 6 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_and_4.c | 7 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_and_8.c | 7 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_op_n.h | 47 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_or_4.c | 7 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_or_8.c | 7 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_sub_4.c | 6 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_sub_8.c | 6 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_xor_4.c | 7 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_fetch_and_xor_8.c | 7 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_lock_test_and_set_4.c | 7 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_lock_test_and_set_8.c | 7 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_val_compare_and_swap_4.c | 6 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_val_compare_and_swap_8.c | 6 | ||||
-rw-r--r-- | lib/libcompiler_rt/__sync_val_compare_and_swap_n.h | 45 |
17 files changed, 399 insertions, 0 deletions
diff --git a/lib/libcompiler_rt/Makefile b/lib/libcompiler_rt/Makefile new file mode 100644 index 0000000..a9daada --- /dev/null +++ b/lib/libcompiler_rt/Makefile @@ -0,0 +1,215 @@ +# $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 \ + 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 + +# Don't build clear_cache on ARM with clang as it is a builtin there. +.if ${MACHINE_CPUARCH} != "arm" || ${COMPILER_TYPE} != "clang" +SRCF+= clear_cache +.endif + +# These are already shipped by libc.a on arm and mips +.if ${MACHINE_CPUARCH} != "arm" && ${MACHINE_CPUARCH} != "mips" +SRCF+= adddf3 \ + addsf3 \ + divdf3 \ + divsf3 \ + extendsfdf2 \ + fixdfsi \ + fixsfsi \ + floatsidf \ + floatsisf \ + muldf3 \ + mulsf3 \ + subdf3 \ + subsf3 \ + truncdfsf2 +.endif + +.if ${MACHINE_CPUARCH} != "mips" && \ + (${MACHINE_CPUARCH} != "arm" || ${MK_ARM_EABI} != "no") +SRCF+= divsi3 \ + modsi3 \ + udivsi3 \ + umodsi3 +.endif + +# FreeBSD-specific atomic intrinsics. Clang provides them as a builtin. +.if (${MACHINE_CPUARCH} == "arm" && ${COMPILER_TYPE} != "clang") || \ + ${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} == "arm" && ${MK_ARM_EABI} != "no" +SRCS+= aeabi_idivmod.S \ + aeabi_ldivmod.S \ + aeabi_memcmp.S \ + aeabi_memcpy.S \ + aeabi_memmove.S \ + aeabi_memset.S \ + aeabi_uidivmod.S \ + aeabi_uldivmod.S +.endif + +.if ${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); +} |