From 6171ecee13aea76d474919235568509835b25d98 Mon Sep 17 00:00:00 2001 From: John Paul Adrian Glaubitz Date: Sat, 1 Dec 2018 10:34:01 +0100 Subject: Link against libatomic on platforms missing 64-bit atomics Some architectures require linking against libatomic for using 64-bit atomic operations like __atomic_load_8. Due to a bug in gcc, linking against libatomic is not happening automatically when using C11 code. See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81358 Atomics libraries are now global. Rework of global check to include compile and link by Daniel Black. Tested on AIX7.1 cmake -UHAVE_ATOMIC_ADD_FETCH_WITH_LIBATOMIC -UHAVE_ATOMIC_ADD_FETCH . -- Running cmake version 3.16.0 -- MariaDB 10.3.25 getconf: specified variable is not valid on this system -- Performing Test HAVE_ATOMIC_ADD_FETCH -- Performing Test HAVE_ATOMIC_ADD_FETCH - Failed -- Performing Test HAVE_ATOMIC_ADD_FETCH_WITH_LIBATOMIC -- Performing Test HAVE_ATOMIC_ADD_FETCH_WITH_LIBATOMIC - Success closes #979 --- configure.cmake | 26 ++++++++++++++++++++++++++ unittest/mysys/CMakeLists.txt | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/configure.cmake b/configure.cmake index 75a02d2edc3..1916165b668 100644 --- a/configure.cmake +++ b/configure.cmake @@ -887,6 +887,32 @@ int main() }" HAVE_GCC_ATOMIC_BUILTINS) CHECK_CXX_SOURCE_COMPILES(" +#include +int main() { + uint64_t x = 1; + __atomic_add_fetch(&x, 0, __ATOMIC_RELAXED); + return x; +} +" HAVE_ATOMIC_ADD_FETCH) +IF(NOT HAVE_ATOMIC_ADD_FETCH) + SET(SAVE_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) + SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} atomic) + CHECK_CXX_SOURCE_COMPILES(" + #include + int main() { + uint64_t x = 1; + __atomic_add_fetch(&x, 0, __ATOMIC_RELAXED); + return x; + } + " HAVE_ATOMIC_ADD_FETCH_WITH_LIBATOMIC) + IF(HAVE_ATOMIC_ADD_FETCH_WITH_LIBATOMIC) + SET(LIBATOMIC atomic) + ELSE() + # revert the required libraries if unsuccessful + SET(CMAKE_REQUIRED_LIBRARIES ${SAVE_CMAKE_REQUIRED_LIBRARIES}) + ENDIF() +ENDIF() +CHECK_CXX_SOURCE_COMPILES(" int main() { long long int var= 1; diff --git a/unittest/mysys/CMakeLists.txt b/unittest/mysys/CMakeLists.txt index 984b033e7aa..4019bd3dd00 100644 --- a/unittest/mysys/CMakeLists.txt +++ b/unittest/mysys/CMakeLists.txt @@ -13,11 +13,12 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA -MY_ADD_TESTS(bitmap base64 my_atomic my_rdtsc lf my_malloc my_getopt dynstring +MY_ADD_TESTS(bitmap base64 my_rdtsc lf my_malloc my_getopt dynstring byte_order queues stacktrace LINK_LIBRARIES mysys) MY_ADD_TESTS(my_vsnprintf LINK_LIBRARIES strings mysys) MY_ADD_TESTS(aes LINK_LIBRARIES mysys mysys_ssl) +MY_ADD_TESTS(my_atomic LINK_LIBRARIES mysys ${LIBATOMIC}) ADD_DEFINITIONS(${SSL_DEFINES}) MY_ADD_TESTS(ma_dyncol LINK_LIBRARIES mysys) -- cgit v1.2.1