Index: libcxx/cmake/Modules/CheckLibcxxAtomic.cmake =================================================================== --- libcxx/cmake/Modules/CheckLibcxxAtomic.cmake +++ /dev/null @@ -1,56 +0,0 @@ -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 "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs -std=c++11 -nostdinc++ -isystem ${LIBCXX_SOURCE_DIR}/include") - if (${LIBCXX_GCC_TOOLCHAIN}) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}") - endif() - if (CMAKE_C_FLAGS MATCHES -fsanitize OR CMAKE_CXX_FLAGS MATCHES -fsanitize) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize=all") - endif() - if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize-coverage=edge,trace-cmp,indirect-calls,8bit-counters") - endif() - check_cxx_source_compiles(" -#include -#include -std::atomic x; -std::atomic y; -int main(int, char**) { - return x + y; -} -" ${varname}) - set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) -endfunction(check_cxx_atomics) - -# Perform the check for 64bit atomics without libatomic. It may have been -# added to the required libraries during in the configuration of LLVM, which -# would cause the check for CXX atomics without libatomic to incorrectly pass. -if (CMAKE_REQUIRED_LIBRARIES) - set(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) - list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES "atomic") - check_cxx_atomics(LIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB) - set(CMAKE_REQUIRED_LIBRARIES ${OLD_CMAKE_REQUIRED_LIBRARIES}) -endif() - -check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB) -# If not, check if the library exists, and atomics work with it. -if(NOT LIBCXX_HAVE_CXX_ATOMICS_WITHOUT_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() Index: libcxx/cmake/config-ix.cmake =================================================================== --- libcxx/cmake/config-ix.cmake +++ libcxx/cmake/config-ix.cmake @@ -73,7 +73,13 @@ endif() if(NOT WIN32 OR MINGW) - include(CheckLibcxxAtomic) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs -nostdinc++ -isystem ${LIBCXX_SOURCE_DIR}/include") + if (${LIBCXX_GCC_TOOLCHAIN}) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}") + endif() + include(CheckAtomic) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) endif() # Check libraries Index: libcxx/src/CMakeLists.txt =================================================================== --- libcxx/src/CMakeLists.txt +++ libcxx/src/CMakeLists.txt @@ -171,7 +171,7 @@ target_link_libraries(${target} PUBLIC gcc_s) endif() - if (LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) target_link_libraries(${target} PUBLIC atomic) endif() Index: libcxx/test/CMakeLists.txt =================================================================== --- libcxx/test/CMakeLists.txt +++ libcxx/test/CMakeLists.txt @@ -36,8 +36,8 @@ pythonize_bool(LIBCXXABI_ENABLE_SHARED) pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER) pythonize_bool(LIBCXX_USE_COMPILER_RT) -pythonize_bool(LIBCXX_HAS_ATOMIC_LIB) -pythonize_bool(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB) +pythonize_bool(HAVE_CXX_ATOMICS64) +pythonize_bool(HAVE_CXX_ATOMICS64_WITH_LIB) pythonize_bool(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) pythonize_bool(LIBCXX_DEBUG_BUILD) pythonize_bool(LIBCXX_ENABLE_PARALLEL_ALGORITHMS) Index: libcxx/test/lit.site.cfg.in =================================================================== --- libcxx/test/lit.site.cfg.in +++ libcxx/test/lit.site.cfg.in @@ -28,8 +28,8 @@ config.executor = "@LIBCXX_EXECUTOR@" config.llvm_unwinder = @LIBCXXABI_USE_LLVM_UNWINDER@ config.builtins_library = "@LIBCXX_BUILTINS_LIBRARY@" -config.has_libatomic = @LIBCXX_HAS_ATOMIC_LIB@ -config.use_libatomic = @LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB@ +config.has_libatomic = @HAVE_CXX_ATOMICS64@ +config.use_libatomic = @HAVE_CXX_ATOMICS64_WITH_LIB@ config.debug_build = @LIBCXX_DEBUG_BUILD@ config.libcxxabi_shared = @LIBCXXABI_ENABLE_SHARED@ config.cxx_ext_threads = @LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY@ Index: lldb/source/Utility/CMakeLists.txt =================================================================== --- lldb/source/Utility/CMakeLists.txt +++ lldb/source/Utility/CMakeLists.txt @@ -6,7 +6,7 @@ list(APPEND LLDB_SYSTEM_LIBS ws2_32 rpcrt4) endif () -if (NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB ) +if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) list(APPEND LLDB_SYSTEM_LIBS atomic) endif() Index: llvm/cmake/modules/CheckAtomic.cmake =================================================================== --- llvm/cmake/modules/CheckAtomic.cmake +++ llvm/cmake/modules/CheckAtomic.cmake @@ -6,75 +6,72 @@ # Sometimes linking against libatomic is required for atomic ops, if # the platform doesn't support lock-free atomics. -function(check_working_cxx_atomics varname) +function(check_working_cxx_atomics suffix varname) set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") - CHECK_CXX_SOURCE_COMPILES(" -#include -std::atomic x; -int main() { - return x; -} -" ${varname}) - set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) -endfunction(check_working_cxx_atomics) + if (CMAKE_C_FLAGS MATCHES -fsanitize OR CMAKE_CXX_FLAGS MATCHES -fsanitize) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize=all") + endif() + if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize-coverage=edge,trace-cmp,indirect-calls,8bit-counters") + endif() -function(check_working_cxx_atomics64 varname) - set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) - set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}") - CHECK_CXX_SOURCE_COMPILES(" -#include -#include -std::atomic x (0); -int main() { - uint64_t i = x.load(std::memory_order_relaxed); - return 0; -} -" ${varname}) + if (suffix STREQUAL "32") + CHECK_CXX_SOURCE_COMPILES(" + #include + #include + std::atomic x(0); + std::atomic y(0); + int main() { + uint32_t i = x.load(std::memory_order_relaxed); + float j = y.load(std::memory_order_relaxed); + return 0; + } + " ${varname}) + elseif (suffix STREQUAL "64") + CHECK_CXX_SOURCE_COMPILES(" + #include + #include + std::atomic x(0); + std::atomic y(0); + int main() { + uint64_t i = x.load(std::memory_order_relaxed); + double j = y.load(std::memory_order_relaxed); + return 0; + } + " ${varname}) + else() + message(FATAL_ERROR "check_working_cxx_atomics: Unkown suffix ${suffix}.") + endif() set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) -endfunction(check_working_cxx_atomics64) +endfunction(check_working_cxx_atomics) +function(pop_libatomics_vars suffix) + # 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) + # First check if atomics work without the library. + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics(${suffix} HAVE_CXX_ATOMICS${suffix}_WITHOUT_LIB) -# 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) - # 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 ) + # If not, check if atomics work with it. + if(NOT HAVE_CXX_ATOMICS${suffix}_WITHOUT_LIB) 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!") + check_working_cxx_atomics(${suffix} HAVE_CXX_ATOMICS${suffix}_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS${suffix}_WITH_LIB) + message(FATAL_ERROR "Host compiler must support ${suffix}-bit 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() - 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 64-bit std::atomic!") + elseif() + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) endif() else() - message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.") + set(HAVE_CXX_ATOMICS${suffix}_WITHOUT_LIB True) endif() -endif() +endfunction(pop_libatomics_vars) + +pop_libatomics_vars("32") +pop_libatomics_vars("64") ## TODO: This define is only used for the legacy atomic operations in ## llvm's Atomic.h, which should be replaced. Other code simply Index: llvm/lib/Support/CMakeLists.txt =================================================================== --- llvm/lib/Support/CMakeLists.txt +++ llvm/lib/Support/CMakeLists.txt @@ -26,7 +26,7 @@ set(system_libs ${system_libs} ${TERMINFO_LIBS}) endif() endif() - if( LLVM_ENABLE_THREADS AND HAVE_LIBATOMIC ) + if( LLVM_ENABLE_THREADS AND HAVE_CXX_LIBATOMICS32 ) set(system_libs ${system_libs} atomic) endif() set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})