1include(BuiltinTests) 2include(CheckCSourceCompiles) 3 4# Make all the tests only check the compiler 5set(TEST_COMPILE_ONLY On) 6 7# Check host compiler support for certain flags 8builtin_check_c_compiler_flag(-fPIC COMPILER_RT_HAS_FPIC_FLAG) 9builtin_check_c_compiler_flag(-fPIE COMPILER_RT_HAS_FPIE_FLAG) 10builtin_check_c_compiler_flag(-fno-builtin COMPILER_RT_HAS_FNO_BUILTIN_FLAG) 11builtin_check_c_compiler_flag(-std=c11 COMPILER_RT_HAS_STD_C11_FLAG) 12builtin_check_c_compiler_flag(-fvisibility=hidden COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG) 13builtin_check_c_compiler_flag(-fomit-frame-pointer COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG) 14builtin_check_c_compiler_flag(-ffreestanding COMPILER_RT_HAS_FFREESTANDING_FLAG) 15builtin_check_c_compiler_flag(-fxray-instrument COMPILER_RT_HAS_XRAY_COMPILER_FLAG) 16 17builtin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD 18" 19int foo(int x, int y) { 20 _Atomic int result = x * y; 21 return result; 22} 23") 24 25builtin_check_c_compiler_source(COMPILER_RT_HAS_ASM_LSE 26" 27asm(\".arch armv8-a+lse\"); 28asm(\"cas w0, w1, [x2]\"); 29") 30 31set(ARM64 aarch64) 32set(ARM32 arm armhf armv4t armv5te armv6 armv6m armv7m armv7em armv7 armv7s armv7k armv8m.main armv8.1m.main) 33set(AVR avr) 34set(HEXAGON hexagon) 35set(X86 i386) 36set(X86_64 x86_64) 37set(LOONGARCH64 loongarch64) 38set(MIPS32 mips mipsel) 39set(MIPS64 mips64 mips64el) 40set(PPC32 powerpc powerpcspe) 41set(PPC64 powerpc64 powerpc64le) 42set(RISCV32 riscv32) 43set(RISCV64 riscv64) 44set(SPARC sparc) 45set(SPARCV9 sparcv9) 46set(WASM32 wasm32) 47set(WASM64 wasm64) 48set(VE ve) 49 50if(APPLE) 51 set(ARM64 arm64 arm64e) 52 set(ARM32 armv7 armv7k armv7s) 53 set(X86_64 x86_64 x86_64h) 54endif() 55 56set(ALL_BUILTIN_SUPPORTED_ARCH 57 ${X86} ${X86_64} ${ARM32} ${ARM64} ${AVR} 58 ${HEXAGON} ${MIPS32} ${MIPS64} ${PPC32} ${PPC64} 59 ${RISCV32} ${RISCV64} ${SPARC} ${SPARCV9} 60 ${WASM32} ${WASM64} ${VE} ${LOONGARCH64}) 61 62include(CompilerRTUtils) 63include(CompilerRTDarwinUtils) 64 65if(APPLE) 66 67 find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx) 68 find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator) 69 find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos) 70 find_darwin_sdk_dir(DARWIN_watchossim_SYSROOT watchsimulator) 71 find_darwin_sdk_dir(DARWIN_watchos_SYSROOT watchos) 72 find_darwin_sdk_dir(DARWIN_tvossim_SYSROOT appletvsimulator) 73 find_darwin_sdk_dir(DARWIN_tvos_SYSROOT appletvos) 74 75 # Get supported architecture from SDKSettings. 76 function(sdk_has_arch_support sdk_path os arch has_support) 77 execute_process(COMMAND 78 /usr/libexec/PlistBuddy -c "Print :SupportedTargets:${os}:Archs" ${sdk_path}/SDKSettings.plist 79 OUTPUT_VARIABLE SDK_SUPPORTED_ARCHS 80 RESULT_VARIABLE PLIST_ERROR 81 ERROR_QUIET) 82 if (PLIST_ERROR EQUAL 0 AND 83 SDK_SUPPORTED_ARCHS MATCHES " ${arch}\n") 84 message(STATUS "Found ${arch} support in ${sdk_path}/SDKSettings.plist") 85 set("${has_support}" On PARENT_SCOPE) 86 else() 87 message(STATUS "No ${arch} support in ${sdk_path}/SDKSettings.plist") 88 set("${has_support}" Off PARENT_SCOPE) 89 endif() 90 endfunction() 91 92 set(DARWIN_EMBEDDED_PLATFORMS) 93 set(DARWIN_osx_BUILTIN_MIN_VER 10.7) 94 set(DARWIN_osx_BUILTIN_MIN_VER_FLAG 95 -mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER}) 96 set(DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64}) 97 # Add support for arm64 macOS if available in SDK. 98 foreach(arch ${ARM64}) 99 sdk_has_arch_support(${DARWIN_osx_SYSROOT} macosx ${arch} MACOS_ARM_SUPPORT) 100 if (MACOS_ARM_SUPPORT) 101 list(APPEND DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${arch}) 102 endif() 103 endforeach(arch) 104 105 if(COMPILER_RT_ENABLE_IOS) 106 list(APPEND DARWIN_EMBEDDED_PLATFORMS ios) 107 set(DARWIN_ios_MIN_VER_FLAG -miphoneos-version-min) 108 set(DARWIN_ios_BUILTIN_MIN_VER 6.0) 109 set(DARWIN_ios_BUILTIN_MIN_VER_FLAG 110 ${DARWIN_ios_MIN_VER_FLAG}=${DARWIN_ios_BUILTIN_MIN_VER}) 111 set(DARWIN_ios_BUILTIN_ALL_POSSIBLE_ARCHS ${ARM64} ${ARM32}) 112 set(DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64}) 113 find_darwin_sdk_version(iossim_sdk_version "iphonesimulator") 114 if ("${iossim_sdk_version}" VERSION_GREATER 14.0 OR "${iossim_sdk_version}" VERSION_EQUAL 14.0) 115 list(APPEND DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64) 116 endif() 117 endif() 118 if(COMPILER_RT_ENABLE_WATCHOS) 119 list(APPEND DARWIN_EMBEDDED_PLATFORMS watchos) 120 set(DARWIN_watchos_MIN_VER_FLAG -mwatchos-version-min) 121 set(DARWIN_watchos_BUILTIN_MIN_VER 2.0) 122 set(DARWIN_watchos_BUILTIN_MIN_VER_FLAG 123 ${DARWIN_watchos_MIN_VER_FLAG}=${DARWIN_watchos_BUILTIN_MIN_VER}) 124 set(DARWIN_watchos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 armv7k arm64_32) 125 set(DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86}) 126 find_darwin_sdk_version(watchossim_sdk_version "watchsimulator") 127 if ("${watchossim_sdk_version}" VERSION_GREATER 7.0 OR "${watchossim_sdk_version}" VERSION_EQUAL 7.0) 128 list(APPEND DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64) 129 endif() 130 endif() 131 if(COMPILER_RT_ENABLE_TVOS) 132 list(APPEND DARWIN_EMBEDDED_PLATFORMS tvos) 133 set(DARWIN_tvos_MIN_VER_FLAG -mtvos-version-min) 134 set(DARWIN_tvos_BUILTIN_MIN_VER 9.0) 135 set(DARWIN_tvos_BUILTIN_MIN_VER_FLAG 136 ${DARWIN_tvos_MIN_VER_FLAG}=${DARWIN_tvos_BUILTIN_MIN_VER}) 137 set(DARWIN_tvos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 arm64) 138 set(DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64}) 139 find_darwin_sdk_version(tvossim_sdk_version "appletvsimulator") 140 if ("${tvossim_sdk_version}" VERSION_GREATER 14.0 OR "${tvossim_sdk_version}" VERSION_EQUAL 14.0) 141 list(APPEND DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64) 142 endif() 143 endif() 144 145 set(BUILTIN_SUPPORTED_OS osx) 146 147 # We're setting the flag manually for each target OS 148 set(CMAKE_OSX_DEPLOYMENT_TARGET "") 149 150 # NOTE: We deliberately avoid using `DARWIN_<os>_ARCHS` here because that is 151 # used by `config-ix.cmake` in the context of building the rest of 152 # compiler-rt where the global `${TEST_COMPILE_ONLY}` (used by 153 # `darwin_test_archs()`) has a different value. 154 darwin_test_archs(osx 155 DARWIN_osx_BUILTIN_ARCHS 156 ${DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS} 157 ) 158 message(STATUS "OSX supported builtin arches: ${DARWIN_osx_BUILTIN_ARCHS}") 159 foreach(arch ${DARWIN_osx_BUILTIN_ARCHS}) 160 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 161 set(CAN_TARGET_${arch} 1) 162 endforeach() 163 164 foreach(platform ${DARWIN_EMBEDDED_PLATFORMS}) 165 if(DARWIN_${platform}sim_SYSROOT) 166 set(DARWIN_${platform}sim_BUILTIN_MIN_VER 167 ${DARWIN_${platform}_BUILTIN_MIN_VER}) 168 set(DARWIN_${platform}sim_BUILTIN_MIN_VER_FLAG 169 ${DARWIN_${platform}_BUILTIN_MIN_VER_FLAG}) 170 171 set(DARWIN_${platform}sim_SKIP_CC_KEXT On) 172 173 darwin_test_archs(${platform}sim 174 DARWIN_${platform}sim_BUILTIN_ARCHS 175 ${DARWIN_${platform}sim_BUILTIN_ALL_POSSIBLE_ARCHS} 176 ) 177 message(STATUS "${platform} Simulator supported builtin arches: ${DARWIN_${platform}sim_BUILTIN_ARCHS}") 178 if(DARWIN_${platform}sim_BUILTIN_ARCHS) 179 list(APPEND BUILTIN_SUPPORTED_OS ${platform}sim) 180 endif() 181 foreach(arch ${DARWIN_${platform}sim_BUILTIN_ARCHS}) 182 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 183 set(CAN_TARGET_${arch} 1) 184 endforeach() 185 endif() 186 187 if(DARWIN_${platform}_SYSROOT) 188 darwin_test_archs(${platform} 189 DARWIN_${platform}_BUILTIN_ARCHS 190 ${DARWIN_${platform}_BUILTIN_ALL_POSSIBLE_ARCHS} 191 ) 192 message(STATUS "${platform} supported builtin arches: ${DARWIN_${platform}_BUILTIN_ARCHS}") 193 if(DARWIN_${platform}_BUILTIN_ARCHS) 194 list(APPEND BUILTIN_SUPPORTED_OS ${platform}) 195 endif() 196 foreach(arch ${DARWIN_${platform}_BUILTIN_ARCHS}) 197 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) 198 set(CAN_TARGET_${arch} 1) 199 endforeach() 200 endif() 201 endforeach() 202 203 list_intersect(BUILTIN_SUPPORTED_ARCH ALL_BUILTIN_SUPPORTED_ARCH COMPILER_RT_SUPPORTED_ARCH) 204 205else() 206 # If we're not building the builtins standalone, just rely on the tests in 207 # config-ix.cmake to tell us what to build. Otherwise we need to do some leg 208 # work here... 209 if(COMPILER_RT_BUILTINS_STANDALONE_BUILD) 210 test_targets() 211 endif() 212 # Architectures supported by compiler-rt libraries. 213 filter_available_targets(BUILTIN_SUPPORTED_ARCH 214 ${ALL_BUILTIN_SUPPORTED_ARCH}) 215endif() 216 217message(STATUS "Builtin supported architectures: ${BUILTIN_SUPPORTED_ARCH}") 218