125 lines
4.4 KiB
Diff
125 lines
4.4 KiB
Diff
|
From 5865c7cb4e4ed1d63699e384ea52984448adfec9 Mon Sep 17 00:00:00 2001
|
||
|
From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||
|
Date: Mon, 7 May 2018 10:36:10 +0200
|
||
|
Subject: [PATCH] configure.ac: rework -latomic check
|
||
|
|
||
|
The configure.ac logic added in commit
|
||
|
2ef7f23820a67e958c2252bd81eb0458903ebf33 ("configure: check if
|
||
|
-latomic is needed for __atomic_*") makes the assumption that if a
|
||
|
64-bit atomic intrinsic test program fails to link without -latomic,
|
||
|
it is because we must use -latomic.
|
||
|
|
||
|
Unfortunately, this is not completely correct: libatomic only appeared
|
||
|
in gcc 4.8, and therefore gcc versions before that will not have
|
||
|
libatomic, and therefore don't provide atomic intrinsics for all
|
||
|
architectures. This issue was for example encountered on PowerPC with
|
||
|
a gcc 4.7 toolchain, where the build fails with:
|
||
|
|
||
|
powerpc-ctng_e500v2-linux-gnuspe/bin/ld: cannot find -latomic
|
||
|
|
||
|
This commit aims at fixing that, by not assuming -latomic is
|
||
|
available. The commit re-organizes the atomic intrinsics detection as
|
||
|
follows:
|
||
|
|
||
|
(1) Test if a program using 64-bit atomic intrinsics links properly,
|
||
|
without -latomic. If this is the case, we have atomic intrinsics,
|
||
|
and we're good to go.
|
||
|
|
||
|
(2) If (1) has failed, then test to link the same program, but this
|
||
|
time with -latomic in LDFLAGS. If this is the case, then we have
|
||
|
atomic intrinsics, provided we link with -latomic.
|
||
|
|
||
|
This has been tested in three situations:
|
||
|
|
||
|
- On x86-64, where atomic instrinsics are all built-in, with no need
|
||
|
for libatomic. In this case, config.log contains:
|
||
|
|
||
|
GCC_ATOMIC_BUILTINS_SUPPORTED_FALSE='#'
|
||
|
GCC_ATOMIC_BUILTINS_SUPPORTED_TRUE=''
|
||
|
LIBATOMIC_LIBS=''
|
||
|
|
||
|
This means: atomic intrinsics are available, and we don't need to
|
||
|
link with libatomic.
|
||
|
|
||
|
- On NIOS2, where atomic intrinsics are available, but some of them
|
||
|
(64-bit ones) require using libatomic. In this case, config.log
|
||
|
contains:
|
||
|
|
||
|
GCC_ATOMIC_BUILTINS_SUPPORTED_FALSE='#'
|
||
|
GCC_ATOMIC_BUILTINS_SUPPORTED_TRUE=''
|
||
|
LIBATOMIC_LIBS='-latomic'
|
||
|
|
||
|
This means: atomic intrinsics are available, and we need to link
|
||
|
with libatomic.
|
||
|
|
||
|
- On PowerPC with an old gcc 4.7 toolchain, where 32-bit atomic
|
||
|
instrinsics are available, but not 64-bit atomic instrinsics, and
|
||
|
there is no libatomic. In this case, config.log contains:
|
||
|
|
||
|
GCC_ATOMIC_BUILTINS_SUPPORTED_FALSE=''
|
||
|
GCC_ATOMIC_BUILTINS_SUPPORTED_TRUE='#'
|
||
|
|
||
|
With means that atomic intrinsics are not usable.
|
||
|
|
||
|
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||
|
Upstream-status: https://lists.freedesktop.org/archives/mesa-dev/2018-May/194214.html
|
||
|
---
|
||
|
configure.ac | 37 +++++++++++++++++++++----------------
|
||
|
1 file changed, 21 insertions(+), 16 deletions(-)
|
||
|
|
||
|
diff --git a/configure.ac b/configure.ac
|
||
|
index f1fbdcc6c7..c94e547874 100644
|
||
|
--- a/configure.ac
|
||
|
+++ b/configure.ac
|
||
|
@@ -433,26 +433,31 @@ fi
|
||
|
AM_CONDITIONAL([SSE41_SUPPORTED], [test x$SSE41_SUPPORTED = x1])
|
||
|
AC_SUBST([SSE41_CFLAGS], $SSE41_CFLAGS)
|
||
|
|
||
|
-dnl Check for new-style atomic builtins
|
||
|
-AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
||
|
+dnl Check for new-style atomic builtins. We first check without linking to
|
||
|
+dnl -latomic.
|
||
|
+AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
||
|
+#include <stdint.h>
|
||
|
int main() {
|
||
|
- int n;
|
||
|
- return __atomic_load_n(&n, __ATOMIC_ACQUIRE);
|
||
|
+ uint64_t n;
|
||
|
+ return (int)__atomic_load_n(&n, __ATOMIC_ACQUIRE);
|
||
|
}]])], GCC_ATOMIC_BUILTINS_SUPPORTED=1)
|
||
|
+
|
||
|
+dnl If that didn't work, we try linking with -latomic, which is needed on some
|
||
|
+dnl platforms.
|
||
|
+if test "x$GCC_ATOMIC_BUILTINS_SUPPORTED" != x1; then
|
||
|
+ save_LDFLAGS=$LDFLAGS
|
||
|
+ LDFLAGS="$LDFLAGS -latomic"
|
||
|
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
||
|
+ #include <stdint.h>
|
||
|
+ int main() {
|
||
|
+ uint64_t n;
|
||
|
+ return (int)__atomic_load_n(&n, __ATOMIC_ACQUIRE);
|
||
|
+ }]])], GCC_ATOMIC_BUILTINS_SUPPORTED=1 LIBATOMIC_LIBS="-latomic")
|
||
|
+ LDFLAGS=$save_LDFLAGS
|
||
|
+fi
|
||
|
+
|
||
|
if test "x$GCC_ATOMIC_BUILTINS_SUPPORTED" = x1; then
|
||
|
DEFINES="$DEFINES -DUSE_GCC_ATOMIC_BUILTINS"
|
||
|
- dnl On some platforms, new-style atomics need a helper library
|
||
|
- AC_MSG_CHECKING(whether -latomic is needed)
|
||
|
- AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
||
|
- #include <stdint.h>
|
||
|
- uint64_t v;
|
||
|
- int main() {
|
||
|
- return (int)__atomic_load_n(&v, __ATOMIC_ACQUIRE);
|
||
|
- }]])], GCC_ATOMIC_BUILTINS_NEED_LIBATOMIC=no, GCC_ATOMIC_BUILTINS_NEED_LIBATOMIC=yes)
|
||
|
- AC_MSG_RESULT($GCC_ATOMIC_BUILTINS_NEED_LIBATOMIC)
|
||
|
- if test "x$GCC_ATOMIC_BUILTINS_NEED_LIBATOMIC" = xyes; then
|
||
|
- LIBATOMIC_LIBS="-latomic"
|
||
|
- fi
|
||
|
fi
|
||
|
AC_SUBST([LIBATOMIC_LIBS])
|
||
|
|
||
|
--
|
||
|
2.14.3
|
||
|
|