1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
From cc580e1c4d2628f8d1fa41c574d0af2498c7b33c Mon Sep 17 00:00:00 2001
From: Jan Beich <jbeich@freebsd.org>
Date: Sat, 13 May 2017 11:20:53 +0200
Subject: [PATCH 1/2] Clang doesn't have 64bit __atomic* builtins on i386
glsl/.libs/libstandalone.a(libmesautil_la-disk_cache.o): In function `disk_cache_remove':
disk_cache.c:(.text+0x763): undefined reference to `__atomic_fetch_add_8'
glsl/.libs/libstandalone.a(libmesautil_la-disk_cache.o): In function `cache_put':
disk_cache.c:(.text+0xabc): undefined reference to `__atomic_fetch_add_8'
disk_cache.c:(.text+0xec1): undefined reference to `__atomic_fetch_add_8'
c++: error: linker command failed with exit code 1 (use -v to see invocation)
Signed-off-by: Jan Beich <jbeich@FreeBSD.org>
---
configure.ac | 13 ++++++++++++-
src/util/u_atomic.c | 4 ++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index e3babd3909..6554ab7251 100644
--- a/configure.ac
+++ b/configure.ac
@@ -415,13 +415,24 @@ AM_CONDITIONAL([GCC_ATOMIC_BUILTINS_SUPPORTED], [test x$GCC_ATOMIC_BUILTINS_SUPP
dnl Check if host supports 64-bit atomics
dnl note that lack of support usually results in link (not compile) error
-AC_MSG_CHECKING(whether __sync_add_and_fetch_8 is supported)
+save_CFLAGS=$CFLAGS
+if test "x$GCC_ATOMIC_BUILTINS_SUPPORTED" = x1; then
+ CFLAGS="$CFLAGS -DUSE_GCC_ATOMIC_BUILTINS"
+ AC_MSG_CHECKING(whether __atomic_fetch_add_8 is supported)
+else
+ AC_MSG_CHECKING(whether __sync_add_and_fetch_8 is supported)
+fi
AC_LINK_IFELSE([AC_LANG_SOURCE([[
#include <stdint.h>
uint64_t v;
int main() {
+#ifdef USE_GCC_ATOMIC_BUILTINS
+ return __atomic_add_fetch(&v, 1, __ATOMIC_ACQ_REL);
+#else
return __sync_add_and_fetch(&v, (uint64_t)1);
+#endif
}]])], GCC_64BIT_ATOMICS_SUPPORTED=yes, GCC_64BIT_ATOMICS_SUPPORTED=no)
+CFLAGS=$save_CFLAGS
if test "x$GCC_64BIT_ATOMICS_SUPPORTED" != xyes; then
DEFINES="$DEFINES -DMISSING_64BIT_ATOMICS"
fi
diff --git a/src/util/u_atomic.c b/src/util/u_atomic.c
index 44b75fb0c0..691c34cf30 100644
--- a/src/util/u_atomic.c
+++ b/src/util/u_atomic.c
@@ -34,6 +34,7 @@
static pthread_mutex_t sync_mutex = PTHREAD_MUTEX_INITIALIZER;
+#ifndef USE_GCC_ATOMIC_BUILTINS
WEAK uint64_t
__sync_add_and_fetch_8(uint64_t *ptr, uint64_t val)
{
@@ -60,6 +61,8 @@ __sync_sub_and_fetch_8(uint64_t *ptr, uint64_t val)
return r;
}
+#else
+
WEAK uint64_t
__atomic_fetch_add_8(uint64_t *ptr, uint64_t val, int memorder)
{
@@ -71,5 +74,6 @@ __atomic_fetch_sub_8(uint64_t *ptr, uint64_t val, int memorder)
{
return __sync_sub_and_fetch(ptr, val);
}
+#endif /* !USE_GCC_ATOMIC_BUILTINS */
#endif
--
2.14.1
|