13cab2bb3Spatrickinclude(CMakePushCheckState)
2*810390e3Srobertinclude(LLVMCheckCompilerLinkerFlag)
33cab2bb3Spatrickinclude(CheckCCompilerFlag)
43cab2bb3Spatrickinclude(CheckCXXCompilerFlag)
51f9cb04fSpatrickinclude(CheckIncludeFiles)
63cab2bb3Spatrickinclude(CheckLibraryExists)
7*810390e3Srobertinclude(LLVMCheckCompilerLinkerFlag)
83cab2bb3Spatrickinclude(CheckSymbolExists)
93cab2bb3Spatrickinclude(TestBigEndian)
103cab2bb3Spatrick
11*810390e3Srobert# The compiler driver may be implicitly trying to link against libunwind.
12*810390e3Srobert# This is normally ok (libcxx relies on an unwinder), but if libunwind is
13*810390e3Srobert# built in the same cmake invocation as compiler-rt and we're using the
14*810390e3Srobert# in tree version of runtimes, we'd be linking against the just-built
15*810390e3Srobert# libunwind (and the compiler implicit -lunwind wouldn't succeed as the newly
16*810390e3Srobert# built libunwind isn't installed yet). For those cases, it'd be good to
17*810390e3Srobert# link with --uwnindlib=none. Check if that option works.
18*810390e3Srobertllvm_check_compiler_linker_flag(C "--unwindlib=none" CXX_SUPPORTS_UNWINDLIB_NONE_FLAG)
193cab2bb3Spatrick
203cab2bb3Spatrickcheck_library_exists(c fopen "" COMPILER_RT_HAS_LIBC)
213cab2bb3Spatrickif (COMPILER_RT_USE_BUILTINS_LIBRARY)
223cab2bb3Spatrick  include(HandleCompilerRT)
23*810390e3Srobert  find_compiler_rt_library(builtins COMPILER_RT_BUILTINS_LIBRARY
24*810390e3Srobert                           FLAGS ${SANITIZER_COMMON_FLAGS})
25*810390e3Srobert  # TODO(PR51389): We should check COMPILER_RT_BUILTINS_LIBRARY and report an
26*810390e3Srobert  # error if the value is NOTFOUND rather than silenty continuing but we first
27*810390e3Srobert  # need to fix find_compiler_rt_library on Darwin.
283cab2bb3Spatrickelse()
293cab2bb3Spatrick  if (ANDROID)
303cab2bb3Spatrick    check_library_exists(gcc __gcc_personality_v0 "" COMPILER_RT_HAS_GCC_LIB)
313cab2bb3Spatrick  else()
323cab2bb3Spatrick    check_library_exists(gcc_s __gcc_personality_v0 "" COMPILER_RT_HAS_GCC_S_LIB)
333cab2bb3Spatrick  endif()
343cab2bb3Spatrickendif()
353cab2bb3Spatrick
36*810390e3Srobertcheck_c_compiler_flag(-nodefaultlibs C_SUPPORTS_NODEFAULTLIBS_FLAG)
37*810390e3Srobertif (C_SUPPORTS_NODEFAULTLIBS_FLAG)
383cab2bb3Spatrick  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs")
393cab2bb3Spatrick  if (COMPILER_RT_HAS_LIBC)
403cab2bb3Spatrick    list(APPEND CMAKE_REQUIRED_LIBRARIES c)
413cab2bb3Spatrick  endif ()
423cab2bb3Spatrick  if (COMPILER_RT_USE_BUILTINS_LIBRARY)
43*810390e3Srobert    # TODO: remote this check once we address PR51389.
44*810390e3Srobert    if (${COMPILER_RT_BUILTINS_LIBRARY})
453cab2bb3Spatrick      list(APPEND CMAKE_REQUIRED_LIBRARIES "${COMPILER_RT_BUILTINS_LIBRARY}")
46*810390e3Srobert    endif()
473cab2bb3Spatrick  elseif (COMPILER_RT_HAS_GCC_S_LIB)
483cab2bb3Spatrick    list(APPEND CMAKE_REQUIRED_LIBRARIES gcc_s)
493cab2bb3Spatrick  elseif (COMPILER_RT_HAS_GCC_LIB)
503cab2bb3Spatrick    list(APPEND CMAKE_REQUIRED_LIBRARIES gcc)
513cab2bb3Spatrick  endif ()
523cab2bb3Spatrick  if (MINGW)
533cab2bb3Spatrick    # Mingw64 requires quite a few "C" runtime libraries in order for basic
543cab2bb3Spatrick    # programs to link successfully with -nodefaultlibs.
553cab2bb3Spatrick    if (COMPILER_RT_USE_BUILTINS_LIBRARY)
563cab2bb3Spatrick      set(MINGW_RUNTIME ${COMPILER_RT_BUILTINS_LIBRARY})
573cab2bb3Spatrick    else ()
583cab2bb3Spatrick      set(MINGW_RUNTIME gcc_s gcc)
593cab2bb3Spatrick    endif()
603cab2bb3Spatrick    set(MINGW_LIBRARIES mingw32 ${MINGW_RUNTIME} moldname mingwex msvcrt advapi32
613cab2bb3Spatrick                        shell32 user32 kernel32 mingw32 ${MINGW_RUNTIME}
623cab2bb3Spatrick                        moldname mingwex msvcrt)
633cab2bb3Spatrick    list(APPEND CMAKE_REQUIRED_LIBRARIES ${MINGW_LIBRARIES})
643cab2bb3Spatrick  endif()
653cab2bb3Spatrickendif ()
663cab2bb3Spatrick
673cab2bb3Spatrick# CodeGen options.
683cab2bb3Spatrickcheck_c_compiler_flag(-ffreestanding         COMPILER_RT_HAS_FFREESTANDING_FLAG)
69d89ec533Spatrickcheck_c_compiler_flag(-fomit-frame-pointer   COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG)
703cab2bb3Spatrickcheck_c_compiler_flag(-std=c11               COMPILER_RT_HAS_STD_C11_FLAG)
71*810390e3Srobertcheck_c_compiler_flag(-fcf-protection=full   COMPILER_RT_HAS_FCF_PROTECTION_FLAG)
723cab2bb3Spatrickcheck_cxx_compiler_flag(-fPIC                COMPILER_RT_HAS_FPIC_FLAG)
733cab2bb3Spatrickcheck_cxx_compiler_flag(-fPIE                COMPILER_RT_HAS_FPIE_FLAG)
743cab2bb3Spatrickcheck_cxx_compiler_flag(-fno-builtin         COMPILER_RT_HAS_FNO_BUILTIN_FLAG)
753cab2bb3Spatrickcheck_cxx_compiler_flag(-fno-exceptions      COMPILER_RT_HAS_FNO_EXCEPTIONS_FLAG)
763cab2bb3Spatrickcheck_cxx_compiler_flag(-fomit-frame-pointer COMPILER_RT_HAS_FOMIT_FRAME_POINTER_FLAG)
773cab2bb3Spatrickcheck_cxx_compiler_flag(-funwind-tables      COMPILER_RT_HAS_FUNWIND_TABLES_FLAG)
783cab2bb3Spatrickcheck_cxx_compiler_flag(-fno-stack-protector COMPILER_RT_HAS_FNO_STACK_PROTECTOR_FLAG)
793cab2bb3Spatrickcheck_cxx_compiler_flag(-fno-sanitize=safe-stack COMPILER_RT_HAS_FNO_SANITIZE_SAFE_STACK_FLAG)
803cab2bb3Spatrickcheck_cxx_compiler_flag(-fvisibility=hidden  COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG)
813cab2bb3Spatrickcheck_cxx_compiler_flag(-frtti               COMPILER_RT_HAS_FRTTI_FLAG)
823cab2bb3Spatrickcheck_cxx_compiler_flag(-fno-rtti            COMPILER_RT_HAS_FNO_RTTI_FLAG)
833cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -fno-function-sections" COMPILER_RT_HAS_FNO_FUNCTION_SECTIONS_FLAG)
843cab2bb3Spatrickcheck_cxx_compiler_flag(-ftls-model=initial-exec COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC)
853cab2bb3Spatrickcheck_cxx_compiler_flag(-fno-lto             COMPILER_RT_HAS_FNO_LTO_FLAG)
861f9cb04fSpatrickcheck_cxx_compiler_flag(-fno-profile-generate COMPILER_RT_HAS_FNO_PROFILE_GENERATE_FLAG)
871f9cb04fSpatrickcheck_cxx_compiler_flag(-fno-profile-instr-generate COMPILER_RT_HAS_FNO_PROFILE_INSTR_GENERATE_FLAG)
881f9cb04fSpatrickcheck_cxx_compiler_flag(-fno-profile-instr-use COMPILER_RT_HAS_FNO_PROFILE_INSTR_USE_FLAG)
89*810390e3Srobertcheck_cxx_compiler_flag(-fno-coverage-mapping COMPILER_RT_HAS_FNO_COVERAGE_MAPPING_FLAG)
90*810390e3Srobertcheck_cxx_compiler_flag("-Werror -mcrc32"    COMPILER_RT_HAS_MCRC32_FLAG)
913cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -msse3" COMPILER_RT_HAS_MSSE3_FLAG)
923cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -msse4.2"   COMPILER_RT_HAS_MSSE4_2_FLAG)
933cab2bb3Spatrickcheck_cxx_compiler_flag(--sysroot=.          COMPILER_RT_HAS_SYSROOT_FLAG)
943cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -mcrc"      COMPILER_RT_HAS_MCRC_FLAG)
953cab2bb3Spatrickcheck_cxx_compiler_flag(-fno-partial-inlining COMPILER_RT_HAS_FNO_PARTIAL_INLINING_FLAG)
96*810390e3Srobertcheck_cxx_compiler_flag(-Werror -ftrivial-auto-var-init=pattern COMPILER_RT_HAS_TRIVIAL_AUTO_INIT)
973cab2bb3Spatrick
983cab2bb3Spatrickif(NOT WIN32 AND NOT CYGWIN)
993cab2bb3Spatrick  # MinGW warns if -fvisibility-inlines-hidden is used.
1003cab2bb3Spatrick  check_cxx_compiler_flag("-fvisibility-inlines-hidden" COMPILER_RT_HAS_FVISIBILITY_INLINES_HIDDEN_FLAG)
1013cab2bb3Spatrickendif()
1023cab2bb3Spatrick
1033cab2bb3Spatrickcheck_cxx_compiler_flag(/GR COMPILER_RT_HAS_GR_FLAG)
1043cab2bb3Spatrickcheck_cxx_compiler_flag(/GS COMPILER_RT_HAS_GS_FLAG)
1053cab2bb3Spatrickcheck_cxx_compiler_flag(/MT COMPILER_RT_HAS_MT_FLAG)
1063cab2bb3Spatrickcheck_cxx_compiler_flag(/Oy COMPILER_RT_HAS_Oy_FLAG)
1073cab2bb3Spatrick
1083cab2bb3Spatrick# Debug info flags.
1093cab2bb3Spatrickcheck_cxx_compiler_flag(-gline-tables-only COMPILER_RT_HAS_GLINE_TABLES_ONLY_FLAG)
1103cab2bb3Spatrickcheck_cxx_compiler_flag(-g COMPILER_RT_HAS_G_FLAG)
1113cab2bb3Spatrickcheck_cxx_compiler_flag(/Zi COMPILER_RT_HAS_Zi_FLAG)
1123cab2bb3Spatrick
1133cab2bb3Spatrick# Warnings.
1143cab2bb3Spatrickcheck_cxx_compiler_flag(-Wall COMPILER_RT_HAS_WALL_FLAG)
1153cab2bb3Spatrickcheck_cxx_compiler_flag(-Werror COMPILER_RT_HAS_WERROR_FLAG)
1163cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -Wframe-larger-than=512" COMPILER_RT_HAS_WFRAME_LARGER_THAN_FLAG)
1173cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -Wglobal-constructors"   COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG)
1183cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -Wc99-extensions"     COMPILER_RT_HAS_WC99_EXTENSIONS_FLAG)
1193cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -Wgnu"                COMPILER_RT_HAS_WGNU_FLAG)
1203cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -Wnon-virtual-dtor"   COMPILER_RT_HAS_WNON_VIRTUAL_DTOR_FLAG)
1213cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -Wvariadic-macros"    COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG)
1223cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -Wunused-parameter"   COMPILER_RT_HAS_WUNUSED_PARAMETER_FLAG)
1233cab2bb3Spatrickcheck_cxx_compiler_flag("-Werror -Wcovered-switch-default" COMPILER_RT_HAS_WCOVERED_SWITCH_DEFAULT_FLAG)
124d89ec533Spatrickcheck_cxx_compiler_flag("-Werror -Wsuggest-override"   COMPILER_RT_HAS_WSUGGEST_OVERRIDE_FLAG)
125*810390e3Srobertcheck_cxx_compiler_flag("-Werror -Wthread-safety" COMPILER_RT_HAS_WTHREAD_SAFETY_FLAG)
126*810390e3Srobertcheck_cxx_compiler_flag("-Werror -Wthread-safety-reference" COMPILER_RT_HAS_WTHREAD_SAFETY_REFERENCE_FLAG)
127*810390e3Srobertcheck_cxx_compiler_flag("-Werror -Wthread-safety-beta" COMPILER_RT_HAS_WTHREAD_SAFETY_BETA_FLAG)
1283cab2bb3Spatrickcheck_cxx_compiler_flag(-Wno-pedantic COMPILER_RT_HAS_WNO_PEDANTIC)
129*810390e3Srobertcheck_cxx_compiler_flag(-Wno-format COMPILER_RT_HAS_WNO_FORMAT)
130*810390e3Srobertcheck_cxx_compiler_flag(-Wno-format-pedantic COMPILER_RT_HAS_WNO_FORMAT_PEDANTIC)
131*810390e3Srobert
132*810390e3Srobertcheck_cxx_compiler_flag("/experimental:external /external:W0" COMPILER_RT_HAS_EXTERNAL_FLAG)
1333cab2bb3Spatrick
1343cab2bb3Spatrickcheck_cxx_compiler_flag(/W4 COMPILER_RT_HAS_W4_FLAG)
1353cab2bb3Spatrickcheck_cxx_compiler_flag(/WX COMPILER_RT_HAS_WX_FLAG)
1363cab2bb3Spatrickcheck_cxx_compiler_flag(/wd4146 COMPILER_RT_HAS_WD4146_FLAG)
137*810390e3Srobertcheck_cxx_compiler_flag(/wd4206 COMPILER_RT_HAS_WD4206_FLAG)
1383cab2bb3Spatrickcheck_cxx_compiler_flag(/wd4291 COMPILER_RT_HAS_WD4291_FLAG)
1393cab2bb3Spatrickcheck_cxx_compiler_flag(/wd4221 COMPILER_RT_HAS_WD4221_FLAG)
1403cab2bb3Spatrickcheck_cxx_compiler_flag(/wd4391 COMPILER_RT_HAS_WD4391_FLAG)
1413cab2bb3Spatrickcheck_cxx_compiler_flag(/wd4722 COMPILER_RT_HAS_WD4722_FLAG)
1423cab2bb3Spatrickcheck_cxx_compiler_flag(/wd4800 COMPILER_RT_HAS_WD4800_FLAG)
1433cab2bb3Spatrick
144*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Warray-bounds COMPILER_RT_HAS_ARRAY_BOUNDS_FLAG)
145*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wuninitialized COMPILER_RT_HAS_UNINITIALIZED_FLAG)
146*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wshadow COMPILER_RT_HAS_SHADOW_FLAG)
147*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wempty-body COMPILER_RT_HAS_EMPTY_BODY_FLAG)
148*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wsizeof-pointer-memaccess COMPILER_RT_HAS_SIZEOF_POINTER_MEMACCESS_FLAG)
149*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wsizeof-array-argument COMPILER_RT_HAS_SIZEOF_ARRAY_ARGUMENT_FLAG)
150*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wsuspicious-memaccess COMPILER_RT_HAS_SUSPICIOUS_MEMACCESS_FLAG)
151*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wbuiltin-memcpy-chk-size COMPILER_RT_HAS_BUILTIN_MEMCPY_CHK_SIZE_FLAG)
152*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Warray-bounds-pointer-arithmetic COMPILER_RT_HAS_ARRAY_BOUNDS_POINTER_ARITHMETIC_FLAG)
153*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wreturn-stack-address COMPILER_RT_HAS_RETURN_STACK_ADDRESS_FLAG)
154*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wsizeof-array-decay COMPILER_RT_HAS_SIZEOF_ARRAY_DECAY_FLAG)
155*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wformat-insufficient-args COMPILER_RT_HAS_FORMAT_INSUFFICIENT_ARGS_FLAG)
156*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wformat-security COMPILER_RT_HAS_BUILTIN_FORMAL_SECURITY_FLAG)
157*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wsizeof-array-div COMPILER_RT_HAS_SIZEOF_ARRAY_DIV_FLAG)
158*810390e3Srobertcheck_cxx_compiler_flag(-Werror -Wsizeof-pointer-div COMPILER_RT_HAS_SIZEOF_POINTER_DIV_FLAG)
159*810390e3Srobert
1603cab2bb3Spatrick# Symbols.
1613cab2bb3Spatrickcheck_symbol_exists(__func__ "" COMPILER_RT_HAS_FUNC_SYMBOL)
1623cab2bb3Spatrick
1631f9cb04fSpatrick# Includes.
164d89ec533Spatrickcheck_cxx_compiler_flag(-nostdinc++ COMPILER_RT_HAS_NOSTDINCXX_FLAG)
165d89ec533Spatrickcheck_cxx_compiler_flag(-nostdlib++ COMPILER_RT_HAS_NOSTDLIBXX_FLAG)
1661f9cb04fSpatrickcheck_include_files("sys/auxv.h"    COMPILER_RT_HAS_AUXV)
1671f9cb04fSpatrick
1683cab2bb3Spatrick# Libraries.
1693cab2bb3Spatrickcheck_library_exists(dl dlopen "" COMPILER_RT_HAS_LIBDL)
1703cab2bb3Spatrickcheck_library_exists(rt shm_open "" COMPILER_RT_HAS_LIBRT)
1713cab2bb3Spatrickcheck_library_exists(m pow "" COMPILER_RT_HAS_LIBM)
1723cab2bb3Spatrickcheck_library_exists(pthread pthread_create "" COMPILER_RT_HAS_LIBPTHREAD)
1733cab2bb3Spatrickcheck_library_exists(execinfo backtrace "" COMPILER_RT_HAS_LIBEXECINFO)
1743cab2bb3Spatrick
1753cab2bb3Spatrick# Look for terminfo library, used in unittests that depend on LLVMSupport.
176d89ec533Spatrickif(LLVM_ENABLE_TERMINFO STREQUAL FORCE_ON)
177d89ec533Spatrick  set(MAYBE_REQUIRED REQUIRED)
178d89ec533Spatrickelse()
179d89ec533Spatrick  set(MAYBE_REQUIRED)
1803cab2bb3Spatrickendif()
181d89ec533Spatrickif(LLVM_ENABLE_TERMINFO)
182d89ec533Spatrick  find_library(COMPILER_RT_TERMINFO_LIB NAMES terminfo tinfo curses ncurses ncursesw ${MAYBE_REQUIRED})
183d89ec533Spatrickendif()
184d89ec533Spatrickif(COMPILER_RT_TERMINFO_LIB)
185d89ec533Spatrick  set(LLVM_ENABLE_TERMINFO 1)
186d89ec533Spatrickelse()
187d89ec533Spatrick  set(LLVM_ENABLE_TERMINFO 0)
1883cab2bb3Spatrickendif()
1893cab2bb3Spatrick
1903cab2bb3Spatrickif (ANDROID AND COMPILER_RT_HAS_LIBDL)
1913cab2bb3Spatrick  # Android's libstdc++ has a dependency on libdl.
1923cab2bb3Spatrick  list(APPEND CMAKE_REQUIRED_LIBRARIES dl)
1933cab2bb3Spatrickendif()
1943cab2bb3Spatrickcheck_library_exists(c++ __cxa_throw "" COMPILER_RT_HAS_LIBCXX)
1953cab2bb3Spatrickcheck_library_exists(stdc++ __cxa_throw "" COMPILER_RT_HAS_LIBSTDCXX)
1963cab2bb3Spatrick
1973cab2bb3Spatrick# Linker flags.
198*810390e3Srobertllvm_check_compiler_linker_flag(C "-Wl,-z,text" COMPILER_RT_HAS_Z_TEXT)
199*810390e3Srobertllvm_check_compiler_linker_flag(C "-fuse-ld=lld" COMPILER_RT_HAS_FUSE_LD_LLD_FLAG)
200d89ec533Spatrick
201*810390e3Srobertif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
202d89ec533Spatrick  set(VERS_COMPAT_OPTION "-Wl,-z,gnu-version-script-compat")
203*810390e3Srobert  llvm_check_compiler_linker_flag(C "${VERS_COMPAT_OPTION}" COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT)
204*810390e3Srobertendif()
205d89ec533Spatrick
206d89ec533Spatrickset(DUMMY_VERS ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/dummy.vers)
207d89ec533Spatrickfile(WRITE ${DUMMY_VERS} "{};")
208d89ec533Spatrickset(VERS_OPTION "-Wl,--version-script,${DUMMY_VERS}")
209d89ec533Spatrickif(COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT)
210d89ec533Spatrick  # Solaris 11.4 ld only supports --version-script with
211d89ec533Spatrick  # -z gnu-version-script-compat.
212d89ec533Spatrick  string(APPEND VERS_OPTION " ${VERS_COMPAT_OPTION}")
213d89ec533Spatrickendif()
214*810390e3Srobertllvm_check_compiler_linker_flag(C "${VERS_OPTION}" COMPILER_RT_HAS_VERSION_SCRIPT)
2153cab2bb3Spatrick
2163cab2bb3Spatrickif(ANDROID)
217*810390e3Srobert  llvm_check_compiler_linker_flag(C "-Wl,-z,global" COMPILER_RT_HAS_Z_GLOBAL)
2183cab2bb3Spatrick  check_library_exists(log __android_log_write "" COMPILER_RT_HAS_LIBLOG)
2193cab2bb3Spatrickendif()
2203cab2bb3Spatrick
2213cab2bb3Spatrick# Architectures.
2223cab2bb3Spatrick
2233cab2bb3Spatrick# List of all architectures we can target.
2243cab2bb3Spatrickset(COMPILER_RT_SUPPORTED_ARCH)
2253cab2bb3Spatrick
2263cab2bb3Spatrick# Try to compile a very simple source file to ensure we can target the given
2273cab2bb3Spatrick# platform. We use the results of these tests to build only the various target
2283cab2bb3Spatrick# runtime libraries supported by our current compilers cross-compiling
2293cab2bb3Spatrick# abilities.
2303cab2bb3Spatrickset(SIMPLE_SOURCE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple.cc)
231*810390e3Srobertfile(WRITE ${SIMPLE_SOURCE} "#include <stdlib.h>\n#include <stdio.h>\nint main(void) { printf(\"hello, world\"); }\n")
2323cab2bb3Spatrick
2333cab2bb3Spatrick# Detect whether the current target platform is 32-bit or 64-bit, and setup
2343cab2bb3Spatrick# the correct commandline flags needed to attempt to target 32-bit and 64-bit.
235*810390e3Srobert# AVR and MSP430 are omitted since they have 16-bit pointers.
2363cab2bb3Spatrickif (NOT CMAKE_SIZEOF_VOID_P EQUAL 4 AND
237*810390e3Srobert    NOT CMAKE_SIZEOF_VOID_P EQUAL 8 AND
238*810390e3Srobert    NOT ${arch} MATCHES "avr|msp430")
2393cab2bb3Spatrick  message(FATAL_ERROR "Please use architecture with 4 or 8 byte pointers.")
2403cab2bb3Spatrickendif()
2413cab2bb3Spatrick
2423cab2bb3Spatricktest_targets()
2433cab2bb3Spatrick
2443cab2bb3Spatrick# Returns a list of architecture specific target cflags in @out_var list.
2453cab2bb3Spatrickfunction(get_target_flags_for_arch arch out_var)
2463cab2bb3Spatrick  list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX)
2473cab2bb3Spatrick  if(ARCH_INDEX EQUAL -1)
2483cab2bb3Spatrick    message(FATAL_ERROR "Unsupported architecture: ${arch}")
2493cab2bb3Spatrick  else()
2503cab2bb3Spatrick    if (NOT APPLE)
2513cab2bb3Spatrick      set(${out_var} ${TARGET_${arch}_CFLAGS} PARENT_SCOPE)
2523cab2bb3Spatrick    else()
2533cab2bb3Spatrick      # This is only called in constructing cflags for tests executing on the
2543cab2bb3Spatrick      # host. This will need to all be cleaned up to support building tests
2553cab2bb3Spatrick      # for cross-targeted hardware (i.e. iOS).
2563cab2bb3Spatrick      set(${out_var} -arch ${arch} PARENT_SCOPE)
2573cab2bb3Spatrick    endif()
2583cab2bb3Spatrick  endif()
2593cab2bb3Spatrickendfunction()
2603cab2bb3Spatrick
261*810390e3Srobert# Returns a list of architecture specific target ldflags in @out_var list.
262*810390e3Srobertfunction(get_target_link_flags_for_arch arch out_var)
263*810390e3Srobert  list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX)
264*810390e3Srobert  if(ARCH_INDEX EQUAL -1)
265*810390e3Srobert    message(FATAL_ERROR "Unsupported architecture: ${arch}")
266*810390e3Srobert  else()
267*810390e3Srobert    # Workaround for direct calls to __tls_get_addr on Solaris/amd64.
268*810390e3Srobert    if(OS_NAME MATCHES "SunOS" AND ${arch} MATCHES x86_64)
269*810390e3Srobert      set(${out_var} "-Wl,-z,relax=transtls" PARENT_SCOPE)
270*810390e3Srobert    endif()
271*810390e3Srobert  endif()
272*810390e3Srobertendfunction()
273*810390e3Srobert
2743cab2bb3Spatrick# Returns a compiler and CFLAGS that should be used to run tests for the
2753cab2bb3Spatrick# specific architecture.  When cross-compiling, this is controled via
2763cab2bb3Spatrick# COMPILER_RT_TEST_COMPILER and COMPILER_RT_TEST_COMPILER_CFLAGS.
2773cab2bb3Spatrickmacro(get_test_cc_for_arch arch cc_out cflags_out)
278*810390e3Srobert  if (NOT ${ARGC} EQUAL 3)
279*810390e3Srobert    message(FATAL_ERROR "got too many args. expected 3, got ${ARGC} (namely: ${ARGV})")
280*810390e3Srobert  endif()
281*810390e3Srobert  if(ANDROID OR (NOT APPLE AND ${arch} MATCHES "arm|aarch64|riscv32|riscv64"))
2823cab2bb3Spatrick    # This is only true if we are cross-compiling.
2833cab2bb3Spatrick    # Build all tests with host compiler and use host tools.
2843cab2bb3Spatrick    set(${cc_out} ${COMPILER_RT_TEST_COMPILER})
2853cab2bb3Spatrick    set(${cflags_out} ${COMPILER_RT_TEST_COMPILER_CFLAGS})
2863cab2bb3Spatrick  else()
2873cab2bb3Spatrick    get_target_flags_for_arch(${arch} ${cflags_out})
2883cab2bb3Spatrick    if(APPLE)
2893cab2bb3Spatrick      list(APPEND ${cflags_out} ${DARWIN_osx_CFLAGS})
2903cab2bb3Spatrick    endif()
2913cab2bb3Spatrick    string(REPLACE ";" " " ${cflags_out} "${${cflags_out}}")
2923cab2bb3Spatrick  endif()
2933cab2bb3Spatrickendmacro()
2943cab2bb3Spatrick
2953cab2bb3Spatrick# Returns CFLAGS that should be used to run tests for the
2963cab2bb3Spatrick# specific apple platform and architecture.
2973cab2bb3Spatrickfunction(get_test_cflags_for_apple_platform platform arch cflags_out)
2983cab2bb3Spatrick  is_valid_apple_platform("${platform}" is_valid_platform)
2993cab2bb3Spatrick  if (NOT is_valid_platform)
3003cab2bb3Spatrick    message(FATAL_ERROR "\"${platform}\" is not a valid apple platform")
3013cab2bb3Spatrick  endif()
3023cab2bb3Spatrick  set(test_cflags "")
3033cab2bb3Spatrick  get_target_flags_for_arch(${arch} test_cflags)
304*810390e3Srobert
305*810390e3Srobert  if (NOT "${arch}" STREQUAL "arm64e")
3063cab2bb3Spatrick    list(APPEND test_cflags ${DARWIN_${platform}_CFLAGS})
307*810390e3Srobert  else()
308*810390e3Srobert    # arm64e is not currently ABI stable so we need to build for the
309*810390e3Srobert    # OS version being tested. Rather than querying the device under test
310*810390e3Srobert    # we use the SDK version which "should" be the same as the
311*810390e3Srobert    # device under test (it is a configuration error for these not to match).
312*810390e3Srobert    # FIXME(dliew): We can remove this if we build the runtimes with the appropriate
313*810390e3Srobert    # deployment target for arm64e.
314*810390e3Srobert    foreach (flag ${DARWIN_${platform}_CFLAGS})
315*810390e3Srobert      if ("${flag}" MATCHES "^${DARWIN_${platform}_MIN_VER_FLAG}=.+")
316*810390e3Srobert        # Find the SDK version
317*810390e3Srobert        get_xcrun_platform_from_apple_platform("${platform}" xcrun_platform_name)
318*810390e3Srobert        # TODO(dliew): Remove this check once get_xcrun_platform_from_apple_platform
319*810390e3Srobert        # emits a fatal error for unrecognised platforms.
320*810390e3Srobert        if (NOT "${xcrun_platform_name}" STREQUAL "")
321*810390e3Srobert          find_darwin_sdk_version(platform_sdk_version "${xcrun_platform_name}")
322*810390e3Srobert          # Patch flag with correct deployment target
323*810390e3Srobert          set(replacement_flag "${DARWIN_${platform}_MIN_VER_FLAG}=${platform_sdk_version}")
324*810390e3Srobert          list(APPEND test_cflags "${replacement_flag}")
325*810390e3Srobert        endif()
326*810390e3Srobert      else()
327*810390e3Srobert        # Copy through
328*810390e3Srobert        list(APPEND test_cflags "${flag}")
329*810390e3Srobert      endif()
330*810390e3Srobert    endforeach()
331*810390e3Srobert  endif()
332*810390e3Srobert
3333cab2bb3Spatrick  string(REPLACE ";" " " test_cflags_str "${test_cflags}")
3343cab2bb3Spatrick  string(APPEND test_cflags_str "${COMPILER_RT_TEST_COMPILER_CFLAGS}")
3353cab2bb3Spatrick  set(${cflags_out} "${test_cflags_str}" PARENT_SCOPE)
3363cab2bb3Spatrickendfunction()
3373cab2bb3Spatrick
3381f9cb04fSpatrickfunction(get_capitalized_apple_platform platform platform_capitalized)
3391f9cb04fSpatrick  # TODO(dliew): Remove uses of this function. It exists to preserve needlessly complex
3401f9cb04fSpatrick  # directory naming conventions used by the Sanitizer lit test suites.
3411f9cb04fSpatrick  is_valid_apple_platform("${platform}" is_valid_platform)
3421f9cb04fSpatrick  if (NOT is_valid_platform)
3431f9cb04fSpatrick    message(FATAL_ERROR "\"${platform}\" is not a valid apple platform")
3441f9cb04fSpatrick  endif()
3451f9cb04fSpatrick  string(TOUPPER "${platform}" platform_upper)
3461f9cb04fSpatrick  string(REGEX REPLACE "OSSIM$" "OSSim" platform_upper_capitalized "${platform_upper}")
3471f9cb04fSpatrick  set(${platform_capitalized} "${platform_upper_capitalized}" PARENT_SCOPE)
3481f9cb04fSpatrickendfunction()
3491f9cb04fSpatrick
3503cab2bb3Spatrickfunction(is_valid_apple_platform platform is_valid_out)
3513cab2bb3Spatrick  set(is_valid FALSE)
3523cab2bb3Spatrick  if ("${platform}" STREQUAL "")
3533cab2bb3Spatrick    message(FATAL_ERROR "platform cannot be empty")
3543cab2bb3Spatrick  endif()
3553cab2bb3Spatrick  if ("${platform}" MATCHES "^(osx|((ios|watchos|tvos)(sim)?))$")
3563cab2bb3Spatrick    set(is_valid TRUE)
3573cab2bb3Spatrick  endif()
3583cab2bb3Spatrick  set(${is_valid_out} ${is_valid} PARENT_SCOPE)
3593cab2bb3Spatrickendfunction()
3603cab2bb3Spatrick
361*810390e3Srobert# Maps the Apple platform name used in Compiler-rt's CMake code
362*810390e3Srobert# to the name recognised by xcrun's `--sdk` argument
363*810390e3Srobertfunction(get_xcrun_platform_from_apple_platform platform out_var)
364*810390e3Srobert  set(xcrun_platform "")
365*810390e3Srobert  if ("${platform}" STREQUAL "osx")
366*810390e3Srobert    set(xcrun_platform "macosx")
367*810390e3Srobert  elseif ("${platform}" STREQUAL "iossim")
368*810390e3Srobert    set(xcrun_platform "iphonesimulator")
369*810390e3Srobert  elseif ("${platform}" STREQUAL "ios")
370*810390e3Srobert    set(xcrun_platform "iphoneos")
371*810390e3Srobert  elseif ("${platform}" STREQUAL "watchossim")
372*810390e3Srobert    set(xcrun_platform "watchsimulator")
373*810390e3Srobert  elseif ("${platform}" STREQUAL "watchos")
374*810390e3Srobert    set(xcrun_platform "watchos")
375*810390e3Srobert  elseif ("${platform}" STREQUAL "tvossim")
376*810390e3Srobert    set(xcrun_platform "appletvsimulator")
377*810390e3Srobert  elseif ("${platform}" STREQUAL "tvos")
378*810390e3Srobert    set(xcrun_platform "appletvos")
3793cab2bb3Spatrick  else()
380*810390e3Srobert    # TODO(dliew): Make this an error.
381*810390e3Srobert    message(WARNING "\"${platform}\" is not a handled apple platform")
3823cab2bb3Spatrick  endif()
383*810390e3Srobert  set(${out_var} ${xcrun_platform} PARENT_SCOPE)
384*810390e3Srobertendfunction()
3853cab2bb3Spatrick
386*810390e3Srobertinclude(AllSupportedArchDefs)
387d89ec533Spatrick
3883cab2bb3Spatrickif(APPLE)
3893cab2bb3Spatrick  include(CompilerRTDarwinUtils)
3903cab2bb3Spatrick
3913cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx)
3923cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator)
3933cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos)
3943cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_watchossim_SYSROOT watchsimulator)
3953cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_watchos_SYSROOT watchos)
3963cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_tvossim_SYSROOT appletvsimulator)
3973cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_tvos_SYSROOT appletvos)
3983cab2bb3Spatrick
3993cab2bb3Spatrick  if(NOT DARWIN_osx_SYSROOT)
4003cab2bb3Spatrick    message(WARNING "Could not determine OS X sysroot, trying /usr/include")
4013cab2bb3Spatrick    if(EXISTS /usr/include)
4023cab2bb3Spatrick      set(DARWIN_osx_SYSROOT /)
4033cab2bb3Spatrick    else()
4043cab2bb3Spatrick      message(ERROR "Could not detect OS X Sysroot. Either install Xcode or the Apple Command Line Tools")
4053cab2bb3Spatrick    endif()
4063cab2bb3Spatrick  endif()
4073cab2bb3Spatrick
4083cab2bb3Spatrick  if(COMPILER_RT_ENABLE_IOS)
4093cab2bb3Spatrick    list(APPEND DARWIN_EMBEDDED_PLATFORMS ios)
4101f9cb04fSpatrick    set(DARWIN_ios_MIN_VER 9.0)
4113cab2bb3Spatrick    set(DARWIN_ios_MIN_VER_FLAG -miphoneos-version-min)
4123cab2bb3Spatrick    set(DARWIN_ios_SANITIZER_MIN_VER_FLAG
4131f9cb04fSpatrick      ${DARWIN_ios_MIN_VER_FLAG}=${DARWIN_ios_MIN_VER})
4141f9cb04fSpatrick    set(DARWIN_iossim_MIN_VER_FLAG -mios-simulator-version-min)
4151f9cb04fSpatrick    set(DARWIN_iossim_SANITIZER_MIN_VER_FLAG
4161f9cb04fSpatrick      ${DARWIN_iossim_MIN_VER_FLAG}=${DARWIN_ios_MIN_VER})
4173cab2bb3Spatrick  endif()
4183cab2bb3Spatrick  if(COMPILER_RT_ENABLE_WATCHOS)
4193cab2bb3Spatrick    list(APPEND DARWIN_EMBEDDED_PLATFORMS watchos)
4201f9cb04fSpatrick    set(DARWIN_watchos_MIN_VER 2.0)
4213cab2bb3Spatrick    set(DARWIN_watchos_MIN_VER_FLAG -mwatchos-version-min)
4223cab2bb3Spatrick    set(DARWIN_watchos_SANITIZER_MIN_VER_FLAG
4231f9cb04fSpatrick      ${DARWIN_watchos_MIN_VER_FLAG}=${DARWIN_watchos_MIN_VER})
4241f9cb04fSpatrick    set(DARWIN_watchossim_MIN_VER_FLAG -mwatchos-simulator-version-min)
4251f9cb04fSpatrick    set(DARWIN_watchossim_SANITIZER_MIN_VER_FLAG
4261f9cb04fSpatrick      ${DARWIN_watchossim_MIN_VER_FLAG}=${DARWIN_watchos_MIN_VER})
4273cab2bb3Spatrick  endif()
4283cab2bb3Spatrick  if(COMPILER_RT_ENABLE_TVOS)
4293cab2bb3Spatrick    list(APPEND DARWIN_EMBEDDED_PLATFORMS tvos)
4301f9cb04fSpatrick    set(DARWIN_tvos_MIN_VER 9.0)
4313cab2bb3Spatrick    set(DARWIN_tvos_MIN_VER_FLAG -mtvos-version-min)
4323cab2bb3Spatrick    set(DARWIN_tvos_SANITIZER_MIN_VER_FLAG
4331f9cb04fSpatrick      ${DARWIN_tvos_MIN_VER_FLAG}=${DARWIN_tvos_MIN_VER})
4341f9cb04fSpatrick    set(DARWIN_tvossim_MIN_VER_FLAG -mtvos-simulator-version-min)
4351f9cb04fSpatrick    set(DARWIN_tvossim_SANITIZER_MIN_VER_FLAG
4361f9cb04fSpatrick      ${DARWIN_tvossim_MIN_VER_FLAG}=${DARWIN_tvos_MIN_VER})
4373cab2bb3Spatrick  endif()
4383cab2bb3Spatrick
4393cab2bb3Spatrick  set(SANITIZER_COMMON_SUPPORTED_OS osx)
4403cab2bb3Spatrick  set(PROFILE_SUPPORTED_OS osx)
4413cab2bb3Spatrick  set(TSAN_SUPPORTED_OS osx)
4423cab2bb3Spatrick  set(XRAY_SUPPORTED_OS osx)
4431f9cb04fSpatrick  set(FUZZER_SUPPORTED_OS osx)
444d89ec533Spatrick  set(ORC_SUPPORTED_OS osx)
445*810390e3Srobert  set(UBSAN_SUPPORTED_OS osx)
446*810390e3Srobert  set(LSAN_SUPPORTED_OS osx)
447*810390e3Srobert  set(STATS_SUPPORTED_OS osx)
4483cab2bb3Spatrick
4493cab2bb3Spatrick  # Note: In order to target x86_64h on OS X the minimum deployment target must
4503cab2bb3Spatrick  # be 10.8 or higher.
4513cab2bb3Spatrick  set(DEFAULT_SANITIZER_MIN_OSX_VERSION 10.10)
4521f9cb04fSpatrick  set(DARWIN_osx_MIN_VER_FLAG "-mmacosx-version-min")
4533cab2bb3Spatrick  if(NOT SANITIZER_MIN_OSX_VERSION)
4541f9cb04fSpatrick    string(REGEX MATCH "${DARWIN_osx_MIN_VER_FLAG}=([.0-9]+)"
4553cab2bb3Spatrick           MACOSX_VERSION_MIN_FLAG "${CMAKE_CXX_FLAGS}")
4563cab2bb3Spatrick    if(MACOSX_VERSION_MIN_FLAG)
4573cab2bb3Spatrick      set(SANITIZER_MIN_OSX_VERSION "${CMAKE_MATCH_1}")
4583cab2bb3Spatrick    elseif(CMAKE_OSX_DEPLOYMENT_TARGET)
4593cab2bb3Spatrick      set(SANITIZER_MIN_OSX_VERSION ${CMAKE_OSX_DEPLOYMENT_TARGET})
4603cab2bb3Spatrick    else()
4613cab2bb3Spatrick      set(SANITIZER_MIN_OSX_VERSION ${DEFAULT_SANITIZER_MIN_OSX_VERSION})
4623cab2bb3Spatrick    endif()
4633cab2bb3Spatrick    if(SANITIZER_MIN_OSX_VERSION VERSION_LESS "10.7")
4643cab2bb3Spatrick      message(FATAL_ERROR "macOS deployment target '${SANITIZER_MIN_OSX_VERSION}' is too old.")
4653cab2bb3Spatrick    endif()
4663cab2bb3Spatrick    if(SANITIZER_MIN_OSX_VERSION VERSION_GREATER ${DEFAULT_SANITIZER_MIN_OSX_VERSION})
4673cab2bb3Spatrick      message(WARNING "macOS deployment target '${SANITIZER_MIN_OSX_VERSION}' is too new, setting to '${DEFAULT_SANITIZER_MIN_OSX_VERSION}' instead.")
4683cab2bb3Spatrick      set(SANITIZER_MIN_OSX_VERSION ${DEFAULT_SANITIZER_MIN_OSX_VERSION})
4693cab2bb3Spatrick    endif()
4703cab2bb3Spatrick  endif()
4713cab2bb3Spatrick
4723cab2bb3Spatrick  # We're setting the flag manually for each target OS
4733cab2bb3Spatrick  set(CMAKE_OSX_DEPLOYMENT_TARGET "")
4743cab2bb3Spatrick
4753cab2bb3Spatrick  set(DARWIN_COMMON_CFLAGS -stdlib=libc++)
4763cab2bb3Spatrick  set(DARWIN_COMMON_LINK_FLAGS
4773cab2bb3Spatrick    -stdlib=libc++
4783cab2bb3Spatrick    -lc++
4793cab2bb3Spatrick    -lc++abi)
4803cab2bb3Spatrick
481*810390e3Srobert  llvm_check_compiler_linker_flag(C "-fapplication-extension" COMPILER_RT_HAS_APP_EXTENSION)
4823cab2bb3Spatrick  if(COMPILER_RT_HAS_APP_EXTENSION)
4833cab2bb3Spatrick    list(APPEND DARWIN_COMMON_LINK_FLAGS "-fapplication-extension")
4843cab2bb3Spatrick  endif()
4853cab2bb3Spatrick
4863cab2bb3Spatrick  set(DARWIN_osx_CFLAGS
4873cab2bb3Spatrick    ${DARWIN_COMMON_CFLAGS}
4881f9cb04fSpatrick    ${DARWIN_osx_MIN_VER_FLAG}=${SANITIZER_MIN_OSX_VERSION})
4893cab2bb3Spatrick  set(DARWIN_osx_LINK_FLAGS
4903cab2bb3Spatrick    ${DARWIN_COMMON_LINK_FLAGS}
4911f9cb04fSpatrick    ${DARWIN_osx_MIN_VER_FLAG}=${SANITIZER_MIN_OSX_VERSION})
4923cab2bb3Spatrick
4933cab2bb3Spatrick  if(DARWIN_osx_SYSROOT)
4943cab2bb3Spatrick    list(APPEND DARWIN_osx_CFLAGS -isysroot ${DARWIN_osx_SYSROOT})
4953cab2bb3Spatrick    list(APPEND DARWIN_osx_LINK_FLAGS -isysroot ${DARWIN_osx_SYSROOT})
4963cab2bb3Spatrick  endif()
4973cab2bb3Spatrick
4983cab2bb3Spatrick  # Figure out which arches to use for each OS
4993cab2bb3Spatrick  darwin_get_toolchain_supported_archs(toolchain_arches)
5003cab2bb3Spatrick  message(STATUS "Toolchain supported arches: ${toolchain_arches}")
5013cab2bb3Spatrick
5023cab2bb3Spatrick  if(NOT MACOSX_VERSION_MIN_FLAG)
5033cab2bb3Spatrick    darwin_test_archs(osx
5043cab2bb3Spatrick      DARWIN_osx_ARCHS
5053cab2bb3Spatrick      ${toolchain_arches})
5063cab2bb3Spatrick    message(STATUS "OSX supported arches: ${DARWIN_osx_ARCHS}")
5073cab2bb3Spatrick    foreach(arch ${DARWIN_osx_ARCHS})
5083cab2bb3Spatrick      list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
5093cab2bb3Spatrick      set(CAN_TARGET_${arch} 1)
5103cab2bb3Spatrick    endforeach()
5113cab2bb3Spatrick
5123cab2bb3Spatrick    foreach(platform ${DARWIN_EMBEDDED_PLATFORMS})
5133cab2bb3Spatrick      if(DARWIN_${platform}sim_SYSROOT)
5143cab2bb3Spatrick        set(DARWIN_${platform}sim_CFLAGS
5153cab2bb3Spatrick          ${DARWIN_COMMON_CFLAGS}
5161f9cb04fSpatrick          ${DARWIN_${platform}sim_SANITIZER_MIN_VER_FLAG}
5173cab2bb3Spatrick          -isysroot ${DARWIN_${platform}sim_SYSROOT})
5183cab2bb3Spatrick        set(DARWIN_${platform}sim_LINK_FLAGS
5193cab2bb3Spatrick          ${DARWIN_COMMON_LINK_FLAGS}
5201f9cb04fSpatrick          ${DARWIN_${platform}sim_SANITIZER_MIN_VER_FLAG}
5213cab2bb3Spatrick          -isysroot ${DARWIN_${platform}sim_SYSROOT})
5223cab2bb3Spatrick
5233cab2bb3Spatrick        set(DARWIN_${platform}sim_SKIP_CC_KEXT On)
5243cab2bb3Spatrick        darwin_test_archs(${platform}sim
5253cab2bb3Spatrick          DARWIN_${platform}sim_ARCHS
5263cab2bb3Spatrick          ${toolchain_arches})
5273cab2bb3Spatrick        message(STATUS "${platform} Simulator supported arches: ${DARWIN_${platform}sim_ARCHS}")
5283cab2bb3Spatrick        if(DARWIN_${platform}sim_ARCHS)
5293cab2bb3Spatrick          list(APPEND SANITIZER_COMMON_SUPPORTED_OS ${platform}sim)
5303cab2bb3Spatrick          list(APPEND PROFILE_SUPPORTED_OS ${platform}sim)
5313cab2bb3Spatrick          list(APPEND TSAN_SUPPORTED_OS ${platform}sim)
5321f9cb04fSpatrick          list(APPEND FUZZER_SUPPORTED_OS ${platform}sim)
533*810390e3Srobert          list(APPEND ORC_SUPPORTED_OS ${platform}sim)
534*810390e3Srobert          list(APPEND UBSAN_SUPPORTED_OS ${platform}sim)
535*810390e3Srobert          list(APPEND LSAN_SUPPORTED_OS ${platform}sim)
536*810390e3Srobert          list(APPEND STATS_SUPPORTED_OS ${platform}sim)
5373cab2bb3Spatrick        endif()
5383cab2bb3Spatrick        foreach(arch ${DARWIN_${platform}sim_ARCHS})
5393cab2bb3Spatrick          list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
5403cab2bb3Spatrick          set(CAN_TARGET_${arch} 1)
5413cab2bb3Spatrick        endforeach()
5423cab2bb3Spatrick      endif()
5433cab2bb3Spatrick
5443cab2bb3Spatrick      if(DARWIN_${platform}_SYSROOT)
5453cab2bb3Spatrick        set(DARWIN_${platform}_CFLAGS
5463cab2bb3Spatrick          ${DARWIN_COMMON_CFLAGS}
5473cab2bb3Spatrick          ${DARWIN_${platform}_SANITIZER_MIN_VER_FLAG}
5483cab2bb3Spatrick          -isysroot ${DARWIN_${platform}_SYSROOT})
5493cab2bb3Spatrick        set(DARWIN_${platform}_LINK_FLAGS
5503cab2bb3Spatrick          ${DARWIN_COMMON_LINK_FLAGS}
5513cab2bb3Spatrick          ${DARWIN_${platform}_SANITIZER_MIN_VER_FLAG}
5523cab2bb3Spatrick          -isysroot ${DARWIN_${platform}_SYSROOT})
5533cab2bb3Spatrick
5543cab2bb3Spatrick        darwin_test_archs(${platform}
5553cab2bb3Spatrick          DARWIN_${platform}_ARCHS
5563cab2bb3Spatrick          ${toolchain_arches})
5573cab2bb3Spatrick        message(STATUS "${platform} supported arches: ${DARWIN_${platform}_ARCHS}")
5583cab2bb3Spatrick        if(DARWIN_${platform}_ARCHS)
5593cab2bb3Spatrick          list(APPEND SANITIZER_COMMON_SUPPORTED_OS ${platform})
5603cab2bb3Spatrick          list(APPEND PROFILE_SUPPORTED_OS ${platform})
5613cab2bb3Spatrick
5623cab2bb3Spatrick          list_intersect(DARWIN_${platform}_TSAN_ARCHS DARWIN_${platform}_ARCHS ALL_TSAN_SUPPORTED_ARCH)
5633cab2bb3Spatrick          if(DARWIN_${platform}_TSAN_ARCHS)
5643cab2bb3Spatrick            list(APPEND TSAN_SUPPORTED_OS ${platform})
5653cab2bb3Spatrick          endif()
5661f9cb04fSpatrick          list(APPEND FUZZER_SUPPORTED_OS ${platform})
567*810390e3Srobert          list(APPEND ORC_SUPPORTED_OS ${platform})
568*810390e3Srobert          list(APPEND UBSAN_SUPPORTED_OS ${platform})
569*810390e3Srobert          list(APPEND LSAN_SUPPORTED_OS ${platform})
570*810390e3Srobert          list(APPEND STATS_SUPPORTED_OS ${platform})
5713cab2bb3Spatrick        endif()
5723cab2bb3Spatrick        foreach(arch ${DARWIN_${platform}_ARCHS})
5733cab2bb3Spatrick          list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
5743cab2bb3Spatrick          set(CAN_TARGET_${arch} 1)
5753cab2bb3Spatrick        endforeach()
5763cab2bb3Spatrick      endif()
5773cab2bb3Spatrick    endforeach()
5783cab2bb3Spatrick  endif()
5793cab2bb3Spatrick
580*810390e3Srobert  # Explicitly disable unsupported Sanitizer configurations.
5811f9cb04fSpatrick  list(REMOVE_ITEM FUZZER_SUPPORTED_OS "watchos")
5821f9cb04fSpatrick  list(REMOVE_ITEM FUZZER_SUPPORTED_OS "watchossim")
5831f9cb04fSpatrick
5843cab2bb3Spatrick  # for list_intersect
5853cab2bb3Spatrick  include(CompilerRTUtils)
5863cab2bb3Spatrick
5873cab2bb3Spatrick  list_intersect(SANITIZER_COMMON_SUPPORTED_ARCH
5883cab2bb3Spatrick    ALL_SANITIZER_COMMON_SUPPORTED_ARCH
5893cab2bb3Spatrick    COMPILER_RT_SUPPORTED_ARCH
5903cab2bb3Spatrick    )
5913cab2bb3Spatrick  set(LSAN_COMMON_SUPPORTED_ARCH ${SANITIZER_COMMON_SUPPORTED_ARCH})
5923cab2bb3Spatrick  set(UBSAN_COMMON_SUPPORTED_ARCH ${SANITIZER_COMMON_SUPPORTED_ARCH})
5933cab2bb3Spatrick  list_intersect(ASAN_SUPPORTED_ARCH
5943cab2bb3Spatrick    ALL_ASAN_SUPPORTED_ARCH
5953cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
5963cab2bb3Spatrick  list_intersect(DFSAN_SUPPORTED_ARCH
5973cab2bb3Spatrick    ALL_DFSAN_SUPPORTED_ARCH
5983cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
5993cab2bb3Spatrick  list_intersect(GWP_ASAN_SUPPORTED_ARCH
6003cab2bb3Spatrick    ALL_GWP_ASAN_SUPPORTED_ARCH
6013cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6023cab2bb3Spatrick  list_intersect(LSAN_SUPPORTED_ARCH
6033cab2bb3Spatrick    ALL_LSAN_SUPPORTED_ARCH
6043cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6053cab2bb3Spatrick  list_intersect(MSAN_SUPPORTED_ARCH
6063cab2bb3Spatrick    ALL_MSAN_SUPPORTED_ARCH
6073cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6083cab2bb3Spatrick  list_intersect(HWASAN_SUPPORTED_ARCH
6093cab2bb3Spatrick    ALL_HWASAN_SUPPORTED_ARCH
6103cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
611d89ec533Spatrick  list_intersect(MEMPROF_SUPPORTED_ARCH
612d89ec533Spatrick    ALL_MEMPROF_SUPPORTED_ARCH
613d89ec533Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6143cab2bb3Spatrick  list_intersect(PROFILE_SUPPORTED_ARCH
6153cab2bb3Spatrick    ALL_PROFILE_SUPPORTED_ARCH
6163cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6173cab2bb3Spatrick  list_intersect(TSAN_SUPPORTED_ARCH
6183cab2bb3Spatrick    ALL_TSAN_SUPPORTED_ARCH
6193cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6203cab2bb3Spatrick  list_intersect(UBSAN_SUPPORTED_ARCH
6213cab2bb3Spatrick    ALL_UBSAN_SUPPORTED_ARCH
6223cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6233cab2bb3Spatrick  list_intersect(SAFESTACK_SUPPORTED_ARCH
6243cab2bb3Spatrick    ALL_SAFESTACK_SUPPORTED_ARCH
6253cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6263cab2bb3Spatrick  list_intersect(CFI_SUPPORTED_ARCH
6273cab2bb3Spatrick    ALL_CFI_SUPPORTED_ARCH
6283cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6293cab2bb3Spatrick  list_intersect(SCUDO_STANDALONE_SUPPORTED_ARCH
6303cab2bb3Spatrick    ALL_SCUDO_STANDALONE_SUPPORTED_ARCH
6313cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6323cab2bb3Spatrick  list_intersect(FUZZER_SUPPORTED_ARCH
6333cab2bb3Spatrick    ALL_FUZZER_SUPPORTED_ARCH
6343cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6353cab2bb3Spatrick  list_intersect(XRAY_SUPPORTED_ARCH
6363cab2bb3Spatrick    ALL_XRAY_SUPPORTED_ARCH
6373cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6383cab2bb3Spatrick  list_intersect(SHADOWCALLSTACK_SUPPORTED_ARCH
6393cab2bb3Spatrick    ALL_SHADOWCALLSTACK_SUPPORTED_ARCH
6403cab2bb3Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
641d89ec533Spatrick  list_intersect(ORC_SUPPORTED_ARCH
642d89ec533Spatrick    ALL_ORC_SUPPORTED_ARCH
643d89ec533Spatrick    SANITIZER_COMMON_SUPPORTED_ARCH)
6443cab2bb3Spatrick
6453cab2bb3Spatrickelse()
6463cab2bb3Spatrick  # Architectures supported by compiler-rt libraries.
6473cab2bb3Spatrick  filter_available_targets(SANITIZER_COMMON_SUPPORTED_ARCH
6483cab2bb3Spatrick    ${ALL_SANITIZER_COMMON_SUPPORTED_ARCH})
6493cab2bb3Spatrick  # LSan and UBSan common files should be available on all architectures
6503cab2bb3Spatrick  # supported by other sanitizers (even if they build into dummy object files).
6513cab2bb3Spatrick  filter_available_targets(LSAN_COMMON_SUPPORTED_ARCH
6523cab2bb3Spatrick    ${SANITIZER_COMMON_SUPPORTED_ARCH})
6533cab2bb3Spatrick  filter_available_targets(UBSAN_COMMON_SUPPORTED_ARCH
6543cab2bb3Spatrick    ${SANITIZER_COMMON_SUPPORTED_ARCH})
6553cab2bb3Spatrick  filter_available_targets(ASAN_SUPPORTED_ARCH ${ALL_ASAN_SUPPORTED_ARCH})
6563cab2bb3Spatrick  filter_available_targets(FUZZER_SUPPORTED_ARCH ${ALL_FUZZER_SUPPORTED_ARCH})
6573cab2bb3Spatrick  filter_available_targets(DFSAN_SUPPORTED_ARCH ${ALL_DFSAN_SUPPORTED_ARCH})
6583cab2bb3Spatrick  filter_available_targets(LSAN_SUPPORTED_ARCH ${ALL_LSAN_SUPPORTED_ARCH})
6593cab2bb3Spatrick  filter_available_targets(MSAN_SUPPORTED_ARCH ${ALL_MSAN_SUPPORTED_ARCH})
6603cab2bb3Spatrick  filter_available_targets(HWASAN_SUPPORTED_ARCH ${ALL_HWASAN_SUPPORTED_ARCH})
661d89ec533Spatrick  filter_available_targets(MEMPROF_SUPPORTED_ARCH ${ALL_MEMPROF_SUPPORTED_ARCH})
6623cab2bb3Spatrick  filter_available_targets(PROFILE_SUPPORTED_ARCH ${ALL_PROFILE_SUPPORTED_ARCH})
6633cab2bb3Spatrick  filter_available_targets(TSAN_SUPPORTED_ARCH ${ALL_TSAN_SUPPORTED_ARCH})
6643cab2bb3Spatrick  filter_available_targets(UBSAN_SUPPORTED_ARCH ${ALL_UBSAN_SUPPORTED_ARCH})
6653cab2bb3Spatrick  filter_available_targets(SAFESTACK_SUPPORTED_ARCH
6663cab2bb3Spatrick    ${ALL_SAFESTACK_SUPPORTED_ARCH})
6673cab2bb3Spatrick  filter_available_targets(CFI_SUPPORTED_ARCH ${ALL_CFI_SUPPORTED_ARCH})
6683cab2bb3Spatrick  filter_available_targets(SCUDO_STANDALONE_SUPPORTED_ARCH ${ALL_SCUDO_STANDALONE_SUPPORTED_ARCH})
6693cab2bb3Spatrick  filter_available_targets(XRAY_SUPPORTED_ARCH ${ALL_XRAY_SUPPORTED_ARCH})
6703cab2bb3Spatrick  filter_available_targets(SHADOWCALLSTACK_SUPPORTED_ARCH
6713cab2bb3Spatrick    ${ALL_SHADOWCALLSTACK_SUPPORTED_ARCH})
6723cab2bb3Spatrick  filter_available_targets(GWP_ASAN_SUPPORTED_ARCH ${ALL_GWP_ASAN_SUPPORTED_ARCH})
673d89ec533Spatrick  filter_available_targets(ORC_SUPPORTED_ARCH ${ALL_ORC_SUPPORTED_ARCH})
6743cab2bb3Spatrickendif()
6753cab2bb3Spatrick
6763cab2bb3Spatrickif (MSVC)
677*810390e3Srobert  # Allow setting clang-cl's /winsysroot flag.
678*810390e3Srobert  set(LLVM_WINSYSROOT "" CACHE STRING
679*810390e3Srobert    "If set, argument to clang-cl's /winsysroot")
680*810390e3Srobert
681*810390e3Srobert  if (LLVM_WINSYSROOT)
682*810390e3Srobert    set(MSVC_DIA_SDK_DIR "${LLVM_WINSYSROOT}/DIA SDK" CACHE PATH
683*810390e3Srobert        "Path to the DIA SDK")
684*810390e3Srobert  else()
685*810390e3Srobert    set(MSVC_DIA_SDK_DIR "$ENV{VSINSTALLDIR}DIA SDK" CACHE PATH
686*810390e3Srobert        "Path to the DIA SDK")
687*810390e3Srobert  endif()
688*810390e3Srobert
6893cab2bb3Spatrick  # See if the DIA SDK is available and usable.
6903cab2bb3Spatrick  if (IS_DIRECTORY ${MSVC_DIA_SDK_DIR})
6913cab2bb3Spatrick    set(CAN_SYMBOLIZE 1)
6923cab2bb3Spatrick  else()
6933cab2bb3Spatrick    set(CAN_SYMBOLIZE 0)
6943cab2bb3Spatrick  endif()
6953cab2bb3Spatrickelse()
6963cab2bb3Spatrick  set(CAN_SYMBOLIZE 1)
6973cab2bb3Spatrickendif()
6983cab2bb3Spatrick
699d89ec533Spatrickfind_program(GNU_LD_EXECUTABLE NAMES ${LLVM_DEFAULT_TARGET_TRIPLE}-ld.bfd ld.bfd DOC "GNU ld")
700d89ec533Spatrickfind_program(GOLD_EXECUTABLE NAMES ${LLVM_DEFAULT_TARGET_TRIPLE}-ld.gold ld.gold DOC "GNU gold")
7013cab2bb3Spatrick
7023cab2bb3Spatrickif(COMPILER_RT_SUPPORTED_ARCH)
7033cab2bb3Spatrick  list(REMOVE_DUPLICATES COMPILER_RT_SUPPORTED_ARCH)
7043cab2bb3Spatrickendif()
7053cab2bb3Spatrickmessage(STATUS "Compiler-RT supported architectures: ${COMPILER_RT_SUPPORTED_ARCH}")
7063cab2bb3Spatrick
707*810390e3Srobertset(ALL_SANITIZERS asan;dfsan;msan;hwasan;tsan;safestack;cfi;scudo_standalone;ubsan_minimal;gwp_asan)
7083cab2bb3Spatrickset(COMPILER_RT_SANITIZERS_TO_BUILD all CACHE STRING
7093cab2bb3Spatrick    "sanitizers to build if supported on the target (all;${ALL_SANITIZERS})")
7103cab2bb3Spatricklist_replace(COMPILER_RT_SANITIZERS_TO_BUILD all "${ALL_SANITIZERS}")
7113cab2bb3Spatrick
7123cab2bb3Spatrickif (SANITIZER_COMMON_SUPPORTED_ARCH AND NOT LLVM_USE_SANITIZER AND
713d89ec533Spatrick    (OS_NAME MATCHES "Android|Darwin|Linux|FreeBSD|NetBSD|Fuchsia|SunOS" OR
7143cab2bb3Spatrick    (OS_NAME MATCHES "Windows" AND NOT CYGWIN AND
7153cab2bb3Spatrick        (NOT MINGW OR CMAKE_CXX_COMPILER_ID MATCHES "Clang"))))
7163cab2bb3Spatrick  set(COMPILER_RT_HAS_SANITIZER_COMMON TRUE)
7173cab2bb3Spatrickelse()
7183cab2bb3Spatrick  set(COMPILER_RT_HAS_SANITIZER_COMMON FALSE)
7193cab2bb3Spatrickendif()
7203cab2bb3Spatrick
7213cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON)
7223cab2bb3Spatrick  set(COMPILER_RT_HAS_INTERCEPTION TRUE)
7233cab2bb3Spatrickelse()
7243cab2bb3Spatrick  set(COMPILER_RT_HAS_INTERCEPTION FALSE)
7253cab2bb3Spatrickendif()
7263cab2bb3Spatrick
727d89ec533Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND ASAN_SUPPORTED_ARCH)
7283cab2bb3Spatrick  set(COMPILER_RT_HAS_ASAN TRUE)
7293cab2bb3Spatrickelse()
7303cab2bb3Spatrick  set(COMPILER_RT_HAS_ASAN FALSE)
7313cab2bb3Spatrickendif()
7323cab2bb3Spatrick
7333cab2bb3Spatrickif (OS_NAME MATCHES "Linux|FreeBSD|Windows|NetBSD|SunOS")
7343cab2bb3Spatrick  set(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME TRUE)
7353cab2bb3Spatrickelse()
7363cab2bb3Spatrick  set(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME FALSE)
7373cab2bb3Spatrickendif()
7383cab2bb3Spatrick
7393cab2bb3Spatrick# TODO: Add builtins support.
7403cab2bb3Spatrick
7413cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND DFSAN_SUPPORTED_ARCH AND
7423cab2bb3Spatrick    OS_NAME MATCHES "Linux")
7433cab2bb3Spatrick  set(COMPILER_RT_HAS_DFSAN TRUE)
7443cab2bb3Spatrickelse()
7453cab2bb3Spatrick  set(COMPILER_RT_HAS_DFSAN FALSE)
7463cab2bb3Spatrickendif()
7473cab2bb3Spatrick
7483cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND LSAN_SUPPORTED_ARCH AND
749d89ec533Spatrick    OS_NAME MATCHES "Android|Darwin|Linux|NetBSD|Fuchsia")
7503cab2bb3Spatrick  set(COMPILER_RT_HAS_LSAN TRUE)
7513cab2bb3Spatrickelse()
7523cab2bb3Spatrick  set(COMPILER_RT_HAS_LSAN FALSE)
7533cab2bb3Spatrickendif()
7543cab2bb3Spatrick
7553cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND MSAN_SUPPORTED_ARCH AND
7563cab2bb3Spatrick    OS_NAME MATCHES "Linux|FreeBSD|NetBSD")
7573cab2bb3Spatrick  set(COMPILER_RT_HAS_MSAN TRUE)
7583cab2bb3Spatrickelse()
7593cab2bb3Spatrick  set(COMPILER_RT_HAS_MSAN FALSE)
7603cab2bb3Spatrickendif()
7613cab2bb3Spatrick
7623cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND HWASAN_SUPPORTED_ARCH AND
763*810390e3Srobert    OS_NAME MATCHES "Linux|Android|Fuchsia")
7643cab2bb3Spatrick  set(COMPILER_RT_HAS_HWASAN TRUE)
7653cab2bb3Spatrickelse()
7663cab2bb3Spatrick  set(COMPILER_RT_HAS_HWASAN FALSE)
7673cab2bb3Spatrickendif()
7683cab2bb3Spatrick
769d89ec533Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND MEMPROF_SUPPORTED_ARCH AND
770d89ec533Spatrick    OS_NAME MATCHES "Linux")
771d89ec533Spatrick  set(COMPILER_RT_HAS_MEMPROF TRUE)
772d89ec533Spatrickelse()
773d89ec533Spatrick  set(COMPILER_RT_HAS_MEMPROF FALSE)
774d89ec533Spatrickendif()
775d89ec533Spatrick
7763cab2bb3Spatrickif (PROFILE_SUPPORTED_ARCH AND NOT LLVM_USE_SANITIZER AND
777d89ec533Spatrick    OS_NAME MATCHES "Darwin|Linux|FreeBSD|Windows|Android|Fuchsia|SunOS|NetBSD|AIX")
7783cab2bb3Spatrick  set(COMPILER_RT_HAS_PROFILE TRUE)
7793cab2bb3Spatrickelse()
7803cab2bb3Spatrick  set(COMPILER_RT_HAS_PROFILE FALSE)
7813cab2bb3Spatrickendif()
7823cab2bb3Spatrick
783*810390e3Srobertif (COMPILER_RT_HAS_SANITIZER_COMMON AND TSAN_SUPPORTED_ARCH)
784*810390e3Srobert  if (OS_NAME MATCHES "Linux|Darwin|FreeBSD|NetBSD")
785*810390e3Srobert    set(COMPILER_RT_HAS_TSAN TRUE)
786*810390e3Srobert  elseif (OS_NAME MATCHES "Android" AND ANDROID_PLATFORM_LEVEL GREATER 23)
7873cab2bb3Spatrick    set(COMPILER_RT_HAS_TSAN TRUE)
7883cab2bb3Spatrick  else()
7893cab2bb3Spatrick    set(COMPILER_RT_HAS_TSAN FALSE)
7903cab2bb3Spatrick  endif()
791*810390e3Srobertelse()
792*810390e3Srobert  set(COMPILER_RT_HAS_TSAN FALSE)
793*810390e3Srobertendif()
794*810390e3Srobert
795*810390e3Srobertif (OS_NAME MATCHES "Linux|FreeBSD|Windows|NetBSD|SunOS")
796*810390e3Srobert  set(COMPILER_RT_TSAN_HAS_STATIC_RUNTIME TRUE)
797*810390e3Srobertelse()
798*810390e3Srobert  set(COMPILER_RT_TSAN_HAS_STATIC_RUNTIME FALSE)
799*810390e3Srobertendif()
8003cab2bb3Spatrick
8013cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND UBSAN_SUPPORTED_ARCH AND
802d89ec533Spatrick    OS_NAME MATCHES "Darwin|Linux|FreeBSD|NetBSD|Windows|Android|Fuchsia|SunOS")
8033cab2bb3Spatrick  set(COMPILER_RT_HAS_UBSAN TRUE)
8043cab2bb3Spatrickelse()
8053cab2bb3Spatrick  set(COMPILER_RT_HAS_UBSAN FALSE)
8063cab2bb3Spatrickendif()
8073cab2bb3Spatrick
8083cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND UBSAN_SUPPORTED_ARCH AND
809d89ec533Spatrick    OS_NAME MATCHES "Linux|FreeBSD|NetBSD|Android|Darwin")
8103cab2bb3Spatrick  set(COMPILER_RT_HAS_UBSAN_MINIMAL TRUE)
8113cab2bb3Spatrickelse()
8123cab2bb3Spatrick  set(COMPILER_RT_HAS_UBSAN_MINIMAL FALSE)
8133cab2bb3Spatrickendif()
8143cab2bb3Spatrick
8153cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND SAFESTACK_SUPPORTED_ARCH AND
8163cab2bb3Spatrick    OS_NAME MATCHES "Linux|FreeBSD|NetBSD")
8173cab2bb3Spatrick  set(COMPILER_RT_HAS_SAFESTACK TRUE)
8183cab2bb3Spatrickelse()
8193cab2bb3Spatrick  set(COMPILER_RT_HAS_SAFESTACK FALSE)
8203cab2bb3Spatrickendif()
8213cab2bb3Spatrick
8223cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND CFI_SUPPORTED_ARCH)
8233cab2bb3Spatrick  set(COMPILER_RT_HAS_CFI TRUE)
8243cab2bb3Spatrickelse()
8253cab2bb3Spatrick  set(COMPILER_RT_HAS_CFI FALSE)
8263cab2bb3Spatrickendif()
8273cab2bb3Spatrick
8283cab2bb3Spatrick#TODO(kostyak): add back Android & Fuchsia when the code settles a bit.
829*810390e3Srobertif (SCUDO_STANDALONE_SUPPORTED_ARCH AND
830*810390e3Srobert    COMPILER_RT_BUILD_SANITIZERS AND
831*810390e3Srobert    "scudo_standalone" IN_LIST COMPILER_RT_SANITIZERS_TO_BUILD AND
832*810390e3Srobert    OS_NAME MATCHES "Linux" AND
8331f9cb04fSpatrick    COMPILER_RT_HAS_AUXV)
8343cab2bb3Spatrick  set(COMPILER_RT_HAS_SCUDO_STANDALONE TRUE)
8353cab2bb3Spatrickelse()
8363cab2bb3Spatrick  set(COMPILER_RT_HAS_SCUDO_STANDALONE FALSE)
8373cab2bb3Spatrickendif()
8383cab2bb3Spatrick
8393cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND XRAY_SUPPORTED_ARCH AND
840d89ec533Spatrick    OS_NAME MATCHES "Darwin|Linux|FreeBSD|NetBSD|Fuchsia")
8413cab2bb3Spatrick  set(COMPILER_RT_HAS_XRAY TRUE)
8423cab2bb3Spatrickelse()
8433cab2bb3Spatrick  set(COMPILER_RT_HAS_XRAY FALSE)
8443cab2bb3Spatrickendif()
8453cab2bb3Spatrick
846d89ec533Spatrickif (ORC_SUPPORTED_ARCH)
847d89ec533Spatrick  set(COMPILER_RT_HAS_ORC TRUE)
848d89ec533Spatrickelse()
849d89ec533Spatrick  set(COMPILER_RT_HAS_ORC FALSE)
850d89ec533Spatrickendif()
851d89ec533Spatrick
8523cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND FUZZER_SUPPORTED_ARCH AND
853d89ec533Spatrick    OS_NAME MATCHES "Android|Darwin|Linux|NetBSD|FreeBSD|Fuchsia|Windows")
8543cab2bb3Spatrick  set(COMPILER_RT_HAS_FUZZER TRUE)
8553cab2bb3Spatrickelse()
8563cab2bb3Spatrick  set(COMPILER_RT_HAS_FUZZER FALSE)
8573cab2bb3Spatrickendif()
8583cab2bb3Spatrick
8593cab2bb3Spatrickif (COMPILER_RT_HAS_SANITIZER_COMMON AND SHADOWCALLSTACK_SUPPORTED_ARCH AND
8603cab2bb3Spatrick    OS_NAME MATCHES "Linux|Android")
8613cab2bb3Spatrick  set(COMPILER_RT_HAS_SHADOWCALLSTACK TRUE)
8623cab2bb3Spatrickelse()
8633cab2bb3Spatrick  set(COMPILER_RT_HAS_SHADOWCALLSTACK FALSE)
8643cab2bb3Spatrickendif()
8653cab2bb3Spatrick
8663cab2bb3Spatrick# Note: Fuchsia and Windows are not currently supported by GWP-ASan. Support
8673cab2bb3Spatrick# is planned for these platforms. Darwin is also not supported due to TLS
8683cab2bb3Spatrick# calling malloc on first use.
8693cab2bb3Spatrick# TODO(hctim): Enable this on Android again. Looks like it's causing a SIGSEGV
8703cab2bb3Spatrick# for Scudo and GWP-ASan, further testing needed.
871*810390e3Srobertif (GWP_ASAN_SUPPORTED_ARCH AND
872*810390e3Srobert    COMPILER_RT_BUILD_GWP_ASAN AND
873*810390e3Srobert    COMPILER_RT_BUILD_SANITIZERS AND
874*810390e3Srobert    "gwp_asan" IN_LIST COMPILER_RT_SANITIZERS_TO_BUILD AND
8753cab2bb3Spatrick    OS_NAME MATCHES "Linux")
8763cab2bb3Spatrick  set(COMPILER_RT_HAS_GWP_ASAN TRUE)
8773cab2bb3Spatrickelse()
8783cab2bb3Spatrick  set(COMPILER_RT_HAS_GWP_ASAN FALSE)
8793cab2bb3Spatrickendif()
8803cab2bb3Spatrickpythonize_bool(COMPILER_RT_HAS_GWP_ASAN)
881