13cab2bb3Spatrickinclude(BuiltinTests) 23cab2bb3Spatrickinclude(CheckCSourceCompiles) 33cab2bb3Spatrick 43cab2bb3Spatrick# Make all the tests only check the compiler 53cab2bb3Spatrickset(TEST_COMPILE_ONLY On) 63cab2bb3Spatrick 73cab2bb3Spatrick# Check host compiler support for certain flags 83cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fPIC COMPILER_RT_HAS_FPIC_FLAG) 93cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fPIE COMPILER_RT_HAS_FPIE_FLAG) 103cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fno-builtin COMPILER_RT_HAS_FNO_BUILTIN_FLAG) 113cab2bb3Spatrickbuiltin_check_c_compiler_flag(-std=c11 COMPILER_RT_HAS_STD_C11_FLAG) 123cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fvisibility=hidden COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG) 13*810390e3Srobertbuiltin_check_c_compiler_flag(-fomit-frame-pointer COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG) 14*810390e3Srobertbuiltin_check_c_compiler_flag(-ffreestanding COMPILER_RT_HAS_FFREESTANDING_FLAG) 153cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fxray-instrument COMPILER_RT_HAS_XRAY_COMPILER_FLAG) 163cab2bb3Spatrick 173cab2bb3Spatrickbuiltin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD 183cab2bb3Spatrick" 193cab2bb3Spatrickint foo(int x, int y) { 203cab2bb3Spatrick _Atomic int result = x * y; 213cab2bb3Spatrick return result; 223cab2bb3Spatrick} 233cab2bb3Spatrick") 243cab2bb3Spatrick 25d89ec533Spatrickbuiltin_check_c_compiler_source(COMPILER_RT_HAS_ASM_LSE 26d89ec533Spatrick" 27d89ec533Spatrickasm(\".arch armv8-a+lse\"); 28d89ec533Spatrickasm(\"cas w0, w1, [x2]\"); 29d89ec533Spatrick") 303cab2bb3Spatrick 313cab2bb3Spatrickset(ARM64 aarch64) 32*810390e3Srobertset(ARM32 arm armhf armv4t armv5te armv6 armv6m armv7m armv7em armv7 armv7s armv7k armv8m.main armv8.1m.main) 33*810390e3Srobertset(AVR avr) 343cab2bb3Spatrickset(HEXAGON hexagon) 353cab2bb3Spatrickset(X86 i386) 363cab2bb3Spatrickset(X86_64 x86_64) 37*810390e3Srobertset(LOONGARCH64 loongarch64) 383cab2bb3Spatrickset(MIPS32 mips mipsel) 393cab2bb3Spatrickset(MIPS64 mips64 mips64el) 40*810390e3Srobertset(PPC32 powerpc powerpcspe) 413cab2bb3Spatrickset(PPC64 powerpc64 powerpc64le) 423cab2bb3Spatrickset(RISCV32 riscv32) 433cab2bb3Spatrickset(RISCV64 riscv64) 443cab2bb3Spatrickset(SPARC sparc) 453cab2bb3Spatrickset(SPARCV9 sparcv9) 463cab2bb3Spatrickset(WASM32 wasm32) 473cab2bb3Spatrickset(WASM64 wasm64) 481f9cb04fSpatrickset(VE ve) 493cab2bb3Spatrick 503cab2bb3Spatrickif(APPLE) 511f9cb04fSpatrick set(ARM64 arm64 arm64e) 523cab2bb3Spatrick set(ARM32 armv7 armv7k armv7s) 533cab2bb3Spatrick set(X86_64 x86_64 x86_64h) 543cab2bb3Spatrickendif() 553cab2bb3Spatrick 561f9cb04fSpatrickset(ALL_BUILTIN_SUPPORTED_ARCH 57*810390e3Srobert ${X86} ${X86_64} ${ARM32} ${ARM64} ${AVR} 58d89ec533Spatrick ${HEXAGON} ${MIPS32} ${MIPS64} ${PPC32} ${PPC64} 591f9cb04fSpatrick ${RISCV32} ${RISCV64} ${SPARC} ${SPARCV9} 60*810390e3Srobert ${WASM32} ${WASM64} ${VE} ${LOONGARCH64}) 613cab2bb3Spatrick 623cab2bb3Spatrickinclude(CompilerRTUtils) 633cab2bb3Spatrickinclude(CompilerRTDarwinUtils) 643cab2bb3Spatrick 653cab2bb3Spatrickif(APPLE) 663cab2bb3Spatrick 673cab2bb3Spatrick find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx) 683cab2bb3Spatrick find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator) 693cab2bb3Spatrick find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos) 703cab2bb3Spatrick find_darwin_sdk_dir(DARWIN_watchossim_SYSROOT watchsimulator) 713cab2bb3Spatrick find_darwin_sdk_dir(DARWIN_watchos_SYSROOT watchos) 723cab2bb3Spatrick find_darwin_sdk_dir(DARWIN_tvossim_SYSROOT appletvsimulator) 733cab2bb3Spatrick find_darwin_sdk_dir(DARWIN_tvos_SYSROOT appletvos) 743cab2bb3Spatrick 751f9cb04fSpatrick # Get supported architecture from SDKSettings. 761f9cb04fSpatrick function(sdk_has_arch_support sdk_path os arch has_support) 771f9cb04fSpatrick execute_process(COMMAND 781f9cb04fSpatrick /usr/libexec/PlistBuddy -c "Print :SupportedTargets:${os}:Archs" ${sdk_path}/SDKSettings.plist 791f9cb04fSpatrick OUTPUT_VARIABLE SDK_SUPPORTED_ARCHS 80*810390e3Srobert RESULT_VARIABLE PLIST_ERROR 81*810390e3Srobert ERROR_QUIET) 821f9cb04fSpatrick if (PLIST_ERROR EQUAL 0 AND 831f9cb04fSpatrick SDK_SUPPORTED_ARCHS MATCHES " ${arch}\n") 841f9cb04fSpatrick message(STATUS "Found ${arch} support in ${sdk_path}/SDKSettings.plist") 851f9cb04fSpatrick set("${has_support}" On PARENT_SCOPE) 861f9cb04fSpatrick else() 871f9cb04fSpatrick message(STATUS "No ${arch} support in ${sdk_path}/SDKSettings.plist") 881f9cb04fSpatrick set("${has_support}" Off PARENT_SCOPE) 891f9cb04fSpatrick endif() 901f9cb04fSpatrick endfunction() 911f9cb04fSpatrick 923cab2bb3Spatrick set(DARWIN_EMBEDDED_PLATFORMS) 93*810390e3Srobert set(DARWIN_osx_BUILTIN_MIN_VER 10.7) 943cab2bb3Spatrick set(DARWIN_osx_BUILTIN_MIN_VER_FLAG 953cab2bb3Spatrick -mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER}) 963cab2bb3Spatrick set(DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64}) 971f9cb04fSpatrick # Add support for arm64 macOS if available in SDK. 981f9cb04fSpatrick foreach(arch ${ARM64}) 991f9cb04fSpatrick sdk_has_arch_support(${DARWIN_osx_SYSROOT} macosx ${arch} MACOS_ARM_SUPPORT) 1001f9cb04fSpatrick if (MACOS_ARM_SUPPORT) 1011f9cb04fSpatrick list(APPEND DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${arch}) 1021f9cb04fSpatrick endif() 1031f9cb04fSpatrick endforeach(arch) 1043cab2bb3Spatrick 1053cab2bb3Spatrick if(COMPILER_RT_ENABLE_IOS) 1063cab2bb3Spatrick list(APPEND DARWIN_EMBEDDED_PLATFORMS ios) 1073cab2bb3Spatrick set(DARWIN_ios_MIN_VER_FLAG -miphoneos-version-min) 1083cab2bb3Spatrick set(DARWIN_ios_BUILTIN_MIN_VER 6.0) 1093cab2bb3Spatrick set(DARWIN_ios_BUILTIN_MIN_VER_FLAG 1103cab2bb3Spatrick ${DARWIN_ios_MIN_VER_FLAG}=${DARWIN_ios_BUILTIN_MIN_VER}) 1113cab2bb3Spatrick set(DARWIN_ios_BUILTIN_ALL_POSSIBLE_ARCHS ${ARM64} ${ARM32}) 1123cab2bb3Spatrick set(DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64}) 113*810390e3Srobert find_darwin_sdk_version(iossim_sdk_version "iphonesimulator") 114*810390e3Srobert if ("${iossim_sdk_version}" VERSION_GREATER 14.0 OR "${iossim_sdk_version}" VERSION_EQUAL 14.0) 115*810390e3Srobert list(APPEND DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64) 116*810390e3Srobert endif() 1173cab2bb3Spatrick endif() 1183cab2bb3Spatrick if(COMPILER_RT_ENABLE_WATCHOS) 1193cab2bb3Spatrick list(APPEND DARWIN_EMBEDDED_PLATFORMS watchos) 1203cab2bb3Spatrick set(DARWIN_watchos_MIN_VER_FLAG -mwatchos-version-min) 1213cab2bb3Spatrick set(DARWIN_watchos_BUILTIN_MIN_VER 2.0) 1223cab2bb3Spatrick set(DARWIN_watchos_BUILTIN_MIN_VER_FLAG 1233cab2bb3Spatrick ${DARWIN_watchos_MIN_VER_FLAG}=${DARWIN_watchos_BUILTIN_MIN_VER}) 124d89ec533Spatrick set(DARWIN_watchos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 armv7k arm64_32) 1253cab2bb3Spatrick set(DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86}) 126*810390e3Srobert find_darwin_sdk_version(watchossim_sdk_version "watchsimulator") 127*810390e3Srobert if ("${watchossim_sdk_version}" VERSION_GREATER 7.0 OR "${watchossim_sdk_version}" VERSION_EQUAL 7.0) 128*810390e3Srobert list(APPEND DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64) 129*810390e3Srobert endif() 1303cab2bb3Spatrick endif() 1313cab2bb3Spatrick if(COMPILER_RT_ENABLE_TVOS) 1323cab2bb3Spatrick list(APPEND DARWIN_EMBEDDED_PLATFORMS tvos) 1333cab2bb3Spatrick set(DARWIN_tvos_MIN_VER_FLAG -mtvos-version-min) 1343cab2bb3Spatrick set(DARWIN_tvos_BUILTIN_MIN_VER 9.0) 1353cab2bb3Spatrick set(DARWIN_tvos_BUILTIN_MIN_VER_FLAG 1363cab2bb3Spatrick ${DARWIN_tvos_MIN_VER_FLAG}=${DARWIN_tvos_BUILTIN_MIN_VER}) 1373cab2bb3Spatrick set(DARWIN_tvos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 arm64) 1383cab2bb3Spatrick set(DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64}) 139*810390e3Srobert find_darwin_sdk_version(tvossim_sdk_version "appletvsimulator") 140*810390e3Srobert if ("${tvossim_sdk_version}" VERSION_GREATER 14.0 OR "${tvossim_sdk_version}" VERSION_EQUAL 14.0) 141*810390e3Srobert list(APPEND DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64) 142*810390e3Srobert endif() 1433cab2bb3Spatrick endif() 1443cab2bb3Spatrick 1453cab2bb3Spatrick set(BUILTIN_SUPPORTED_OS osx) 1463cab2bb3Spatrick 1473cab2bb3Spatrick # We're setting the flag manually for each target OS 1483cab2bb3Spatrick set(CMAKE_OSX_DEPLOYMENT_TARGET "") 1493cab2bb3Spatrick 1503cab2bb3Spatrick # NOTE: We deliberately avoid using `DARWIN_<os>_ARCHS` here because that is 1513cab2bb3Spatrick # used by `config-ix.cmake` in the context of building the rest of 1523cab2bb3Spatrick # compiler-rt where the global `${TEST_COMPILE_ONLY}` (used by 1533cab2bb3Spatrick # `darwin_test_archs()`) has a different value. 1543cab2bb3Spatrick darwin_test_archs(osx 1553cab2bb3Spatrick DARWIN_osx_BUILTIN_ARCHS 1563cab2bb3Spatrick ${DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS} 1573cab2bb3Spatrick ) 1583cab2bb3Spatrick message(STATUS "OSX supported builtin arches: ${DARWIN_osx_BUILTIN_ARCHS}") 1593cab2bb3Spatrick foreach(arch ${DARWIN_osx_BUILTIN_ARCHS}) 1603cab2bb3Spatrick list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 1613cab2bb3Spatrick set(CAN_TARGET_${arch} 1) 1623cab2bb3Spatrick endforeach() 1633cab2bb3Spatrick 1643cab2bb3Spatrick foreach(platform ${DARWIN_EMBEDDED_PLATFORMS}) 1653cab2bb3Spatrick if(DARWIN_${platform}sim_SYSROOT) 1663cab2bb3Spatrick set(DARWIN_${platform}sim_BUILTIN_MIN_VER 1673cab2bb3Spatrick ${DARWIN_${platform}_BUILTIN_MIN_VER}) 1683cab2bb3Spatrick set(DARWIN_${platform}sim_BUILTIN_MIN_VER_FLAG 1693cab2bb3Spatrick ${DARWIN_${platform}_BUILTIN_MIN_VER_FLAG}) 1703cab2bb3Spatrick 1713cab2bb3Spatrick set(DARWIN_${platform}sim_SKIP_CC_KEXT On) 1723cab2bb3Spatrick 1733cab2bb3Spatrick darwin_test_archs(${platform}sim 1743cab2bb3Spatrick DARWIN_${platform}sim_BUILTIN_ARCHS 1753cab2bb3Spatrick ${DARWIN_${platform}sim_BUILTIN_ALL_POSSIBLE_ARCHS} 1763cab2bb3Spatrick ) 1773cab2bb3Spatrick message(STATUS "${platform} Simulator supported builtin arches: ${DARWIN_${platform}sim_BUILTIN_ARCHS}") 1783cab2bb3Spatrick if(DARWIN_${platform}sim_BUILTIN_ARCHS) 1793cab2bb3Spatrick list(APPEND BUILTIN_SUPPORTED_OS ${platform}sim) 1803cab2bb3Spatrick endif() 1813cab2bb3Spatrick foreach(arch ${DARWIN_${platform}sim_BUILTIN_ARCHS}) 1823cab2bb3Spatrick list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 1833cab2bb3Spatrick set(CAN_TARGET_${arch} 1) 1843cab2bb3Spatrick endforeach() 1853cab2bb3Spatrick endif() 1863cab2bb3Spatrick 1873cab2bb3Spatrick if(DARWIN_${platform}_SYSROOT) 1883cab2bb3Spatrick darwin_test_archs(${platform} 1893cab2bb3Spatrick DARWIN_${platform}_BUILTIN_ARCHS 1903cab2bb3Spatrick ${DARWIN_${platform}_BUILTIN_ALL_POSSIBLE_ARCHS} 1913cab2bb3Spatrick ) 1923cab2bb3Spatrick message(STATUS "${platform} supported builtin arches: ${DARWIN_${platform}_BUILTIN_ARCHS}") 1933cab2bb3Spatrick if(DARWIN_${platform}_BUILTIN_ARCHS) 1943cab2bb3Spatrick list(APPEND BUILTIN_SUPPORTED_OS ${platform}) 1953cab2bb3Spatrick endif() 1963cab2bb3Spatrick foreach(arch ${DARWIN_${platform}_BUILTIN_ARCHS}) 1973cab2bb3Spatrick list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 1983cab2bb3Spatrick set(CAN_TARGET_${arch} 1) 1993cab2bb3Spatrick endforeach() 2003cab2bb3Spatrick endif() 2013cab2bb3Spatrick endforeach() 2023cab2bb3Spatrick 2033cab2bb3Spatrick list_intersect(BUILTIN_SUPPORTED_ARCH ALL_BUILTIN_SUPPORTED_ARCH COMPILER_RT_SUPPORTED_ARCH) 2043cab2bb3Spatrick 2053cab2bb3Spatrickelse() 2063cab2bb3Spatrick # If we're not building the builtins standalone, just rely on the tests in 2073cab2bb3Spatrick # config-ix.cmake to tell us what to build. Otherwise we need to do some leg 2083cab2bb3Spatrick # work here... 2093cab2bb3Spatrick if(COMPILER_RT_BUILTINS_STANDALONE_BUILD) 2103cab2bb3Spatrick test_targets() 2113cab2bb3Spatrick endif() 2123cab2bb3Spatrick # Architectures supported by compiler-rt libraries. 2133cab2bb3Spatrick filter_available_targets(BUILTIN_SUPPORTED_ARCH 2143cab2bb3Spatrick ${ALL_BUILTIN_SUPPORTED_ARCH}) 2153cab2bb3Spatrickendif() 2163cab2bb3Spatrick 2173cab2bb3Spatrickmessage(STATUS "Builtin supported architectures: ${BUILTIN_SUPPORTED_ARCH}") 218