| 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 |
| |