mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-24 20:29:39 +08:00
This should fix PR26631, PR26622 and has the nice property that the addition of the CheckLibcxxAtomic.cmake module acts as an NFC on the platforms of the reporters (at least for the time being). As these bug reports explain, CMake fails the atomic check because the include headers might not exist in the host environment. We could potentially point to the headers provided by libcxx itself. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@260961 91177308-0d34-0410-b5e6-96231b3b80d8
42 lines
1.4 KiB
CMake
42 lines
1.4 KiB
CMake
INCLUDE(CheckCXXSourceCompiles)
|
|
|
|
# Sometimes linking against libatomic is required for atomic ops, if
|
|
# the platform doesn't support lock-free atomics.
|
|
#
|
|
# We could modify LLVM's CheckAtomic module and have it check for 64-bit
|
|
# atomics instead. However, we would like to avoid careless uses of 64-bit
|
|
# atomics inside LLVM over time on 32-bit platforms.
|
|
|
|
function(check_cxx_atomics varname)
|
|
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
|
set(CMAKE_REQUIRED_FLAGS "-std=c++11")
|
|
if (${LIBCXX_GCC_TOOLCHAIN})
|
|
set(CMAKE_REQUIRED_FLAGS "-std=c++11 --gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}")
|
|
endif()
|
|
check_cxx_source_compiles("
|
|
#include <cstdint>
|
|
#include <atomic>
|
|
std::atomic<uintptr_t> x;
|
|
std::atomic<uintmax_t> y;
|
|
int main() {
|
|
return x + y;
|
|
}
|
|
" ${varname})
|
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
|
endfunction(check_cxx_atomics)
|
|
|
|
check_cxx_atomics(LIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
|
# If not, check if the library exists, and atomics work with it.
|
|
if(NOT LIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
|
check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB)
|
|
if(LIBCXX_HAS_ATOMIC_LIB)
|
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
|
check_cxx_atomics(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)
|
|
if (NOT LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)
|
|
message(WARNING "Host compiler must support std::atomic!")
|
|
endif()
|
|
else()
|
|
message(WARNING "Host compiler appears to require libatomic, but cannot find it.")
|
|
endif()
|
|
endif()
|