From 6e19a1f5f203e932c634c6151d341b19b5420b44 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Wed, 20 Jul 2016 11:01:17 +0200 Subject: [PATCH] configure: Improve check for built-in __atomic_* functions With AC_SEARCH_LIBS() we don't succeed if the searched function is a built-in as the check uses the wrong signature so the built-in will not be applied (the warning issued by GCC is "conflicting types for built-in function '...'"). So even if not required, libatomic will be linked if it is found, which could be problematic if compiling on a separate host and the target host does not have libatomic installed. Also, some tests showed that it's more likely that __atomic_and_fetch() requires linking libatomic than __atomic_load_n() does. References #1533. --- configure.ac | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index b58a5c149..408152a84 100644 --- a/configure.ac +++ b/configure.ac @@ -501,9 +501,20 @@ LIBS=$DLLIB AC_SEARCH_LIBS(pthread_create, pthread, [PTHREADLIB=$LIBS]) AC_SUBST(PTHREADLIB) -# uClibc requires explicit -latomic for __atomic_* operations +# Some architectures require explicit -latomic for __atomic_* operations +# AC_SEARCH_LIBS() does not work when checking built-ins due to conflicting types LIBS="" -AC_SEARCH_LIBS(__atomic_load, atomic, [ATOMICLIB=$LIBS]) +AC_MSG_CHECKING(for library containing __atomic_and_fetch) +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[]], [[int x; __atomic_and_fetch(&x, 1, __ATOMIC_RELAXED);]])], + [AC_MSG_RESULT([none required])], + [LIBS="-latomic"; + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[]], [[int x; __atomic_and_fetch(&x, 1, __ATOMIC_RELAXED);]])], + [AC_MSG_RESULT([-latomic]); ATOMICLIB=$LIBS], + [AC_MSG_RESULT([no])]) + ] +) AC_SUBST(ATOMICLIB) LIBS=$saved_LIBS