293 lines · plain
1include(BuiltinTests)2include(CheckIncludeFiles)3include(CheckCSourceCompiles)4 5# Make all the tests only check the compiler6set(TEST_COMPILE_ONLY On)7 8# Check host compiler support for certain flags9builtin_check_c_compiler_flag(-fPIC COMPILER_RT_HAS_FPIC_FLAG)10builtin_check_c_compiler_flag(-fPIE COMPILER_RT_HAS_FPIE_FLAG)11builtin_check_c_compiler_flag(-fno-builtin COMPILER_RT_HAS_FNO_BUILTIN_FLAG)12builtin_check_c_compiler_flag(-std=c11 COMPILER_RT_HAS_STD_C11_FLAG)13builtin_check_c_compiler_flag(-fvisibility=hidden COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG)14builtin_check_c_compiler_flag(-fomit-frame-pointer COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG)15builtin_check_c_compiler_flag(-ffreestanding COMPILER_RT_HAS_FFREESTANDING_FLAG)16builtin_check_c_compiler_flag(-fxray-instrument COMPILER_RT_HAS_XRAY_COMPILER_FLAG)17builtin_check_c_compiler_flag(-fno-lto COMPILER_RT_HAS_FNO_LTO_FLAG)18builtin_check_c_compiler_flag(-fno-profile-generate COMPILER_RT_HAS_FNO_PROFILE_GENERATE_FLAG)19builtin_check_c_compiler_flag(-fno-profile-instr-generate COMPILER_RT_HAS_FNO_PROFILE_INSTR_GENERATE_FLAG)20builtin_check_c_compiler_flag(-fno-profile-instr-use COMPILER_RT_HAS_FNO_PROFILE_INSTR_USE_FLAG)21builtin_check_c_compiler_flag(-Wno-pedantic COMPILER_RT_HAS_WNO_PEDANTIC)22builtin_check_c_compiler_flag(-nogpulib COMPILER_RT_HAS_NOGPULIB_FLAG)23builtin_check_c_compiler_flag(-flto COMPILER_RT_HAS_FLTO_FLAG)24builtin_check_c_compiler_flag(-fconvergent-functions COMPILER_RT_HAS_FCONVERGENT_FUNCTIONS_FLAG)25builtin_check_c_compiler_flag("-Xclang -mcode-object-version=none" COMPILER_RT_HAS_CODE_OBJECT_VERSION_FLAG)26builtin_check_c_compiler_flag(-Wbuiltin-declaration-mismatch COMPILER_RT_HAS_WBUILTIN_DECLARATION_MISMATCH_FLAG)27builtin_check_c_compiler_flag(/Zl COMPILER_RT_HAS_ZL_FLAG)28builtin_check_c_compiler_flag(-fcf-protection=full COMPILER_RT_HAS_FCF_PROTECTION_FLAG)29builtin_check_c_compiler_flag(-nostdinc++ COMPILER_RT_HAS_NOSTDINCXX_FLAG)30 31builtin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD32"33int foo(int x, int y) {34 _Atomic int result = x * y;35 return result;36}37")38 39builtin_check_c_compiler_source(COMPILER_RT_HAS_ASM_LSE40"41asm(\".arch armv8-a+lse\");42asm(\"cas w0, w1, [x2]\");43")44 45builtin_check_c_compiler_source(COMPILER_RT_HAS_AARCH64_SME46"47void foo(void) __arm_streaming_compatible {48 asm(\".arch armv9-a+sme2\\n\"49 \"smstart\\n\"50 \"ldr zt0, [sp]\");51}52")53 54builtin_check_c_compiler_source(COMPILER_RT_HAS_ARM_UNALIGNED55"56void foo() {57#ifndef __ARM_FEATURE_UNALIGNED58#error \"Unaligned accesses unsupported\"59#endif60}61")62 63builtin_check_c_compiler_source(COMPILER_RT_HAS_ARM_FP64"65void foo() {66#ifndef __ARM_FP67#error \"No floating-point support\"68#endif69}70")71 72check_include_files("sys/auxv.h" COMPILER_RT_HAS_AUXV)73 74if(ANDROID)75 set(OS_NAME "Android")76else()77 set(OS_NAME "${CMAKE_SYSTEM_NAME}")78endif()79 80set(AMDGPU amdgcn)81set(ARM64 aarch64 arm64ec)82set(ARM32 arm armhf armv4t armv5te armv6 armv6m armv7m armv7em armv7 armv7s armv7k armv8m.base armv8m.main armv8.1m.main)83set(AVR avr)84set(HEXAGON hexagon)85set(X86 i386)86set(X86_64 x86_64)87set(LOONGARCH64 loongarch64)88set(MIPS32 mips mipsel)89set(MIPS64 mips64 mips64el)90set(NVPTX nvptx64)91set(PPC32 powerpc powerpcspe)92set(PPC64 powerpc64 powerpc64le)93set(RISCV32 riscv32)94set(RISCV64 riscv64)95set(S390X s390x)96set(SPARC sparc)97set(SPARCV9 sparcv9)98set(WASM32 wasm32)99set(WASM64 wasm64)100set(VE ve)101set(M68K m68k)102 103if(APPLE)104 set(ARM64 arm64 arm64e)105 set(ARM32 armv7 armv7k armv7s)106 set(X86_64 x86_64 x86_64h)107endif()108 109set(ALL_BUILTIN_SUPPORTED_ARCH110 ${X86} ${X86_64} ${AMDGPU} ${ARM32} ${ARM64} ${AVR}111 ${HEXAGON} ${MIPS32} ${MIPS64} ${NVPTX} ${PPC32} ${PPC64}112 ${RISCV32} ${RISCV64} ${S390X} ${SPARC} ${SPARCV9}113 ${WASM32} ${WASM64} ${VE} ${LOONGARCH64} ${M68K})114 115include(CompilerRTUtils)116include(CompilerRTDarwinUtils)117 118if(APPLE)119 120 find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx)121 if(COMPILER_RT_ENABLE_IOS)122 find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator)123 find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos)124 endif()125 if(COMPILER_RT_ENABLE_WATCHOS)126 find_darwin_sdk_dir(DARWIN_watchossim_SYSROOT watchsimulator)127 find_darwin_sdk_dir(DARWIN_watchos_SYSROOT watchos)128 endif()129 if(COMPILER_RT_ENABLE_TVOS)130 find_darwin_sdk_dir(DARWIN_tvossim_SYSROOT appletvsimulator)131 find_darwin_sdk_dir(DARWIN_tvos_SYSROOT appletvos)132 endif()133 if(COMPILER_RT_ENABLE_XROS)134 find_darwin_sdk_dir(DARWIN_xrossim_SYSROOT xrsimulator)135 find_darwin_sdk_dir(DARWIN_xros_SYSROOT xros)136 endif()137 138 # Get supported architecture from SDKSettings.139 function(sdk_has_arch_support sdk_path os arch has_support)140 execute_process(COMMAND141 /usr/libexec/PlistBuddy -c "Print :SupportedTargets:${os}:Archs" ${sdk_path}/SDKSettings.plist142 OUTPUT_VARIABLE SDK_SUPPORTED_ARCHS143 RESULT_VARIABLE PLIST_ERROR144 ERROR_QUIET)145 if (PLIST_ERROR EQUAL 0 AND146 SDK_SUPPORTED_ARCHS MATCHES " ${arch}\n")147 message(STATUS "Found ${arch} support in ${sdk_path}/SDKSettings.plist")148 set("${has_support}" On PARENT_SCOPE)149 else()150 message(STATUS "No ${arch} support in ${sdk_path}/SDKSettings.plist")151 set("${has_support}" Off PARENT_SCOPE)152 endif()153 endfunction()154 155 set(DARWIN_EMBEDDED_PLATFORMS)156 set(DARWIN_osx_BUILTIN_MIN_VER 10.7)157 set(DARWIN_osx_BUILTIN_MIN_VER_FLAG158 -mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER})159 set(DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})160 # Add support for arm64 macOS if available in SDK.161 foreach(arch ${ARM64})162 sdk_has_arch_support(${DARWIN_osx_SYSROOT} macosx ${arch} MACOS_ARM_SUPPORT)163 if (MACOS_ARM_SUPPORT)164 list(APPEND DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${arch})165 endif()166 endforeach(arch)167 168 if(COMPILER_RT_ENABLE_IOS)169 list(APPEND DARWIN_EMBEDDED_PLATFORMS ios)170 set(DARWIN_ios_MIN_VER_FLAG -miphoneos-version-min)171 set(DARWIN_ios_BUILTIN_MIN_VER 6.0)172 set(DARWIN_ios_BUILTIN_MIN_VER_FLAG173 ${DARWIN_ios_MIN_VER_FLAG}=${DARWIN_ios_BUILTIN_MIN_VER})174 set(DARWIN_ios_BUILTIN_ALL_POSSIBLE_ARCHS ${ARM64} ${ARM32})175 set(DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})176 find_darwin_sdk_version(iossim_sdk_version "iphonesimulator")177 if ("${iossim_sdk_version}" VERSION_GREATER 14.0 OR "${iossim_sdk_version}" VERSION_EQUAL 14.0)178 list(APPEND DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)179 endif()180 endif()181 if(COMPILER_RT_ENABLE_WATCHOS)182 list(APPEND DARWIN_EMBEDDED_PLATFORMS watchos)183 set(DARWIN_watchos_MIN_VER_FLAG -mwatchos-version-min)184 set(DARWIN_watchos_BUILTIN_MIN_VER 2.0)185 set(DARWIN_watchos_BUILTIN_MIN_VER_FLAG186 ${DARWIN_watchos_MIN_VER_FLAG}=${DARWIN_watchos_BUILTIN_MIN_VER})187 set(DARWIN_watchos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 armv7k arm64_32)188 set(DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86})189 find_darwin_sdk_version(watchossim_sdk_version "watchsimulator")190 if ("${watchossim_sdk_version}" VERSION_GREATER 7.0 OR "${watchossim_sdk_version}" VERSION_EQUAL 7.0)191 list(APPEND DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)192 endif()193 endif()194 if(COMPILER_RT_ENABLE_TVOS)195 list(APPEND DARWIN_EMBEDDED_PLATFORMS tvos)196 set(DARWIN_tvos_MIN_VER_FLAG -mtvos-version-min)197 set(DARWIN_tvos_BUILTIN_MIN_VER 9.0)198 set(DARWIN_tvos_BUILTIN_MIN_VER_FLAG199 ${DARWIN_tvos_MIN_VER_FLAG}=${DARWIN_tvos_BUILTIN_MIN_VER})200 set(DARWIN_tvos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 arm64)201 set(DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})202 find_darwin_sdk_version(tvossim_sdk_version "appletvsimulator")203 if ("${tvossim_sdk_version}" VERSION_GREATER 14.0 OR "${tvossim_sdk_version}" VERSION_EQUAL 14.0)204 list(APPEND DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)205 endif()206 endif()207 if(COMPILER_RT_ENABLE_XROS)208 list(APPEND DARWIN_EMBEDDED_PLATFORMS xros)209 set(DARWIN_xros_BUILTIN_ALL_POSSIBLE_ARCHS ${ARM64} ${ARM32})210 set(DARWIN_xrossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)211 endif()212 213 set(BUILTIN_SUPPORTED_OS osx)214 215 # We're setting the flag manually for each target OS216 set(CMAKE_OSX_DEPLOYMENT_TARGET "")217 218 # NOTE: We deliberately avoid using `DARWIN_<os>_ARCHS` here because that is219 # used by `config-ix.cmake` in the context of building the rest of220 # compiler-rt where the global `${TEST_COMPILE_ONLY}` (used by221 # `darwin_test_archs()`) has a different value.222 darwin_test_archs(osx223 DARWIN_osx_BUILTIN_ARCHS224 ${DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS}225 )226 message(STATUS "OSX supported builtin arches: ${DARWIN_osx_BUILTIN_ARCHS}")227 foreach(arch ${DARWIN_osx_BUILTIN_ARCHS})228 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})229 set(CAN_TARGET_${arch} 1)230 endforeach()231 232 foreach(platform ${DARWIN_EMBEDDED_PLATFORMS})233 if(DARWIN_${platform}sim_SYSROOT)234 set(DARWIN_${platform}sim_BUILTIN_MIN_VER235 ${DARWIN_${platform}_BUILTIN_MIN_VER})236 set(DARWIN_${platform}sim_BUILTIN_MIN_VER_FLAG237 ${DARWIN_${platform}_BUILTIN_MIN_VER_FLAG})238 239 set(DARWIN_${platform}sim_SKIP_CC_KEXT On)240 241 darwin_test_archs(${platform}sim242 DARWIN_${platform}sim_BUILTIN_ARCHS243 ${DARWIN_${platform}sim_BUILTIN_ALL_POSSIBLE_ARCHS}244 )245 message(STATUS "${platform} Simulator supported builtin arches: ${DARWIN_${platform}sim_BUILTIN_ARCHS}")246 if(DARWIN_${platform}sim_BUILTIN_ARCHS)247 list(APPEND BUILTIN_SUPPORTED_OS ${platform}sim)248 endif()249 foreach(arch ${DARWIN_${platform}sim_BUILTIN_ARCHS})250 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})251 set(CAN_TARGET_${arch} 1)252 endforeach()253 endif()254 255 if(DARWIN_${platform}_SYSROOT)256 darwin_test_archs(${platform}257 DARWIN_${platform}_BUILTIN_ARCHS258 ${DARWIN_${platform}_BUILTIN_ALL_POSSIBLE_ARCHS}259 )260 message(STATUS "${platform} supported builtin arches: ${DARWIN_${platform}_BUILTIN_ARCHS}")261 if(DARWIN_${platform}_BUILTIN_ARCHS)262 list(APPEND BUILTIN_SUPPORTED_OS ${platform})263 endif()264 foreach(arch ${DARWIN_${platform}_BUILTIN_ARCHS})265 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})266 set(CAN_TARGET_${arch} 1)267 endforeach()268 endif()269 endforeach()270 271 list_intersect(BUILTIN_SUPPORTED_ARCH ALL_BUILTIN_SUPPORTED_ARCH COMPILER_RT_SUPPORTED_ARCH)272 273else()274 # If we're not building the builtins standalone, just rely on the tests in275 # config-ix.cmake to tell us what to build. Otherwise we need to do some leg276 # work here...277 if(COMPILER_RT_BUILTINS_STANDALONE_BUILD)278 test_targets()279 endif()280 # Architectures supported by compiler-rt libraries.281 filter_available_targets(BUILTIN_SUPPORTED_ARCH282 ${ALL_BUILTIN_SUPPORTED_ARCH})283endif()284 285if(OS_NAME MATCHES "Linux|SerenityOS" AND NOT LLVM_USE_SANITIZER AND NOT286 COMPILER_RT_GPU_BUILD)287 set(COMPILER_RT_HAS_CRT TRUE)288else()289 set(COMPILER_RT_HAS_CRT FALSE)290endif()291 292message(STATUS "Builtin supported architectures: ${BUILTIN_SUPPORTED_ARCH}")293