From 4088b27b9397fa9877bf60b8e707bba5dc51e9cb Mon Sep 17 00:00:00 2001 From: Moody Liu Date: Tue, 12 Apr 2022 10:40:00 +0100 Subject: [PATCH] Explicitly check for atomic addition and relaxed load operation support ...and properly find and link against `libatomic` using find_library. This fixes the qtdeclarative build on the RISC-V platform. Initial-patch-by: Sprite Pick-to: 6.2 Pick-to: 6.3 Task-number: QTBUG-99234 Change-Id: I2b5e4812886ce45cb02bed3106ce8c519b294cbe Reviewed-by: Thiago Macieira Reviewed-by: Jörg Bornemann --- cmake/FindWrapAtomic.cmake | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/cmake/FindWrapAtomic.cmake b/cmake/FindWrapAtomic.cmake index c2582bdd6b..3ea72bb188 100644 --- a/cmake/FindWrapAtomic.cmake +++ b/cmake/FindWrapAtomic.cmake @@ -10,35 +10,39 @@ include(CheckCXXSourceCompiles) set (atomic_test_sources "#include #include -void test(volatile std::atomic &a) -{ - std::int64_t v = a.load(std::memory_order_acquire); - while (!a.compare_exchange_strong(v, v + 1, - std::memory_order_acq_rel, - std::memory_order_acquire)) { - v = a.exchange(v - 1); - } - a.store(v + 1, std::memory_order_release); -} - int main(int, char **) { - void *ptr = (void*)0xffffffc0; // any random pointer - test(*reinterpret_cast *>(ptr)); + volatile std::atomic size_1; + volatile std::atomic size_2; + volatile std::atomic size_4; + volatile std::atomic size_8; + + ++size_1; + ++size_2; + ++size_4; + ++size_8; + + (void)size_1.load(std::memory_order_relaxed); + (void)size_2.load(std::memory_order_relaxed); + (void)size_4.load(std::memory_order_relaxed); + (void)size_8.load(std::memory_order_relaxed); + return 0; }") check_cxx_source_compiles("${atomic_test_sources}" HAVE_STDATOMIC) if(NOT HAVE_STDATOMIC) set(_req_libraries "${CMAKE_REQUIRED_LIBRARIES}") - set(CMAKE_REQUIRED_LIBRARIES "atomic") + find_library(atomic_LIB atomic REQUIRED) + set(CMAKE_REQUIRED_LIBRARIES ${atomic_LIB}) check_cxx_source_compiles("${atomic_test_sources}" HAVE_STDATOMIC_WITH_LIB) set(CMAKE_REQUIRED_LIBRARIES "${_req_libraries}") endif() add_library(WrapAtomic::WrapAtomic INTERFACE IMPORTED) if(HAVE_STDATOMIC_WITH_LIB) - target_link_libraries(WrapAtomic::WrapAtomic INTERFACE atomic) + # atomic_LIB is already found above. + target_link_libraries(WrapAtomic::WrapAtomic INTERFACE ${atomic_LIB}) endif() set(WrapAtomic_FOUND 1) -- 2.35.1