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