diff options
author | Moody Liu <mooodyhunter@outlook.com> | 2022-04-12 10:40:00 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-04-18 20:04:50 +0000 |
commit | 3a1e06afe65346630b6a6e3b5ed1cfc048e6dcf9 (patch) | |
tree | 11110f8e7f697df101a716c93cec841220bc7d70 | |
parent | b092606bedba7d8935b85467750eeab29f766f93 (diff) |
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 <SpriteOvO@gmail.com>
Task-number: QTBUG-99234
Change-Id: I2b5e4812886ce45cb02bed3106ce8c519b294cbe
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
(cherry picked from commit 4088b27b9397fa9877bf60b8e707bba5dc51e9cb)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | cmake/FindWrapAtomic.cmake | 34 |
1 files 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 <atomic> #include <cstdint> -void test(volatile std::atomic<std::int64_t> &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<std::atomic<std::int64_t> *>(ptr)); + volatile std::atomic<char> size_1; + volatile std::atomic<short> size_2; + volatile std::atomic<int> size_4; + volatile std::atomic<int64_t> 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) |