aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/compiler-rt/lib/builtins
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/compiler-rt/lib/builtins')
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/README.txt8
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/arm/truncdfsf2vfp.S4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/atomic.c15
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/cpu_model.c16
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/emutls.c17
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/fixdfdi.c4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/fixsfdi.c4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/fixunsdfdi.c4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/fixunssfdi.c4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfdi.c2
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfsi.c2
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/fixxfdi.c2
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/floatdidf.c4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/floatdisf.c4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/floatundidf.c4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/floatundisf.c4
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/mingw_fixfloat.c34
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/riscv/restore.S10
-rw-r--r--contrib/llvm-project/compiler-rt/lib/builtins/riscv/save.S2
19 files changed, 95 insertions, 49 deletions
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/README.txt b/contrib/llvm-project/compiler-rt/lib/builtins/README.txt
index d66d725e7ab5..53d656d5086d 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/README.txt
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/README.txt
@@ -271,8 +271,8 @@ switchu8
// There is no C interface to the *_vfp_d8_d15_regs functions. There are
// called in the prolog and epilog of Thumb1 functions. When the C++ ABI use
-// SJLJ for exceptions, each function with a catch clause or destuctors needs
-// to save and restore all registers in it prolog and epliog. But there is
+// SJLJ for exceptions, each function with a catch clause or destructors needs
+// to save and restore all registers in it prolog and epilog. But there is
// no way to access vector and high float registers from thumb1 code, so the
// compiler must add call outs to these helper functions in the prolog and
// epilog.
@@ -311,9 +311,9 @@ double __floatsidfvfp(int a); // Appears to convert from
float __floatsisfvfp(int a); // Appears to convert from
// int to float.
double __floatunssidfvfp(unsigned int a); // Appears to convert from
- // unisgned int to double.
+ // unsigned int to double.
float __floatunssisfvfp(unsigned int a); // Appears to convert from
- // unisgned int to float.
+ // unsigned int to float.
int __gedf2vfp(double a, double b); // Appears to return __gedf2
// (a >= b)
int __gesf2vfp(float a, float b); // Appears to return __gesf2
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/arm/truncdfsf2vfp.S b/contrib/llvm-project/compiler-rt/lib/builtins/arm/truncdfsf2vfp.S
index a3c0a73466e9..e1c171262a78 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/arm/truncdfsf2vfp.S
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/arm/truncdfsf2vfp.S
@@ -11,9 +11,9 @@
//
// extern float __truncdfsf2vfp(double a);
//
-// Converts double precision float to signle precision result.
+// Converts double precision float to single precision result.
// Uses Darwin calling convention where a double precision parameter is
-// passed in a R0/R1 pair and a signle precision result is returned in R0.
+// passed in a R0/R1 pair and a single precision result is returned in R0.
//
.syntax unified
.p2align 2
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/atomic.c b/contrib/llvm-project/compiler-rt/lib/builtins/atomic.c
index 64bf72dfa345..4c3ebb99a513 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/atomic.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/atomic.c
@@ -336,6 +336,18 @@ OPTIMISED_CASES
return tmp; \
}
+#define ATOMIC_RMW_NAND(n, lockfree, type) \
+ type __atomic_fetch_nand_##n(type *ptr, type val, int model) { \
+ if (lockfree(ptr)) \
+ return __c11_atomic_fetch_nand((_Atomic(type) *)ptr, val, model); \
+ Lock *l = lock_for_pointer(ptr); \
+ lock(l); \
+ type tmp = *ptr; \
+ *ptr = ~(tmp & val); \
+ unlock(l); \
+ return tmp; \
+ }
+
#define OPTIMISED_CASE(n, lockfree, type) ATOMIC_RMW(n, lockfree, type, add, +)
OPTIMISED_CASES
#undef OPTIMISED_CASE
@@ -351,3 +363,6 @@ OPTIMISED_CASES
#define OPTIMISED_CASE(n, lockfree, type) ATOMIC_RMW(n, lockfree, type, xor, ^)
OPTIMISED_CASES
#undef OPTIMISED_CASE
+#define OPTIMISED_CASE(n, lockfree, type) ATOMIC_RMW_NAND(n, lockfree, type)
+OPTIMISED_CASES
+#undef OPTIMISED_CASE
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/cpu_model.c b/contrib/llvm-project/compiler-rt/lib/builtins/cpu_model.c
index ebc2c522c83f..53e2d89708dc 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/cpu_model.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/cpu_model.c
@@ -422,6 +422,22 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,
*Subtype = INTEL_COREI7_ICELAKE_CLIENT;
break;
+ // Tigerlake:
+ case 0x8c:
+ case 0x8d:
+ CPU = "tigerlake";
+ *Type = INTEL_COREI7;
+ *Subtype = INTEL_COREI7_TIGERLAKE;
+ break;
+
+ // Alderlake:
+ case 0x97:
+ case 0x9a:
+ CPU = "alderlake";
+ *Type = INTEL_COREI7;
+ *Subtype = INTEL_COREI7_ALDERLAKE;
+ break;
+
// Icelake Xeon:
case 0x6a:
case 0x6c:
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/emutls.c b/contrib/llvm-project/compiler-rt/lib/builtins/emutls.c
index 98cabd917d6c..e112fdf51440 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/emutls.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/emutls.c
@@ -150,7 +150,7 @@ static void win_error(DWORD last_err, const char *hint) {
NULL, last_err, 0, (LPSTR)&buffer, 1, NULL)) {
fprintf(stderr, "Windows error: %s\n", buffer);
} else {
- fprintf(stderr, "Unkown Windows error: %s\n", hint);
+ fprintf(stderr, "Unknown Windows error: %s\n", hint);
}
LocalFree(buffer);
}
@@ -374,6 +374,21 @@ emutls_get_address_array(uintptr_t index) {
return array;
}
+#ifndef _WIN32
+// Our emulated TLS implementation relies on local state (e.g. for the pthread
+// key), and if we duplicate this state across different shared libraries,
+// accesses to the same TLS variable from different shared libraries will yield
+// different results (see https://github.com/android/ndk/issues/1551 for an
+// example). __emutls_get_address is the only external entry point for emulated
+// TLS, and by making it default visibility and weak, we can rely on the dynamic
+// linker to coalesce multiple copies at runtime and ensure a single unique copy
+// of TLS state. This is a best effort; it won't work if the user is linking
+// with -Bsymbolic or -Bsymbolic-functions, and it also won't work on Windows,
+// where the dynamic linker has no notion of coalescing weak symbols at runtime.
+// A more robust solution would be to create a separate shared library for
+// emulated TLS, to ensure a single copy of its state.
+__attribute__((visibility("default"), weak))
+#endif
void *__emutls_get_address(__emutls_control *control) {
uintptr_t index = emutls_get_index(control);
emutls_address_array *array = emutls_get_address_array(index--);
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/fixdfdi.c b/contrib/llvm-project/compiler-rt/lib/builtins/fixdfdi.c
index 511568fc12fd..a48facb68598 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/fixdfdi.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/fixdfdi.c
@@ -42,3 +42,7 @@ AEABI_RTABI di_int __aeabi_d2lz(fp_t a) { return __fixdfdi(a); }
COMPILER_RT_ALIAS(__fixdfdi, __aeabi_d2lz)
#endif
#endif
+
+#if defined(__MINGW32__) && defined(__arm__)
+COMPILER_RT_ALIAS(__fixdfdi, __dtoi64)
+#endif
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/fixsfdi.c b/contrib/llvm-project/compiler-rt/lib/builtins/fixsfdi.c
index 0cf71c30311a..3a66fb9e2f06 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/fixsfdi.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/fixsfdi.c
@@ -42,3 +42,7 @@ AEABI_RTABI di_int __aeabi_f2lz(fp_t a) { return __fixsfdi(a); }
COMPILER_RT_ALIAS(__fixsfdi, __aeabi_f2lz)
#endif
#endif
+
+#if defined(__MINGW32__) && defined(__arm__)
+COMPILER_RT_ALIAS(__fixsfdi, __stoi64)
+#endif
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/fixunsdfdi.c b/contrib/llvm-project/compiler-rt/lib/builtins/fixunsdfdi.c
index ccb256d2c7e0..f15f86788e85 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/fixunsdfdi.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/fixunsdfdi.c
@@ -40,3 +40,7 @@ AEABI_RTABI du_int __aeabi_d2ulz(fp_t a) { return __fixunsdfdi(a); }
COMPILER_RT_ALIAS(__fixunsdfdi, __aeabi_d2ulz)
#endif
#endif
+
+#if defined(__MINGW32__) && defined(__arm__)
+COMPILER_RT_ALIAS(__fixunsdfdi, __dtou64)
+#endif
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/fixunssfdi.c b/contrib/llvm-project/compiler-rt/lib/builtins/fixunssfdi.c
index 647185fbabf1..e8f600df9766 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/fixunssfdi.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/fixunssfdi.c
@@ -41,3 +41,7 @@ AEABI_RTABI du_int __aeabi_f2ulz(fp_t a) { return __fixunssfdi(a); }
COMPILER_RT_ALIAS(__fixunssfdi, __aeabi_f2ulz)
#endif
#endif
+
+#if defined(__MINGW32__) && defined(__arm__)
+COMPILER_RT_ALIAS(__fixunssfdi, __stou64)
+#endif
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfdi.c b/contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfdi.c
index 097a4e55e931..c8a8061b2cf0 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfdi.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfdi.c
@@ -26,7 +26,7 @@
// mmmm mmmm mmmm
#if defined(_MSC_VER) && !defined(__clang__)
-// MSVC throws a warning about 'unitialized variable use' here,
+// MSVC throws a warning about 'uninitialized variable use' here,
// disable it for builds that warn-as-error
#pragma warning(push)
#pragma warning(disable : 4700)
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfsi.c b/contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfsi.c
index 3bc1288d38a1..154abcbd35e7 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfsi.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/fixunsxfsi.c
@@ -26,7 +26,7 @@
// mmmm mmmm mmmm
#if defined(_MSC_VER) && !defined(__clang__)
-// MSVC throws a warning about 'unitialized variable use' here,
+// MSVC throws a warning about 'uninitialized variable use' here,
// disable it for builds that warn-as-error
#pragma warning(push)
#pragma warning(disable : 4700)
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/fixxfdi.c b/contrib/llvm-project/compiler-rt/lib/builtins/fixxfdi.c
index a7a0464feb9d..86cf3767b75d 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/fixxfdi.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/fixxfdi.c
@@ -25,7 +25,7 @@
// mmmm mmmm mmmm
#if defined(_MSC_VER) && !defined(__clang__)
-// MSVC throws a warning about 'unitialized variable use' here,
+// MSVC throws a warning about 'uninitialized variable use' here,
// disable it for builds that warn-as-error
#pragma warning(push)
#pragma warning(disable : 4700)
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/floatdidf.c b/contrib/llvm-project/compiler-rt/lib/builtins/floatdidf.c
index 7ecb30bca71e..d37c43b1f2f9 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/floatdidf.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/floatdidf.c
@@ -101,3 +101,7 @@ AEABI_RTABI double __aeabi_l2d(di_int a) { return __floatdidf(a); }
COMPILER_RT_ALIAS(__floatdidf, __aeabi_l2d)
#endif
#endif
+
+#if defined(__MINGW32__) && defined(__arm__)
+COMPILER_RT_ALIAS(__floatdidf, __i64tod)
+#endif
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/floatdisf.c b/contrib/llvm-project/compiler-rt/lib/builtins/floatdisf.c
index faaa1bcb3c8e..5c6316431e39 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/floatdisf.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/floatdisf.c
@@ -73,3 +73,7 @@ AEABI_RTABI float __aeabi_l2f(di_int a) { return __floatdisf(a); }
COMPILER_RT_ALIAS(__floatdisf, __aeabi_l2f)
#endif
#endif
+
+#if defined(__MINGW32__) && defined(__arm__)
+COMPILER_RT_ALIAS(__floatdisf, __i64tos)
+#endif
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/floatundidf.c b/contrib/llvm-project/compiler-rt/lib/builtins/floatundidf.c
index e5e533042a34..2ec802cdc134 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/floatundidf.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/floatundidf.c
@@ -104,3 +104,7 @@ AEABI_RTABI double __aeabi_ul2d(du_int a) { return __floatundidf(a); }
COMPILER_RT_ALIAS(__floatundidf, __aeabi_ul2d)
#endif
#endif
+
+#if defined(__MINGW32__) && defined(__arm__)
+COMPILER_RT_ALIAS(__floatundidf, __u64tod)
+#endif
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/floatundisf.c b/contrib/llvm-project/compiler-rt/lib/builtins/floatundisf.c
index 00d61b0c6310..2a4157dc5e4b 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/floatundisf.c
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/floatundisf.c
@@ -70,3 +70,7 @@ AEABI_RTABI float __aeabi_ul2f(du_int a) { return __floatundisf(a); }
COMPILER_RT_ALIAS(__floatundisf, __aeabi_ul2f)
#endif
#endif
+
+#if defined(__MINGW32__) && defined(__arm__)
+COMPILER_RT_ALIAS(__floatundisf, __u64tos)
+#endif
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/mingw_fixfloat.c b/contrib/llvm-project/compiler-rt/lib/builtins/mingw_fixfloat.c
deleted file mode 100644
index 945be9d4344a..000000000000
--- a/contrib/llvm-project/compiler-rt/lib/builtins/mingw_fixfloat.c
+++ /dev/null
@@ -1,34 +0,0 @@
-//===-- mingw_fixfloat.c - Wrap int/float conversions for arm/windows -----===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "int_lib.h"
-
-COMPILER_RT_ABI di_int __fixdfdi(double a);
-COMPILER_RT_ABI di_int __fixsfdi(float a);
-COMPILER_RT_ABI du_int __fixunsdfdi(double a);
-COMPILER_RT_ABI du_int __fixunssfdi(float a);
-COMPILER_RT_ABI double __floatdidf(di_int a);
-COMPILER_RT_ABI float __floatdisf(di_int a);
-COMPILER_RT_ABI double __floatundidf(du_int a);
-COMPILER_RT_ABI float __floatundisf(du_int a);
-
-COMPILER_RT_ABI di_int __dtoi64(double a) { return __fixdfdi(a); }
-
-COMPILER_RT_ABI di_int __stoi64(float a) { return __fixsfdi(a); }
-
-COMPILER_RT_ABI du_int __dtou64(double a) { return __fixunsdfdi(a); }
-
-COMPILER_RT_ABI du_int __stou64(float a) { return __fixunssfdi(a); }
-
-COMPILER_RT_ABI double __i64tod(di_int a) { return __floatdidf(a); }
-
-COMPILER_RT_ABI float __i64tos(di_int a) { return __floatdisf(a); }
-
-COMPILER_RT_ABI double __u64tod(du_int a) { return __floatundidf(a); }
-
-COMPILER_RT_ABI float __u64tos(du_int a) { return __floatundisf(a); }
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/riscv/restore.S b/contrib/llvm-project/compiler-rt/lib/builtins/riscv/restore.S
index 12f0d3365655..73f64a920d66 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/riscv/restore.S
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/riscv/restore.S
@@ -93,7 +93,7 @@ __riscv_restore_0:
__riscv_restore_12:
ld s11, 8(sp)
addi sp, sp, 16
- // fallthrough into __riscv_restore_11/10/9/8
+ // fallthrough into __riscv_restore_11/10
.globl __riscv_restore_11
.type __riscv_restore_11,@function
@@ -143,10 +143,6 @@ __riscv_restore_4:
.type __riscv_restore_3,@function
.globl __riscv_restore_2
.type __riscv_restore_2,@function
- .globl __riscv_restore_1
- .type __riscv_restore_1,@function
- .globl __riscv_restore_0
- .type __riscv_restore_0,@function
__riscv_restore_3:
__riscv_restore_2:
ld s2, 0(sp)
@@ -154,6 +150,10 @@ __riscv_restore_2:
addi sp, sp, 16
// fallthrough into __riscv_restore_1/0
+ .globl __riscv_restore_1
+ .type __riscv_restore_1,@function
+ .globl __riscv_restore_0
+ .type __riscv_restore_0,@function
__riscv_restore_1:
__riscv_restore_0:
ld s0, 0(sp)
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/riscv/save.S b/contrib/llvm-project/compiler-rt/lib/builtins/riscv/save.S
index d811bf584fc3..85501aeb4c2e 100644
--- a/contrib/llvm-project/compiler-rt/lib/builtins/riscv/save.S
+++ b/contrib/llvm-project/compiler-rt/lib/builtins/riscv/save.S
@@ -174,6 +174,8 @@ __riscv_save_2:
.type __riscv_save_1,@function
.globl __riscv_save_0
.type __riscv_save_0,@function
+__riscv_save_1:
+__riscv_save_0:
addi sp, sp, -16
sd s0, 0(sp)
sd ra, 8(sp)