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