|  | 
 | CHECK_CXX_SOURCE_COMPILES(" | 
 | #ifdef _MSC_VER | 
 | #include <Intrin.h> /* Workaround for PR19898. */ | 
 | #include <windows.h> | 
 | #endif | 
 | int main() { | 
 | #ifdef _MSC_VER | 
 |         volatile LONG val = 1; | 
 |         MemoryBarrier(); | 
 |         InterlockedCompareExchange(&val, 0, 1); | 
 |         InterlockedIncrement(&val); | 
 |         InterlockedDecrement(&val); | 
 | #else | 
 |         volatile unsigned long val = 1; | 
 |         __sync_synchronize(); | 
 |         __sync_val_compare_and_swap(&val, 1, 0); | 
 |         __sync_add_and_fetch(&val, 1); | 
 |         __sync_sub_and_fetch(&val, 1); | 
 | #endif | 
 |         return 0; | 
 |       } | 
 | " COMPILER_RT_TARGET_HAS_ATOMICS) | 
 |  | 
 | CHECK_CXX_SOURCE_COMPILES(" | 
 | #if defined(__linux__) | 
 | #include <unistd.h> | 
 | #endif | 
 | #include <fcntl.h> | 
 | int fd; | 
 | int main() { | 
 |  struct flock s_flock; | 
 |  | 
 |  s_flock.l_type = F_WRLCK; | 
 |  fcntl(fd, F_SETLKW, &s_flock); | 
 |  return 0; | 
 | } | 
 |  | 
 | " COMPILER_RT_TARGET_HAS_FCNTL_LCK) | 
 |  | 
 | CHECK_CXX_SOURCE_COMPILES(" | 
 | #include <sys/utsname.h> | 
 | int main() { | 
 |  return 0; | 
 | } | 
 |  | 
 | " COMPILER_RT_TARGET_HAS_UNAME) | 
 |  | 
 | add_compiler_rt_component(profile) | 
 |  | 
 | set(PROFILE_SOURCES | 
 |   GCDAProfiling.c | 
 |   InstrProfiling.c | 
 |   InstrProfilingValue.c | 
 |   InstrProfilingBuffer.c | 
 |   InstrProfilingFile.c | 
 |   InstrProfilingMerge.c | 
 |   InstrProfilingMergeFile.c | 
 |   InstrProfilingNameVar.c | 
 |   InstrProfilingWriter.c | 
 |   InstrProfilingPlatformDarwin.c | 
 |   InstrProfilingPlatformFuchsia.c | 
 |   InstrProfilingPlatformLinux.c | 
 |   InstrProfilingPlatformOther.c | 
 |   InstrProfilingRuntime.cc | 
 |   InstrProfilingUtil.c) | 
 |  | 
 | set(PROFILE_HEADERS | 
 |   InstrProfData.inc | 
 |   InstrProfiling.h | 
 |   InstrProfilingInternal.h | 
 |   InstrProfilingPort.h | 
 |   InstrProfilingUtil.h | 
 |   WindowsMMap.h) | 
 |  | 
 | if(WIN32) | 
 |     list(APPEND PROFILE_SOURCES WindowsMMap.c) | 
 | endif() | 
 |  | 
 | if(FUCHSIA OR UNIX) | 
 |  set(EXTRA_FLAGS | 
 |      -fPIC | 
 |      -Wno-pedantic) | 
 | endif() | 
 |  | 
 | if(COMPILER_RT_TARGET_HAS_ATOMICS) | 
 |  set(EXTRA_FLAGS | 
 |      ${EXTRA_FLAGS} | 
 |      -DCOMPILER_RT_HAS_ATOMICS=1) | 
 | endif()  | 
 |  | 
 | if(COMPILER_RT_TARGET_HAS_FCNTL_LCK) | 
 |  set(EXTRA_FLAGS | 
 |      ${EXTRA_FLAGS} | 
 |      -DCOMPILER_RT_HAS_FCNTL_LCK=1) | 
 | endif() | 
 |  | 
 | if(COMPILER_RT_TARGET_HAS_UNAME) | 
 |  set(EXTRA_FLAGS | 
 |      ${EXTRA_FLAGS} | 
 |      -DCOMPILER_RT_HAS_UNAME=1) | 
 | endif() | 
 |  | 
 | # This appears to be a C-only warning banning the use of locals in aggregate | 
 | # initializers. All other compilers accept this, though. | 
 | # nonstandard extension used : 'identifier' : cannot be initialized using address of automatic variable | 
 | append_list_if(COMPILER_RT_HAS_WD4221_FLAG /wd4221 EXTRA_FLAGS) | 
 |  | 
 | if(APPLE) | 
 |   add_compiler_rt_runtime(clang_rt.profile | 
 |     STATIC | 
 |     OS ${PROFILE_SUPPORTED_OS} | 
 |     ARCHS ${PROFILE_SUPPORTED_ARCH} | 
 |     CFLAGS ${EXTRA_FLAGS} | 
 |     SOURCES ${PROFILE_SOURCES} | 
 |     ADDITIONAL_HEADERS ${PROFILE_HEADERS} | 
 |     PARENT_TARGET profile) | 
 | else() | 
 |   add_compiler_rt_runtime(clang_rt.profile | 
 |     STATIC | 
 |     ARCHS ${PROFILE_SUPPORTED_ARCH} | 
 |     CFLAGS ${EXTRA_FLAGS} | 
 |     SOURCES ${PROFILE_SOURCES} | 
 |     ADDITIONAL_HEADERS ${PROFILE_HEADERS} | 
 |     PARENT_TARGET profile) | 
 | endif() |