1 include(CheckCSourceRuns)
2 include(CheckCXXSourceRuns)
4 # sets HAVE_ATOMICS, checks for :
5 # - C++11 std::atomic: HAVE_CXX_STDATOMIC
6 # - C11 stdatomic: HAVE_C_STDATOMIC
7 # - builtin __atomic: HAVE_BUILTIN_ATOMIC
8 # - builtin __sync: HAVE_BUILTIN_SYNC
9 # - atomic_add_nv: HAVE_ATOMIC_ADD_NV
10 function(check_atomics)
11 check_cxx_source_runs("
14 std::atomic<int> i(0);
15 return atomic_load(&i);
19 #include <stdatomic.h>
23 return atomic_load(&i);
26 foreach(BUILTIN_ATOMIC_PREFIX IN ITEMS _ __c11)
30 return ${BUILTIN_ATOMIC_PREFIX}_atomic_add_fetch(&l,1,__ATOMIC_RELAXED);
32 HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX})
33 if (HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX})
34 set(HAVE_BUILTIN_ATOMIC 1)
41 return __sync_add_and_fetch(&l,1);
47 volatile uint_t i = 0;
48 return atomic_add_int_nv(&i, 1) == 1 ? 0 : -1;
51 if ( HAVE_CXX_STDATOMIC
53 OR HAVE_BUILTIN_ATOMIC
55 OR HAVE_ATOMIC_ADD_NV)
56 set(HAVE_ATOMICS 1 PARENT_SCOPE)