From 84f3374f1c674626830644bd8550ca66498e4cc7 Mon Sep 17 00:00:00 2001 From: Grazvydas Ignotas Date: Mon, 18 Sep 2017 22:11:26 +0300 Subject: [PATCH] configure: check if -latomic is needed for __atomic_* On some platforms, gcc generates library calls when __atomic_* functions are used, but does not link the required library (libatomic) automatically (supposedly to allow the app to use some other atomics implementation?). Detect this at configure time and add the library when needed. Tested on armel (library was added) and on x86_64 (was not, as expected). Some documentation on this is provided in GCC wiki: https://gcc.gnu.org/wiki/Atomic/GCCMM Fixes: 8915f0c0 "util: use GCC atomic intrinsics with explicit memory model" Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102573 Signed-off-by: Grazvydas Ignotas Reviewed-by: Matt Turner Reviewed-by: Emil Velikov (cherry picked from commit 2ef7f23820a67e958c2252bd81eb0458903ebf33) --- configure.ac | 13 +++++++++++++ src/util/Makefile.am | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 6668256615e..49dd0025021 100644 --- a/configure.ac +++ b/configure.ac @@ -410,8 +410,21 @@ int main() { }]])], GCC_ATOMIC_BUILTINS_SUPPORTED=1) 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 + 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 AM_CONDITIONAL([GCC_ATOMIC_BUILTINS_SUPPORTED], [test x$GCC_ATOMIC_BUILTINS_SUPPORTED = x1]) +AC_SUBST([LIBATOMIC_LIBS]) dnl Check if host supports 64-bit atomics dnl note that lack of support usually results in link (not compile) error diff --git a/src/util/Makefile.am b/src/util/Makefile.am index d17b402413d..a20d55a3409 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -46,7 +46,8 @@ libmesautil_la_SOURCES = \ libmesautil_la_LIBADD = \ $(CLOCK_LIB) \ - $(ZLIB_LIBS) + $(ZLIB_LIBS) \ + $(LIBATOMIC_LIBS) u_atomic_test_LDADD = libmesautil.la roundeven_test_LDADD = -lm