diff options
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/CheckAtomic.cmake | 64 | 
1 files changed, 34 insertions, 30 deletions
| diff --git a/modules/CheckAtomic.cmake b/modules/CheckAtomic.cmake index 900ae7e0..41cff207 100644 --- a/modules/CheckAtomic.cmake +++ b/modules/CheckAtomic.cmake @@ -27,8 +27,12 @@ function(check_working_cxx_atomics varname)    check_cxx_source_compiles("    #include <atomic>    std::atomic<int> x; +  std::atomic<short> y; +  std::atomic<char> z;    int main() { -    return std::atomic_is_lock_free(&x); +    ++z; +    ++y; +    return ++x;    }    " ${varname})    set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) @@ -43,50 +47,50 @@ function(check_working_cxx_atomics64 varname)    std::atomic<uint64_t> x (0);    int main() {      uint64_t i = x.load(std::memory_order_relaxed); -    return std::atomic_is_lock_free(&x); +    return 0;    }    " ${varname})    set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})  endfunction() - -# This isn't necessary on MSVC, so avoid command-line switch annoyance -# by only running on GCC-like hosts. -if (LLVM_COMPILER_IS_GCC_COMPATIBLE) +# Check for (non-64-bit) atomic operations. +if(MSVC) +  set(HAVE_CXX_ATOMICS_WITHOUT_LIB True) +elseif(LLVM_COMPILER_IS_GCC_COMPATIBLE)    # First check if atomics work without the library.    check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)    # If not, check if the library exists, and atomics work with it.    if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB) -     check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC) -     if(HAVE_LIBATOMIC) -        list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") -        check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB) -        if (NOT HAVE_CXX_ATOMICS_WITH_LIB) -           message(FATAL_ERROR "Host compiler must support std::atomic!") -        endif() -     else() -        message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") -     endif() +    check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC) +    if(HAVE_LIBATOMIC) +      list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") +      check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB) +      if (NOT HAVE_CXX_ATOMICS_WITH_LIB) +        message(FATAL_ERROR "Host compiler must support std::atomic!") +      endif() +    else() +      message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") +    endif()    endif()  endif()  # Check for 64 bit atomic operations.  if(MSVC)    set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True) -else() +elseif(LLVM_COMPILER_IS_GCC_COMPATIBLE) +  # First check if atomics work without the library.    check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) -endif() - -# If not, check if the library exists, and atomics work with it. -if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) -  check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) -  if(HAVE_CXX_LIBATOMICS64) -     list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") -     check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) -     if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) -        message(FATAL_ERROR "Host compiler must support std::atomic!") -     endif() -  else() -     message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") +  # If not, check if the library exists, and atomics work with it. +  if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) +    check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) +    if(HAVE_CXX_LIBATOMICS64) +      list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") +      check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) +      if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) +        message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") +      endif() +    else() +      message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.") +    endif()    endif()  endif() | 
