summaryrefslogtreecommitdiffstats
path: root/llvm/cmake/modules/CheckAtomic.cmake
diff options
context:
space:
mode:
authorSagar Thakur <sagar.thakur@imgtec.com>2016-06-23 06:39:35 +0000
committerSagar Thakur <sagar.thakur@imgtec.com>2016-06-23 06:39:35 +0000
commit9e1de099059bc0e63e7ac249d0f2fa8ab51badcf (patch)
tree1fe41c8e4f873712056791b8a7a6f33baa46f44c /llvm/cmake/modules/CheckAtomic.cmake
parent79f53ca0b56fb5c49e390184fc991a70cd01e9d0 (diff)
downloadbcm5719-llvm-9e1de099059bc0e63e7ac249d0f2fa8ab51badcf.tar.gz
bcm5719-llvm-9e1de099059bc0e63e7ac249d0f2fa8ab51badcf.zip
[LLVM][MIPS] Introduce 64 bit atomic check in CheckAtomic.cmake
Patch by Nitesh Jain. Summary: On some target like MIPS32 we need to explicitly link atomic library for 64 bit atomic operations. This module then can be used in LLDB (http://reviews.llvm.org/D20464) or Libcxx (http://reviews.llvm.org/D16613) for explicitly link to atomic library. Reviewers: chandlerc, beanz Differential: reviews.llvm.org/D20896 llvm-svn: 273534
Diffstat (limited to 'llvm/cmake/modules/CheckAtomic.cmake')
-rw-r--r--llvm/cmake/modules/CheckAtomic.cmake37
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/cmake/modules/CheckAtomic.cmake b/llvm/cmake/modules/CheckAtomic.cmake
index 551de6ade84..dcf021b8fdd 100644
--- a/llvm/cmake/modules/CheckAtomic.cmake
+++ b/llvm/cmake/modules/CheckAtomic.cmake
@@ -18,6 +18,22 @@ int main() {
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
endfunction(check_working_cxx_atomics)
+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 <atomic>
+#include <cstdint>
+std::atomic<uint64_t> x (0);
+int main() {
+ uint64_t i = x.load(std::memory_order_relaxed);
+ return 0;
+}
+" ${varname})
+ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
+endfunction(check_working_cxx_atomics64)
+
+
# 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)
@@ -38,6 +54,27 @@ if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
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 std::atomic!")
+ endif()
+ else()
+ message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.")
+ endif()
+endif()
+
## TODO: This define is only used for the legacy atomic operations in
## llvm's Atomic.h, which should be replaced. Other code simply
## assumes C++11 <atomic> works.
OpenPOWER on IntegriCloud