1include(CMakePushCheckState) 2include(CheckCCompilerFlag) 3include(CheckCXXCompilerFlag) 4include(CheckIncludeFiles) 5include(CheckLibraryExists) 6include(CheckSymbolExists) 7include(TestBigEndian) 8 9function(compiler_rt_check_linker_flag flag out_var) 10 cmake_push_check_state() 11 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag}") 12 check_cxx_compiler_flag("" ${out_var}) 13 cmake_pop_check_state() 14endfunction() 15 16check_library_exists(c fopen "" COMPILER_RT_HAS_LIBC) 17if (COMPILER_RT_USE_BUILTINS_LIBRARY) 18 include(HandleCompilerRT) 19 find_compiler_rt_library(builtins "" COMPILER_RT_BUILTINS_LIBRARY) 20else() 21 if (ANDROID) 22 check_library_exists(gcc __gcc_personality_v0 "" COMPILER_RT_HAS_GCC_LIB) 23 else() 24 check_library_exists(gcc_s __gcc_personality_v0 "" COMPILER_RT_HAS_GCC_S_LIB) 25 endif() 26endif() 27 28check_c_compiler_flag(-nodefaultlibs COMPILER_RT_HAS_NODEFAULTLIBS_FLAG) 29if (COMPILER_RT_HAS_NODEFAULTLIBS_FLAG) 30 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs") 31 if (COMPILER_RT_HAS_LIBC) 32 list(APPEND CMAKE_REQUIRED_LIBRARIES c) 33 endif () 34 if (COMPILER_RT_USE_BUILTINS_LIBRARY) 35 list(APPEND CMAKE_REQUIRED_LIBRARIES "${COMPILER_RT_BUILTINS_LIBRARY}") 36 elseif (COMPILER_RT_HAS_GCC_S_LIB) 37 list(APPEND CMAKE_REQUIRED_LIBRARIES gcc_s) 38 elseif (COMPILER_RT_HAS_GCC_LIB) 39 list(APPEND CMAKE_REQUIRED_LIBRARIES gcc) 40 endif () 41 if (MINGW) 42 # Mingw64 requires quite a few "C" runtime libraries in order for basic 43 # programs to link successfully with -nodefaultlibs. 44 if (COMPILER_RT_USE_BUILTINS_LIBRARY) 45 set(MINGW_RUNTIME ${COMPILER_RT_BUILTINS_LIBRARY}) 46 else () 47 set(MINGW_RUNTIME gcc_s gcc) 48 endif() 49 set(MINGW_LIBRARIES mingw32 ${MINGW_RUNTIME} moldname mingwex msvcrt advapi32 50 shell32 user32 kernel32 mingw32 ${MINGW_RUNTIME} 51 moldname mingwex msvcrt) 52 list(APPEND CMAKE_REQUIRED_LIBRARIES ${MINGW_LIBRARIES}) 53 endif() 54endif () 55 56# CodeGen options. 57check_c_compiler_flag(-ffreestanding COMPILER_RT_HAS_FFREESTANDING_FLAG) 58check_c_compiler_flag(-fomit-frame-pointer COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG) 59check_c_compiler_flag(-std=c11 COMPILER_RT_HAS_STD_C11_FLAG) 60check_cxx_compiler_flag(-fPIC COMPILER_RT_HAS_FPIC_FLAG) 61check_cxx_compiler_flag(-fPIE COMPILER_RT_HAS_FPIE_FLAG) 62check_cxx_compiler_flag(-fno-builtin COMPILER_RT_HAS_FNO_BUILTIN_FLAG) 63check_cxx_compiler_flag(-fno-exceptions COMPILER_RT_HAS_FNO_EXCEPTIONS_FLAG) 64check_cxx_compiler_flag(-fomit-frame-pointer COMPILER_RT_HAS_FOMIT_FRAME_POINTER_FLAG) 65check_cxx_compiler_flag(-funwind-tables COMPILER_RT_HAS_FUNWIND_TABLES_FLAG) 66check_cxx_compiler_flag(-fno-stack-protector COMPILER_RT_HAS_FNO_STACK_PROTECTOR_FLAG) 67check_cxx_compiler_flag(-fno-sanitize=safe-stack COMPILER_RT_HAS_FNO_SANITIZE_SAFE_STACK_FLAG) 68check_cxx_compiler_flag(-fvisibility=hidden COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG) 69check_cxx_compiler_flag(-frtti COMPILER_RT_HAS_FRTTI_FLAG) 70check_cxx_compiler_flag(-fno-rtti COMPILER_RT_HAS_FNO_RTTI_FLAG) 71check_cxx_compiler_flag("-Werror -fno-function-sections" COMPILER_RT_HAS_FNO_FUNCTION_SECTIONS_FLAG) 72check_cxx_compiler_flag(-std=c++14 COMPILER_RT_HAS_STD_CXX14_FLAG) 73check_cxx_compiler_flag(-ftls-model=initial-exec COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC) 74check_cxx_compiler_flag(-fno-lto COMPILER_RT_HAS_FNO_LTO_FLAG) 75check_cxx_compiler_flag(-fno-profile-generate COMPILER_RT_HAS_FNO_PROFILE_GENERATE_FLAG) 76check_cxx_compiler_flag(-fno-profile-instr-generate COMPILER_RT_HAS_FNO_PROFILE_INSTR_GENERATE_FLAG) 77check_cxx_compiler_flag(-fno-profile-instr-use COMPILER_RT_HAS_FNO_PROFILE_INSTR_USE_FLAG) 78check_cxx_compiler_flag("-Werror -msse3" COMPILER_RT_HAS_MSSE3_FLAG) 79check_cxx_compiler_flag("-Werror -msse4.2" COMPILER_RT_HAS_MSSE4_2_FLAG) 80check_cxx_compiler_flag(--sysroot=. COMPILER_RT_HAS_SYSROOT_FLAG) 81check_cxx_compiler_flag("-Werror -mcrc" COMPILER_RT_HAS_MCRC_FLAG) 82check_cxx_compiler_flag(-fno-partial-inlining COMPILER_RT_HAS_FNO_PARTIAL_INLINING_FLAG) 83 84if(NOT WIN32 AND NOT CYGWIN) 85 # MinGW warns if -fvisibility-inlines-hidden is used. 86 check_cxx_compiler_flag("-fvisibility-inlines-hidden" COMPILER_RT_HAS_FVISIBILITY_INLINES_HIDDEN_FLAG) 87endif() 88 89check_cxx_compiler_flag(/GR COMPILER_RT_HAS_GR_FLAG) 90check_cxx_compiler_flag(/GS COMPILER_RT_HAS_GS_FLAG) 91check_cxx_compiler_flag(/MT COMPILER_RT_HAS_MT_FLAG) 92check_cxx_compiler_flag(/Oy COMPILER_RT_HAS_Oy_FLAG) 93 94# Debug info flags. 95check_cxx_compiler_flag(-gline-tables-only COMPILER_RT_HAS_GLINE_TABLES_ONLY_FLAG) 96check_cxx_compiler_flag(-g COMPILER_RT_HAS_G_FLAG) 97check_cxx_compiler_flag(/Zi COMPILER_RT_HAS_Zi_FLAG) 98 99# Warnings. 100check_cxx_compiler_flag(-Wall COMPILER_RT_HAS_WALL_FLAG) 101check_cxx_compiler_flag(-Werror COMPILER_RT_HAS_WERROR_FLAG) 102check_cxx_compiler_flag("-Werror -Wframe-larger-than=512" COMPILER_RT_HAS_WFRAME_LARGER_THAN_FLAG) 103check_cxx_compiler_flag("-Werror -Wglobal-constructors" COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG) 104check_cxx_compiler_flag("-Werror -Wc99-extensions" COMPILER_RT_HAS_WC99_EXTENSIONS_FLAG) 105check_cxx_compiler_flag("-Werror -Wgnu" COMPILER_RT_HAS_WGNU_FLAG) 106check_cxx_compiler_flag("-Werror -Wnon-virtual-dtor" COMPILER_RT_HAS_WNON_VIRTUAL_DTOR_FLAG) 107check_cxx_compiler_flag("-Werror -Wvariadic-macros" COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG) 108check_cxx_compiler_flag("-Werror -Wunused-parameter" COMPILER_RT_HAS_WUNUSED_PARAMETER_FLAG) 109check_cxx_compiler_flag("-Werror -Wcovered-switch-default" COMPILER_RT_HAS_WCOVERED_SWITCH_DEFAULT_FLAG) 110check_cxx_compiler_flag("-Werror -Wsuggest-override" COMPILER_RT_HAS_WSUGGEST_OVERRIDE_FLAG) 111check_cxx_compiler_flag(-Wno-pedantic COMPILER_RT_HAS_WNO_PEDANTIC) 112 113check_cxx_compiler_flag(/W4 COMPILER_RT_HAS_W4_FLAG) 114check_cxx_compiler_flag(/WX COMPILER_RT_HAS_WX_FLAG) 115check_cxx_compiler_flag(/wd4146 COMPILER_RT_HAS_WD4146_FLAG) 116check_cxx_compiler_flag(/wd4291 COMPILER_RT_HAS_WD4291_FLAG) 117check_cxx_compiler_flag(/wd4221 COMPILER_RT_HAS_WD4221_FLAG) 118check_cxx_compiler_flag(/wd4391 COMPILER_RT_HAS_WD4391_FLAG) 119check_cxx_compiler_flag(/wd4722 COMPILER_RT_HAS_WD4722_FLAG) 120check_cxx_compiler_flag(/wd4800 COMPILER_RT_HAS_WD4800_FLAG) 121 122# Symbols. 123check_symbol_exists(__func__ "" COMPILER_RT_HAS_FUNC_SYMBOL) 124 125# Includes. 126check_cxx_compiler_flag(-nostdinc++ COMPILER_RT_HAS_NOSTDINCXX_FLAG) 127check_cxx_compiler_flag(-nostdlib++ COMPILER_RT_HAS_NOSTDLIBXX_FLAG) 128check_include_files("sys/auxv.h" COMPILER_RT_HAS_AUXV) 129 130# Libraries. 131check_library_exists(dl dlopen "" COMPILER_RT_HAS_LIBDL) 132check_library_exists(rt shm_open "" COMPILER_RT_HAS_LIBRT) 133check_library_exists(m pow "" COMPILER_RT_HAS_LIBM) 134check_library_exists(pthread pthread_create "" COMPILER_RT_HAS_LIBPTHREAD) 135check_library_exists(execinfo backtrace "" COMPILER_RT_HAS_LIBEXECINFO) 136 137# Look for terminfo library, used in unittests that depend on LLVMSupport. 138if(LLVM_ENABLE_TERMINFO STREQUAL FORCE_ON) 139 set(MAYBE_REQUIRED REQUIRED) 140else() 141 set(MAYBE_REQUIRED) 142endif() 143if(LLVM_ENABLE_TERMINFO) 144 find_library(COMPILER_RT_TERMINFO_LIB NAMES terminfo tinfo curses ncurses ncursesw ${MAYBE_REQUIRED}) 145endif() 146if(COMPILER_RT_TERMINFO_LIB) 147 set(LLVM_ENABLE_TERMINFO 1) 148else() 149 set(LLVM_ENABLE_TERMINFO 0) 150endif() 151 152if (ANDROID AND COMPILER_RT_HAS_LIBDL) 153 # Android's libstdc++ has a dependency on libdl. 154 list(APPEND CMAKE_REQUIRED_LIBRARIES dl) 155endif() 156check_library_exists(c++ __cxa_throw "" COMPILER_RT_HAS_LIBCXX) 157check_library_exists(stdc++ __cxa_throw "" COMPILER_RT_HAS_LIBSTDCXX) 158 159# Linker flags. 160compiler_rt_check_linker_flag("-Wl,-z,text" COMPILER_RT_HAS_Z_TEXT) 161compiler_rt_check_linker_flag("-fuse-ld=lld" COMPILER_RT_HAS_FUSE_LD_LLD_FLAG) 162 163set(VERS_COMPAT_OPTION "-Wl,-z,gnu-version-script-compat") 164compiler_rt_check_linker_flag("${VERS_COMPAT_OPTION}" COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT) 165 166set(DUMMY_VERS ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/dummy.vers) 167file(WRITE ${DUMMY_VERS} "{};") 168set(VERS_OPTION "-Wl,--version-script,${DUMMY_VERS}") 169if(COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT) 170 # Solaris 11.4 ld only supports --version-script with 171 # -z gnu-version-script-compat. 172 string(APPEND VERS_OPTION " ${VERS_COMPAT_OPTION}") 173endif() 174compiler_rt_check_linker_flag("${VERS_OPTION}" COMPILER_RT_HAS_VERSION_SCRIPT) 175 176if(ANDROID) 177 compiler_rt_check_linker_flag("-Wl,-z,global" COMPILER_RT_HAS_Z_GLOBAL) 178 check_library_exists(log __android_log_write "" COMPILER_RT_HAS_LIBLOG) 179endif() 180 181# Architectures. 182 183# List of all architectures we can target. 184set(COMPILER_RT_SUPPORTED_ARCH) 185 186# Try to compile a very simple source file to ensure we can target the given 187# platform. We use the results of these tests to build only the various target 188# runtime libraries supported by our current compilers cross-compiling 189# abilities. 190set(SIMPLE_SOURCE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple.cc) 191file(WRITE ${SIMPLE_SOURCE} "#include <stdlib.h>\n#include <stdio.h>\nint main() { printf(\"hello, world\"); }\n") 192 193# Detect whether the current target platform is 32-bit or 64-bit, and setup 194# the correct commandline flags needed to attempt to target 32-bit and 64-bit. 195if (NOT CMAKE_SIZEOF_VOID_P EQUAL 4 AND 196 NOT CMAKE_SIZEOF_VOID_P EQUAL 8) 197 message(FATAL_ERROR "Please use architecture with 4 or 8 byte pointers.") 198endif() 199 200test_targets() 201 202# Returns a list of architecture specific target cflags in @out_var list. 203function(get_target_flags_for_arch arch out_var) 204 list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX) 205 if(ARCH_INDEX EQUAL -1) 206 message(FATAL_ERROR "Unsupported architecture: ${arch}") 207 else() 208 if (NOT APPLE) 209 set(${out_var} ${TARGET_${arch}_CFLAGS} PARENT_SCOPE) 210 else() 211 # This is only called in constructing cflags for tests executing on the 212 # host. This will need to all be cleaned up to support building tests 213 # for cross-targeted hardware (i.e. iOS). 214 set(${out_var} -arch ${arch} PARENT_SCOPE) 215 endif() 216 endif() 217endfunction() 218 219# Returns a compiler and CFLAGS that should be used to run tests for the 220# specific architecture. When cross-compiling, this is controled via 221# COMPILER_RT_TEST_COMPILER and COMPILER_RT_TEST_COMPILER_CFLAGS. 222macro(get_test_cc_for_arch arch cc_out cflags_out) 223 if(ANDROID OR ${arch} MATCHES "arm|aarch64|riscv32|riscv64") 224 # This is only true if we are cross-compiling. 225 # Build all tests with host compiler and use host tools. 226 set(${cc_out} ${COMPILER_RT_TEST_COMPILER}) 227 set(${cflags_out} ${COMPILER_RT_TEST_COMPILER_CFLAGS}) 228 else() 229 get_target_flags_for_arch(${arch} ${cflags_out}) 230 if(APPLE) 231 list(APPEND ${cflags_out} ${DARWIN_osx_CFLAGS}) 232 endif() 233 string(REPLACE ";" " " ${cflags_out} "${${cflags_out}}") 234 endif() 235endmacro() 236 237# Returns CFLAGS that should be used to run tests for the 238# specific apple platform and architecture. 239function(get_test_cflags_for_apple_platform platform arch cflags_out) 240 is_valid_apple_platform("${platform}" is_valid_platform) 241 if (NOT is_valid_platform) 242 message(FATAL_ERROR "\"${platform}\" is not a valid apple platform") 243 endif() 244 set(test_cflags "") 245 get_target_flags_for_arch(${arch} test_cflags) 246 list(APPEND test_cflags ${DARWIN_${platform}_CFLAGS}) 247 string(REPLACE ";" " " test_cflags_str "${test_cflags}") 248 string(APPEND test_cflags_str "${COMPILER_RT_TEST_COMPILER_CFLAGS}") 249 set(${cflags_out} "${test_cflags_str}" PARENT_SCOPE) 250endfunction() 251 252function(get_capitalized_apple_platform platform platform_capitalized) 253 # TODO(dliew): Remove uses of this function. It exists to preserve needlessly complex 254 # directory naming conventions used by the Sanitizer lit test suites. 255 is_valid_apple_platform("${platform}" is_valid_platform) 256 if (NOT is_valid_platform) 257 message(FATAL_ERROR "\"${platform}\" is not a valid apple platform") 258 endif() 259 string(TOUPPER "${platform}" platform_upper) 260 string(REGEX REPLACE "OSSIM$" "OSSim" platform_upper_capitalized "${platform_upper}") 261 set(${platform_capitalized} "${platform_upper_capitalized}" PARENT_SCOPE) 262endfunction() 263 264function(is_valid_apple_platform platform is_valid_out) 265 set(is_valid FALSE) 266 if ("${platform}" STREQUAL "") 267 message(FATAL_ERROR "platform cannot be empty") 268 endif() 269 if ("${platform}" MATCHES "^(osx|((ios|watchos|tvos)(sim)?))$") 270 set(is_valid TRUE) 271 endif() 272 set(${is_valid_out} ${is_valid} PARENT_SCOPE) 273endfunction() 274 275set(ARM64 aarch64) 276set(ARM32 arm armhf) 277set(HEXAGON hexagon) 278set(X86 i386) 279set(X86_64 x86_64) 280set(MIPS32 mips mipsel) 281set(MIPS64 mips64 mips64el) 282set(PPC32 powerpc) 283set(PPC64 powerpc64 powerpc64le) 284set(RISCV32 riscv32) 285set(RISCV64 riscv64) 286set(S390X s390x) 287set(SPARC sparc) 288set(SPARCV9 sparcv9) 289set(WASM32 wasm32) 290set(WASM64 wasm64) 291set(VE ve) 292 293if(APPLE) 294 set(ARM64 arm64) 295 set(ARM32 armv7 armv7s armv7k) 296 set(X86_64 x86_64 x86_64h) 297endif() 298 299set(ALL_SANITIZER_COMMON_SUPPORTED_ARCH ${X86} ${X86_64} ${PPC64} ${RISCV64} 300 ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} ${S390X} ${SPARC} ${SPARCV9}) 301set(ALL_ASAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV64} 302 ${MIPS32} ${MIPS64} ${PPC64} ${S390X} ${SPARC} ${SPARCV9}) 303set(ALL_CRT_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV32} ${RISCV64} ${VE}) 304set(ALL_DFSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64}) 305 306if(ANDROID) 307 set(OS_NAME "Android") 308else() 309 set(OS_NAME "${CMAKE_SYSTEM_NAME}") 310endif() 311 312if(OS_NAME MATCHES "Linux") 313 set(ALL_FUZZER_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM64} ${S390X}) 314elseif (OS_NAME MATCHES "Windows") 315 set(ALL_FUZZER_SUPPORTED_ARCH ${X86} ${X86_64}) 316elseif(OS_NAME MATCHES "Android") 317 set(ALL_FUZZER_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64}) 318else() 319 set(ALL_FUZZER_SUPPORTED_ARCH ${X86_64} ${ARM64}) 320endif() 321 322set(ALL_GWP_ASAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64}) 323if(APPLE) 324 set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64}) 325else() 326 set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64} ${ARM32} ${PPC64} ${S390X} ${RISCV64}) 327endif() 328set(ALL_MSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${PPC64} ${S390X}) 329set(ALL_HWASAN_SUPPORTED_ARCH ${X86_64} ${ARM64}) 330set(ALL_MEMPROF_SUPPORTED_ARCH ${X86_64}) 331set(ALL_PROFILE_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${PPC32} ${PPC64} 332 ${MIPS32} ${MIPS64} ${S390X} ${SPARC} ${SPARCV9}) 333set(ALL_TSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${PPC64} ${S390X}) 334set(ALL_UBSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV64} 335 ${MIPS32} ${MIPS64} ${PPC64} ${S390X} ${SPARC} ${SPARCV9}) 336set(ALL_SAFESTACK_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM64} ${MIPS32} ${MIPS64}) 337set(ALL_CFI_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${MIPS64}) 338set(ALL_SCUDO_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} ${PPC64}) 339set(ALL_SCUDO_STANDALONE_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} ${PPC64}) 340if(APPLE) 341set(ALL_XRAY_SUPPORTED_ARCH ${X86_64}) 342else() 343set(ALL_XRAY_SUPPORTED_ARCH ${X86_64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} powerpc64le) 344endif() 345set(ALL_SHADOWCALLSTACK_SUPPORTED_ARCH ${ARM64}) 346 347if (UNIX) 348set(ALL_ORC_SUPPORTED_ARCH ${X86_64}) 349endif() 350 351if(APPLE) 352 include(CompilerRTDarwinUtils) 353 354 find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx) 355 find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator) 356 find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos) 357 find_darwin_sdk_dir(DARWIN_watchossim_SYSROOT watchsimulator) 358 find_darwin_sdk_dir(DARWIN_watchos_SYSROOT watchos) 359 find_darwin_sdk_dir(DARWIN_tvossim_SYSROOT appletvsimulator) 360 find_darwin_sdk_dir(DARWIN_tvos_SYSROOT appletvos) 361 362 if(NOT DARWIN_osx_SYSROOT) 363 message(WARNING "Could not determine OS X sysroot, trying /usr/include") 364 if(EXISTS /usr/include) 365 set(DARWIN_osx_SYSROOT /) 366 else() 367 message(ERROR "Could not detect OS X Sysroot. Either install Xcode or the Apple Command Line Tools") 368 endif() 369 endif() 370 371 if(COMPILER_RT_ENABLE_IOS) 372 list(APPEND DARWIN_EMBEDDED_PLATFORMS ios) 373 set(DARWIN_ios_MIN_VER 9.0) 374 set(DARWIN_ios_MIN_VER_FLAG -miphoneos-version-min) 375 set(DARWIN_ios_SANITIZER_MIN_VER_FLAG 376 ${DARWIN_ios_MIN_VER_FLAG}=${DARWIN_ios_MIN_VER}) 377 set(DARWIN_iossim_MIN_VER_FLAG -mios-simulator-version-min) 378 set(DARWIN_iossim_SANITIZER_MIN_VER_FLAG 379 ${DARWIN_iossim_MIN_VER_FLAG}=${DARWIN_ios_MIN_VER}) 380 endif() 381 if(COMPILER_RT_ENABLE_WATCHOS) 382 list(APPEND DARWIN_EMBEDDED_PLATFORMS watchos) 383 set(DARWIN_watchos_MIN_VER 2.0) 384 set(DARWIN_watchos_MIN_VER_FLAG -mwatchos-version-min) 385 set(DARWIN_watchos_SANITIZER_MIN_VER_FLAG 386 ${DARWIN_watchos_MIN_VER_FLAG}=${DARWIN_watchos_MIN_VER}) 387 set(DARWIN_watchossim_MIN_VER_FLAG -mwatchos-simulator-version-min) 388 set(DARWIN_watchossim_SANITIZER_MIN_VER_FLAG 389 ${DARWIN_watchossim_MIN_VER_FLAG}=${DARWIN_watchos_MIN_VER}) 390 endif() 391 if(COMPILER_RT_ENABLE_TVOS) 392 list(APPEND DARWIN_EMBEDDED_PLATFORMS tvos) 393 set(DARWIN_tvos_MIN_VER 9.0) 394 set(DARWIN_tvos_MIN_VER_FLAG -mtvos-version-min) 395 set(DARWIN_tvos_SANITIZER_MIN_VER_FLAG 396 ${DARWIN_tvos_MIN_VER_FLAG}=${DARWIN_tvos_MIN_VER}) 397 set(DARWIN_tvossim_MIN_VER_FLAG -mtvos-simulator-version-min) 398 set(DARWIN_tvossim_SANITIZER_MIN_VER_FLAG 399 ${DARWIN_tvossim_MIN_VER_FLAG}=${DARWIN_tvos_MIN_VER}) 400 endif() 401 402 set(SANITIZER_COMMON_SUPPORTED_OS osx) 403 set(PROFILE_SUPPORTED_OS osx) 404 set(TSAN_SUPPORTED_OS osx) 405 set(XRAY_SUPPORTED_OS osx) 406 set(FUZZER_SUPPORTED_OS osx) 407 set(ORC_SUPPORTED_OS osx) 408 409 # Note: In order to target x86_64h on OS X the minimum deployment target must 410 # be 10.8 or higher. 411 set(DEFAULT_SANITIZER_MIN_OSX_VERSION 10.10) 412 set(DARWIN_osx_MIN_VER_FLAG "-mmacosx-version-min") 413 if(NOT SANITIZER_MIN_OSX_VERSION) 414 string(REGEX MATCH "${DARWIN_osx_MIN_VER_FLAG}=([.0-9]+)" 415 MACOSX_VERSION_MIN_FLAG "${CMAKE_CXX_FLAGS}") 416 if(MACOSX_VERSION_MIN_FLAG) 417 set(SANITIZER_MIN_OSX_VERSION "${CMAKE_MATCH_1}") 418 elseif(CMAKE_OSX_DEPLOYMENT_TARGET) 419 set(SANITIZER_MIN_OSX_VERSION ${CMAKE_OSX_DEPLOYMENT_TARGET}) 420 else() 421 set(SANITIZER_MIN_OSX_VERSION ${DEFAULT_SANITIZER_MIN_OSX_VERSION}) 422 endif() 423 if(SANITIZER_MIN_OSX_VERSION VERSION_LESS "10.7") 424 message(FATAL_ERROR "macOS deployment target '${SANITIZER_MIN_OSX_VERSION}' is too old.") 425 endif() 426 if(SANITIZER_MIN_OSX_VERSION VERSION_GREATER ${DEFAULT_SANITIZER_MIN_OSX_VERSION}) 427 message(WARNING "macOS deployment target '${SANITIZER_MIN_OSX_VERSION}' is too new, setting to '${DEFAULT_SANITIZER_MIN_OSX_VERSION}' instead.") 428 set(SANITIZER_MIN_OSX_VERSION ${DEFAULT_SANITIZER_MIN_OSX_VERSION}) 429 endif() 430 endif() 431 432 # We're setting the flag manually for each target OS 433 set(CMAKE_OSX_DEPLOYMENT_TARGET "") 434 435 set(DARWIN_COMMON_CFLAGS -stdlib=libc++) 436 set(DARWIN_COMMON_LINK_FLAGS 437 -stdlib=libc++ 438 -lc++ 439 -lc++abi) 440 441 compiler_rt_check_linker_flag("-fapplication-extension" COMPILER_RT_HAS_APP_EXTENSION) 442 if(COMPILER_RT_HAS_APP_EXTENSION) 443 list(APPEND DARWIN_COMMON_LINK_FLAGS "-fapplication-extension") 444 endif() 445 446 set(DARWIN_osx_CFLAGS 447 ${DARWIN_COMMON_CFLAGS} 448 ${DARWIN_osx_MIN_VER_FLAG}=${SANITIZER_MIN_OSX_VERSION}) 449 set(DARWIN_osx_LINK_FLAGS 450 ${DARWIN_COMMON_LINK_FLAGS} 451 ${DARWIN_osx_MIN_VER_FLAG}=${SANITIZER_MIN_OSX_VERSION}) 452 453 if(DARWIN_osx_SYSROOT) 454 list(APPEND DARWIN_osx_CFLAGS -isysroot ${DARWIN_osx_SYSROOT}) 455 list(APPEND DARWIN_osx_LINK_FLAGS -isysroot ${DARWIN_osx_SYSROOT}) 456 endif() 457 458 # Figure out which arches to use for each OS 459 darwin_get_toolchain_supported_archs(toolchain_arches) 460 message(STATUS "Toolchain supported arches: ${toolchain_arches}") 461 462 if(NOT MACOSX_VERSION_MIN_FLAG) 463 darwin_test_archs(osx 464 DARWIN_osx_ARCHS 465 ${toolchain_arches}) 466 message(STATUS "OSX supported arches: ${DARWIN_osx_ARCHS}") 467 foreach(arch ${DARWIN_osx_ARCHS}) 468 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 469 set(CAN_TARGET_${arch} 1) 470 endforeach() 471 472 foreach(platform ${DARWIN_EMBEDDED_PLATFORMS}) 473 if(DARWIN_${platform}sim_SYSROOT) 474 set(DARWIN_${platform}sim_CFLAGS 475 ${DARWIN_COMMON_CFLAGS} 476 ${DARWIN_${platform}sim_SANITIZER_MIN_VER_FLAG} 477 -isysroot ${DARWIN_${platform}sim_SYSROOT}) 478 set(DARWIN_${platform}sim_LINK_FLAGS 479 ${DARWIN_COMMON_LINK_FLAGS} 480 ${DARWIN_${platform}sim_SANITIZER_MIN_VER_FLAG} 481 -isysroot ${DARWIN_${platform}sim_SYSROOT}) 482 483 set(DARWIN_${platform}sim_SKIP_CC_KEXT On) 484 darwin_test_archs(${platform}sim 485 DARWIN_${platform}sim_ARCHS 486 ${toolchain_arches}) 487 message(STATUS "${platform} Simulator supported arches: ${DARWIN_${platform}sim_ARCHS}") 488 if(DARWIN_${platform}sim_ARCHS) 489 list(APPEND SANITIZER_COMMON_SUPPORTED_OS ${platform}sim) 490 list(APPEND PROFILE_SUPPORTED_OS ${platform}sim) 491 list(APPEND TSAN_SUPPORTED_OS ${platform}sim) 492 list(APPEND FUZZER_SUPPORTED_OS ${platform}sim) 493 endif() 494 foreach(arch ${DARWIN_${platform}sim_ARCHS}) 495 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 496 set(CAN_TARGET_${arch} 1) 497 endforeach() 498 endif() 499 500 if(DARWIN_${platform}_SYSROOT) 501 set(DARWIN_${platform}_CFLAGS 502 ${DARWIN_COMMON_CFLAGS} 503 ${DARWIN_${platform}_SANITIZER_MIN_VER_FLAG} 504 -isysroot ${DARWIN_${platform}_SYSROOT}) 505 set(DARWIN_${platform}_LINK_FLAGS 506 ${DARWIN_COMMON_LINK_FLAGS} 507 ${DARWIN_${platform}_SANITIZER_MIN_VER_FLAG} 508 -isysroot ${DARWIN_${platform}_SYSROOT}) 509 510 darwin_test_archs(${platform} 511 DARWIN_${platform}_ARCHS 512 ${toolchain_arches}) 513 message(STATUS "${platform} supported arches: ${DARWIN_${platform}_ARCHS}") 514 if(DARWIN_${platform}_ARCHS) 515 list(APPEND SANITIZER_COMMON_SUPPORTED_OS ${platform}) 516 list(APPEND PROFILE_SUPPORTED_OS ${platform}) 517 518 list_intersect(DARWIN_${platform}_TSAN_ARCHS DARWIN_${platform}_ARCHS ALL_TSAN_SUPPORTED_ARCH) 519 if(DARWIN_${platform}_TSAN_ARCHS) 520 list(APPEND TSAN_SUPPORTED_OS ${platform}) 521 endif() 522 list(APPEND FUZZER_SUPPORTED_OS ${platform}) 523 endif() 524 foreach(arch ${DARWIN_${platform}_ARCHS}) 525 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 526 set(CAN_TARGET_${arch} 1) 527 endforeach() 528 endif() 529 endforeach() 530 endif() 531 532 # Explictly disable unsupported Sanitizer configurations. 533 list(REMOVE_ITEM FUZZER_SUPPORTED_OS "watchos") 534 list(REMOVE_ITEM FUZZER_SUPPORTED_OS "watchossim") 535 536 # for list_intersect 537 include(CompilerRTUtils) 538 539 list_intersect(SANITIZER_COMMON_SUPPORTED_ARCH 540 ALL_SANITIZER_COMMON_SUPPORTED_ARCH 541 COMPILER_RT_SUPPORTED_ARCH 542 ) 543 set(LSAN_COMMON_SUPPORTED_ARCH ${SANITIZER_COMMON_SUPPORTED_ARCH}) 544 set(UBSAN_COMMON_SUPPORTED_ARCH ${SANITIZER_COMMON_SUPPORTED_ARCH}) 545 list_intersect(ASAN_SUPPORTED_ARCH 546 ALL_ASAN_SUPPORTED_ARCH 547 SANITIZER_COMMON_SUPPORTED_ARCH) 548 list_intersect(DFSAN_SUPPORTED_ARCH 549 ALL_DFSAN_SUPPORTED_ARCH 550 SANITIZER_COMMON_SUPPORTED_ARCH) 551 list_intersect(GWP_ASAN_SUPPORTED_ARCH 552 ALL_GWP_ASAN_SUPPORTED_ARCH 553 SANITIZER_COMMON_SUPPORTED_ARCH) 554 list_intersect(LSAN_SUPPORTED_ARCH 555 ALL_LSAN_SUPPORTED_ARCH 556 SANITIZER_COMMON_SUPPORTED_ARCH) 557 list_intersect(MSAN_SUPPORTED_ARCH 558 ALL_MSAN_SUPPORTED_ARCH 559 SANITIZER_COMMON_SUPPORTED_ARCH) 560 list_intersect(HWASAN_SUPPORTED_ARCH 561 ALL_HWASAN_SUPPORTED_ARCH 562 SANITIZER_COMMON_SUPPORTED_ARCH) 563 list_intersect(MEMPROF_SUPPORTED_ARCH 564 ALL_MEMPROF_SUPPORTED_ARCH 565 SANITIZER_COMMON_SUPPORTED_ARCH) 566 list_intersect(PROFILE_SUPPORTED_ARCH 567 ALL_PROFILE_SUPPORTED_ARCH 568 SANITIZER_COMMON_SUPPORTED_ARCH) 569 list_intersect(TSAN_SUPPORTED_ARCH 570 ALL_TSAN_SUPPORTED_ARCH 571 SANITIZER_COMMON_SUPPORTED_ARCH) 572 list_intersect(UBSAN_SUPPORTED_ARCH 573 ALL_UBSAN_SUPPORTED_ARCH 574 SANITIZER_COMMON_SUPPORTED_ARCH) 575 list_intersect(SAFESTACK_SUPPORTED_ARCH 576 ALL_SAFESTACK_SUPPORTED_ARCH 577 SANITIZER_COMMON_SUPPORTED_ARCH) 578 list_intersect(CFI_SUPPORTED_ARCH 579 ALL_CFI_SUPPORTED_ARCH 580 SANITIZER_COMMON_SUPPORTED_ARCH) 581 list_intersect(SCUDO_SUPPORTED_ARCH 582 ALL_SCUDO_SUPPORTED_ARCH 583 SANITIZER_COMMON_SUPPORTED_ARCH) 584 list_intersect(SCUDO_STANDALONE_SUPPORTED_ARCH 585 ALL_SCUDO_STANDALONE_SUPPORTED_ARCH 586 SANITIZER_COMMON_SUPPORTED_ARCH) 587 list_intersect(FUZZER_SUPPORTED_ARCH 588 ALL_FUZZER_SUPPORTED_ARCH 589 SANITIZER_COMMON_SUPPORTED_ARCH) 590 list_intersect(XRAY_SUPPORTED_ARCH 591 ALL_XRAY_SUPPORTED_ARCH 592 SANITIZER_COMMON_SUPPORTED_ARCH) 593 list_intersect(SHADOWCALLSTACK_SUPPORTED_ARCH 594 ALL_SHADOWCALLSTACK_SUPPORTED_ARCH 595 SANITIZER_COMMON_SUPPORTED_ARCH) 596 list_intersect(ORC_SUPPORTED_ARCH 597 ALL_ORC_SUPPORTED_ARCH 598 SANITIZER_COMMON_SUPPORTED_ARCH) 599 600else() 601 filter_available_targets(CRT_SUPPORTED_ARCH ${ALL_CRT_SUPPORTED_ARCH}) 602 # Architectures supported by compiler-rt libraries. 603 filter_available_targets(SANITIZER_COMMON_SUPPORTED_ARCH 604 ${ALL_SANITIZER_COMMON_SUPPORTED_ARCH}) 605 # LSan and UBSan common files should be available on all architectures 606 # supported by other sanitizers (even if they build into dummy object files). 607 filter_available_targets(LSAN_COMMON_SUPPORTED_ARCH 608 ${SANITIZER_COMMON_SUPPORTED_ARCH}) 609 filter_available_targets(UBSAN_COMMON_SUPPORTED_ARCH 610 ${SANITIZER_COMMON_SUPPORTED_ARCH}) 611 filter_available_targets(ASAN_SUPPORTED_ARCH ${ALL_ASAN_SUPPORTED_ARCH}) 612 filter_available_targets(FUZZER_SUPPORTED_ARCH ${ALL_FUZZER_SUPPORTED_ARCH}) 613 filter_available_targets(DFSAN_SUPPORTED_ARCH ${ALL_DFSAN_SUPPORTED_ARCH}) 614 filter_available_targets(LSAN_SUPPORTED_ARCH ${ALL_LSAN_SUPPORTED_ARCH}) 615 filter_available_targets(MSAN_SUPPORTED_ARCH ${ALL_MSAN_SUPPORTED_ARCH}) 616 filter_available_targets(HWASAN_SUPPORTED_ARCH ${ALL_HWASAN_SUPPORTED_ARCH}) 617 filter_available_targets(MEMPROF_SUPPORTED_ARCH ${ALL_MEMPROF_SUPPORTED_ARCH}) 618 filter_available_targets(PROFILE_SUPPORTED_ARCH ${ALL_PROFILE_SUPPORTED_ARCH}) 619 filter_available_targets(TSAN_SUPPORTED_ARCH ${ALL_TSAN_SUPPORTED_ARCH}) 620 filter_available_targets(UBSAN_SUPPORTED_ARCH ${ALL_UBSAN_SUPPORTED_ARCH}) 621 filter_available_targets(SAFESTACK_SUPPORTED_ARCH 622 ${ALL_SAFESTACK_SUPPORTED_ARCH}) 623 filter_available_targets(CFI_SUPPORTED_ARCH ${ALL_CFI_SUPPORTED_ARCH}) 624 filter_available_targets(SCUDO_SUPPORTED_ARCH ${ALL_SCUDO_SUPPORTED_ARCH}) 625 filter_available_targets(SCUDO_STANDALONE_SUPPORTED_ARCH ${ALL_SCUDO_STANDALONE_SUPPORTED_ARCH}) 626 filter_available_targets(XRAY_SUPPORTED_ARCH ${ALL_XRAY_SUPPORTED_ARCH}) 627 filter_available_targets(SHADOWCALLSTACK_SUPPORTED_ARCH 628 ${ALL_SHADOWCALLSTACK_SUPPORTED_ARCH}) 629 filter_available_targets(GWP_ASAN_SUPPORTED_ARCH ${ALL_GWP_ASAN_SUPPORTED_ARCH}) 630 filter_available_targets(ORC_SUPPORTED_ARCH ${ALL_ORC_SUPPORTED_ARCH}) 631endif() 632 633if (MSVC) 634 # See if the DIA SDK is available and usable. 635 set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK") 636 if (IS_DIRECTORY ${MSVC_DIA_SDK_DIR}) 637 set(CAN_SYMBOLIZE 1) 638 else() 639 set(CAN_SYMBOLIZE 0) 640 endif() 641else() 642 set(CAN_SYMBOLIZE 1) 643endif() 644 645find_program(GNU_LD_EXECUTABLE NAMES ${LLVM_DEFAULT_TARGET_TRIPLE}-ld.bfd ld.bfd DOC "GNU ld") 646find_program(GOLD_EXECUTABLE NAMES ${LLVM_DEFAULT_TARGET_TRIPLE}-ld.gold ld.gold DOC "GNU gold") 647 648if(COMPILER_RT_SUPPORTED_ARCH) 649 list(REMOVE_DUPLICATES COMPILER_RT_SUPPORTED_ARCH) 650endif() 651message(STATUS "Compiler-RT supported architectures: ${COMPILER_RT_SUPPORTED_ARCH}") 652 653set(ALL_SANITIZERS asan;dfsan;msan;hwasan;tsan;safestack;cfi;scudo;ubsan_minimal;gwp_asan) 654set(COMPILER_RT_SANITIZERS_TO_BUILD all CACHE STRING 655 "sanitizers to build if supported on the target (all;${ALL_SANITIZERS})") 656list_replace(COMPILER_RT_SANITIZERS_TO_BUILD all "${ALL_SANITIZERS}") 657 658if (SANITIZER_COMMON_SUPPORTED_ARCH AND NOT LLVM_USE_SANITIZER AND 659 (OS_NAME MATCHES "Android|Darwin|Linux|FreeBSD|NetBSD|Fuchsia|SunOS" OR 660 (OS_NAME MATCHES "Windows" AND NOT CYGWIN AND 661 (NOT MINGW OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")))) 662 set(COMPILER_RT_HAS_SANITIZER_COMMON TRUE) 663else() 664 set(COMPILER_RT_HAS_SANITIZER_COMMON FALSE) 665endif() 666 667if (COMPILER_RT_HAS_SANITIZER_COMMON) 668 set(COMPILER_RT_HAS_INTERCEPTION TRUE) 669else() 670 set(COMPILER_RT_HAS_INTERCEPTION FALSE) 671endif() 672 673if (COMPILER_RT_HAS_SANITIZER_COMMON AND ASAN_SUPPORTED_ARCH) 674 set(COMPILER_RT_HAS_ASAN TRUE) 675else() 676 set(COMPILER_RT_HAS_ASAN FALSE) 677endif() 678 679if (OS_NAME MATCHES "Linux|FreeBSD|Windows|NetBSD|SunOS") 680 set(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME TRUE) 681else() 682 set(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME FALSE) 683endif() 684 685# TODO: Add builtins support. 686 687if (CRT_SUPPORTED_ARCH AND OS_NAME MATCHES "Linux" AND NOT LLVM_USE_SANITIZER) 688 set(COMPILER_RT_HAS_CRT TRUE) 689else() 690 set(COMPILER_RT_HAS_CRT FALSE) 691endif() 692 693if (COMPILER_RT_HAS_SANITIZER_COMMON AND DFSAN_SUPPORTED_ARCH AND 694 OS_NAME MATCHES "Linux") 695 set(COMPILER_RT_HAS_DFSAN TRUE) 696else() 697 set(COMPILER_RT_HAS_DFSAN FALSE) 698endif() 699 700if (COMPILER_RT_HAS_SANITIZER_COMMON AND LSAN_SUPPORTED_ARCH AND 701 OS_NAME MATCHES "Android|Darwin|Linux|NetBSD|Fuchsia") 702 set(COMPILER_RT_HAS_LSAN TRUE) 703else() 704 set(COMPILER_RT_HAS_LSAN FALSE) 705endif() 706 707if (COMPILER_RT_HAS_SANITIZER_COMMON AND MSAN_SUPPORTED_ARCH AND 708 OS_NAME MATCHES "Linux|FreeBSD|NetBSD") 709 set(COMPILER_RT_HAS_MSAN TRUE) 710else() 711 set(COMPILER_RT_HAS_MSAN FALSE) 712endif() 713 714if (COMPILER_RT_HAS_SANITIZER_COMMON AND HWASAN_SUPPORTED_ARCH AND 715 OS_NAME MATCHES "Linux|Android") 716 set(COMPILER_RT_HAS_HWASAN TRUE) 717else() 718 set(COMPILER_RT_HAS_HWASAN FALSE) 719endif() 720 721if (COMPILER_RT_HAS_SANITIZER_COMMON AND MEMPROF_SUPPORTED_ARCH AND 722 OS_NAME MATCHES "Linux") 723 set(COMPILER_RT_HAS_MEMPROF TRUE) 724else() 725 set(COMPILER_RT_HAS_MEMPROF FALSE) 726endif() 727 728if (PROFILE_SUPPORTED_ARCH AND NOT LLVM_USE_SANITIZER AND 729 OS_NAME MATCHES "Darwin|Linux|FreeBSD|Windows|Android|Fuchsia|SunOS|NetBSD|AIX") 730 set(COMPILER_RT_HAS_PROFILE TRUE) 731else() 732 set(COMPILER_RT_HAS_PROFILE FALSE) 733endif() 734 735if (COMPILER_RT_HAS_SANITIZER_COMMON AND TSAN_SUPPORTED_ARCH AND 736 OS_NAME MATCHES "Darwin|Linux|FreeBSD|Android|NetBSD") 737 set(COMPILER_RT_HAS_TSAN TRUE) 738else() 739 set(COMPILER_RT_HAS_TSAN FALSE) 740endif() 741 742if (COMPILER_RT_HAS_SANITIZER_COMMON AND UBSAN_SUPPORTED_ARCH AND 743 OS_NAME MATCHES "Darwin|Linux|FreeBSD|NetBSD|Windows|Android|Fuchsia|SunOS") 744 set(COMPILER_RT_HAS_UBSAN TRUE) 745else() 746 set(COMPILER_RT_HAS_UBSAN FALSE) 747endif() 748 749if (COMPILER_RT_HAS_SANITIZER_COMMON AND UBSAN_SUPPORTED_ARCH AND 750 OS_NAME MATCHES "Linux|FreeBSD|NetBSD|Android|Darwin") 751 set(COMPILER_RT_HAS_UBSAN_MINIMAL TRUE) 752else() 753 set(COMPILER_RT_HAS_UBSAN_MINIMAL FALSE) 754endif() 755 756if (COMPILER_RT_HAS_SANITIZER_COMMON AND SAFESTACK_SUPPORTED_ARCH AND 757 OS_NAME MATCHES "Linux|FreeBSD|NetBSD") 758 set(COMPILER_RT_HAS_SAFESTACK TRUE) 759else() 760 set(COMPILER_RT_HAS_SAFESTACK FALSE) 761endif() 762 763if (COMPILER_RT_HAS_SANITIZER_COMMON AND CFI_SUPPORTED_ARCH) 764 set(COMPILER_RT_HAS_CFI TRUE) 765else() 766 set(COMPILER_RT_HAS_CFI FALSE) 767endif() 768 769#TODO(kostyak): add back Android & Fuchsia when the code settles a bit. 770if (SCUDO_STANDALONE_SUPPORTED_ARCH AND OS_NAME MATCHES "Linux" AND 771 COMPILER_RT_HAS_AUXV) 772 set(COMPILER_RT_HAS_SCUDO_STANDALONE TRUE) 773else() 774 set(COMPILER_RT_HAS_SCUDO_STANDALONE FALSE) 775endif() 776 777if (COMPILER_RT_HAS_SANITIZER_COMMON AND SCUDO_SUPPORTED_ARCH AND 778 OS_NAME MATCHES "Linux|Android|Fuchsia") 779 set(COMPILER_RT_HAS_SCUDO TRUE) 780else() 781 set(COMPILER_RT_HAS_SCUDO FALSE) 782endif() 783 784if (COMPILER_RT_HAS_SANITIZER_COMMON AND XRAY_SUPPORTED_ARCH AND 785 OS_NAME MATCHES "Darwin|Linux|FreeBSD|NetBSD|Fuchsia") 786 set(COMPILER_RT_HAS_XRAY TRUE) 787else() 788 set(COMPILER_RT_HAS_XRAY FALSE) 789endif() 790 791if (ORC_SUPPORTED_ARCH) 792 set(COMPILER_RT_HAS_ORC TRUE) 793else() 794 set(COMPILER_RT_HAS_ORC FALSE) 795endif() 796 797if (COMPILER_RT_HAS_SANITIZER_COMMON AND FUZZER_SUPPORTED_ARCH AND 798 OS_NAME MATCHES "Android|Darwin|Linux|NetBSD|FreeBSD|Fuchsia|Windows") 799 set(COMPILER_RT_HAS_FUZZER TRUE) 800else() 801 set(COMPILER_RT_HAS_FUZZER FALSE) 802endif() 803 804if (COMPILER_RT_HAS_SANITIZER_COMMON AND SHADOWCALLSTACK_SUPPORTED_ARCH AND 805 OS_NAME MATCHES "Linux|Android") 806 set(COMPILER_RT_HAS_SHADOWCALLSTACK TRUE) 807else() 808 set(COMPILER_RT_HAS_SHADOWCALLSTACK FALSE) 809endif() 810 811# Note: Fuchsia and Windows are not currently supported by GWP-ASan. Support 812# is planned for these platforms. Darwin is also not supported due to TLS 813# calling malloc on first use. 814# TODO(hctim): Enable this on Android again. Looks like it's causing a SIGSEGV 815# for Scudo and GWP-ASan, further testing needed. 816if (COMPILER_RT_HAS_SANITIZER_COMMON AND GWP_ASAN_SUPPORTED_ARCH AND 817 OS_NAME MATCHES "Linux") 818 set(COMPILER_RT_HAS_GWP_ASAN TRUE) 819else() 820 set(COMPILER_RT_HAS_GWP_ASAN FALSE) 821endif() 822pythonize_bool(COMPILER_RT_HAS_GWP_ASAN) 823