Add CMake check for libatomic.
[oota-llvm.git] / cmake / modules / CheckAtomic.cmake
1 # atomic builtins are required for threading support.
2
3 INCLUDE(CheckCXXSourceCompiles)
4
5 check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
6 if (HAVE_LIBATOMIC)
7   list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
8 endif()
9
10 CHECK_CXX_SOURCE_COMPILES("
11 #ifdef _MSC_VER
12 #include <windows.h>
13 #endif
14 int main() {
15 #ifdef _MSC_VER
16         volatile LONG val = 1;
17         MemoryBarrier();
18         InterlockedCompareExchange(&val, 0, 1);
19         InterlockedIncrement(&val);
20         InterlockedDecrement(&val);
21 #else
22         volatile unsigned long val = 1;
23         __sync_synchronize();
24         __sync_val_compare_and_swap(&val, 1, 0);
25         __sync_add_and_fetch(&val, 1);
26         __sync_sub_and_fetch(&val, 1);
27 #endif
28         return 0;
29       }
30 " LLVM_HAS_ATOMICS)
31
32 if( NOT LLVM_HAS_ATOMICS )
33   message(STATUS "Warning: LLVM will be built thread-unsafe because atomic builtins are missing")
34 endif()