2 include(CheckIncludeFiles)
3 include(CheckCSourceCompiles)
5 # Make all the tests only check the compiler
6 set(TEST_COMPILE_ONLY On)
8 # Check host compiler support for certain flags
9 builtin_check_c_compiler_flag(-fPIC COMPILER_RT_HAS_FPIC_FLAG)
10 builtin_check_c_compiler_flag(-fPIE COMPILER_RT_HAS_FPIE_FLAG)
11 builtin_check_c_compiler_flag(-fno-builtin COMPILER_RT_HAS_FNO_BUILTIN_FLAG)
12 builtin_check_c_compiler_flag(-std=c11 COMPILER_RT_HAS_STD_C11_FLAG)
13 builtin_check_c_compiler_flag(-fvisibility=hidden COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG)
14 builtin_check_c_compiler_flag(-fomit-frame-pointer COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG)
15 builtin_check_c_compiler_flag(-ffreestanding COMPILER_RT_HAS_FFREESTANDING_FLAG)
16 builtin_check_c_compiler_flag(-fxray-instrument COMPILER_RT_HAS_XRAY_COMPILER_FLAG)
17 builtin_check_c_compiler_flag(-fno-lto COMPILER_RT_HAS_FNO_LTO_FLAG)
18 builtin_check_c_compiler_flag(-fno-profile-generate COMPILER_RT_HAS_FNO_PROFILE_GENERATE_FLAG)
19 builtin_check_c_compiler_flag(-fno-profile-instr-generate COMPILER_RT_HAS_FNO_PROFILE_INSTR_GENERATE_FLAG)
20 builtin_check_c_compiler_flag(-fno-profile-instr-use COMPILER_RT_HAS_FNO_PROFILE_INSTR_USE_FLAG)
21 builtin_check_c_compiler_flag(-Wno-pedantic COMPILER_RT_HAS_WNO_PEDANTIC)
22 builtin_check_c_compiler_flag(-nogpulib COMPILER_RT_HAS_NOGPULIB_FLAG)
23 builtin_check_c_compiler_flag(-flto COMPILER_RT_HAS_FLTO_FLAG)
24 builtin_check_c_compiler_flag(-fconvergent-functions COMPILER_RT_HAS_FCONVERGENT_FUNCTIONS_FLAG)
25 builtin_check_c_compiler_flag("-Xclang -mcode-object-version=none" COMPILER_RT_HAS_CODE_OBJECT_VERSION_FLAG)
26 builtin_check_c_compiler_flag(-Wbuiltin-declaration-mismatch COMPILER_RT_HAS_WBUILTIN_DECLARATION_MISMATCH_FLAG)
27 builtin_check_c_compiler_flag(/Zl COMPILER_RT_HAS_ZL_FLAG)
29 builtin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD
31 int foo(int x, int y) {
32 _Atomic int result = x * y;
37 builtin_check_c_compiler_source(COMPILER_RT_HAS_ASM_LSE
39 asm(\".arch armv8-a+lse\");
40 asm(\"cas w0, w1, [x2]\");
43 builtin_check_c_compiler_source(COMPILER_RT_HAS_AARCH64_SME
45 void foo(void) __arm_streaming_compatible {
46 asm(\".arch armv9-a+sme2\\n\"
52 check_include_files("sys/auxv.h" COMPILER_RT_HAS_AUXV)
55 set(OS_NAME "Android")
57 set(OS_NAME "${CMAKE_SYSTEM_NAME}")
62 set(ARM32 arm armhf armv4t armv5te armv6 armv6m armv7m armv7em armv7 armv7s armv7k armv8m.base armv8m.main armv8.1m.main)
67 set(LOONGARCH64 loongarch64)
68 set(MIPS32 mips mipsel)
69 set(MIPS64 mips64 mips64el)
71 set(PPC32 powerpc powerpcspe)
72 set(PPC64 powerpc64 powerpc64le)
82 set(ARM64 arm64 arm64e)
83 set(ARM32 armv7 armv7k armv7s)
84 set(X86_64 x86_64 x86_64h)
87 set(ALL_BUILTIN_SUPPORTED_ARCH
88 ${X86} ${X86_64} ${AMDGPU} ${ARM32} ${ARM64} ${AVR}
89 ${HEXAGON} ${MIPS32} ${MIPS64} ${NVPTX} ${PPC32} ${PPC64}
90 ${RISCV32} ${RISCV64} ${SPARC} ${SPARCV9}
91 ${WASM32} ${WASM64} ${VE} ${LOONGARCH64})
93 include(CompilerRTUtils)
94 include(CompilerRTDarwinUtils)
98 find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx)
99 find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator)
100 find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos)
101 find_darwin_sdk_dir(DARWIN_watchossim_SYSROOT watchsimulator)
102 find_darwin_sdk_dir(DARWIN_watchos_SYSROOT watchos)
103 find_darwin_sdk_dir(DARWIN_tvossim_SYSROOT appletvsimulator)
104 find_darwin_sdk_dir(DARWIN_tvos_SYSROOT appletvos)
105 find_darwin_sdk_dir(DARWIN_xrossim_SYSROOT xrsimulator)
106 find_darwin_sdk_dir(DARWIN_xros_SYSROOT xros)
108 # Get supported architecture from SDKSettings.
109 function(sdk_has_arch_support sdk_path os arch has_support)
110 execute_process(COMMAND
111 /usr/libexec/PlistBuddy -c "Print :SupportedTargets:${os}:Archs" ${sdk_path}/SDKSettings.plist
112 OUTPUT_VARIABLE SDK_SUPPORTED_ARCHS
113 RESULT_VARIABLE PLIST_ERROR
115 if (PLIST_ERROR EQUAL 0 AND
116 SDK_SUPPORTED_ARCHS MATCHES " ${arch}\n")
117 message(STATUS "Found ${arch} support in ${sdk_path}/SDKSettings.plist")
118 set("${has_support}" On PARENT_SCOPE)
120 message(STATUS "No ${arch} support in ${sdk_path}/SDKSettings.plist")
121 set("${has_support}" Off PARENT_SCOPE)
125 set(DARWIN_EMBEDDED_PLATFORMS)
126 set(DARWIN_osx_BUILTIN_MIN_VER 10.7)
127 set(DARWIN_osx_BUILTIN_MIN_VER_FLAG
128 -mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER})
129 set(DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
130 # Add support for arm64 macOS if available in SDK.
131 foreach(arch ${ARM64})
132 sdk_has_arch_support(${DARWIN_osx_SYSROOT} macosx ${arch} MACOS_ARM_SUPPORT)
133 if (MACOS_ARM_SUPPORT)
134 list(APPEND DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${arch})
138 if(COMPILER_RT_ENABLE_IOS)
139 list(APPEND DARWIN_EMBEDDED_PLATFORMS ios)
140 set(DARWIN_ios_MIN_VER_FLAG -miphoneos-version-min)
141 set(DARWIN_ios_BUILTIN_MIN_VER 6.0)
142 set(DARWIN_ios_BUILTIN_MIN_VER_FLAG
143 ${DARWIN_ios_MIN_VER_FLAG}=${DARWIN_ios_BUILTIN_MIN_VER})
144 set(DARWIN_ios_BUILTIN_ALL_POSSIBLE_ARCHS ${ARM64} ${ARM32})
145 set(DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
146 find_darwin_sdk_version(iossim_sdk_version "iphonesimulator")
147 if ("${iossim_sdk_version}" VERSION_GREATER 14.0 OR "${iossim_sdk_version}" VERSION_EQUAL 14.0)
148 list(APPEND DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)
151 if(COMPILER_RT_ENABLE_WATCHOS)
152 list(APPEND DARWIN_EMBEDDED_PLATFORMS watchos)
153 set(DARWIN_watchos_MIN_VER_FLAG -mwatchos-version-min)
154 set(DARWIN_watchos_BUILTIN_MIN_VER 2.0)
155 set(DARWIN_watchos_BUILTIN_MIN_VER_FLAG
156 ${DARWIN_watchos_MIN_VER_FLAG}=${DARWIN_watchos_BUILTIN_MIN_VER})
157 set(DARWIN_watchos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 armv7k arm64_32)
158 set(DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86})
159 find_darwin_sdk_version(watchossim_sdk_version "watchsimulator")
160 if ("${watchossim_sdk_version}" VERSION_GREATER 7.0 OR "${watchossim_sdk_version}" VERSION_EQUAL 7.0)
161 list(APPEND DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)
164 if(COMPILER_RT_ENABLE_TVOS)
165 list(APPEND DARWIN_EMBEDDED_PLATFORMS tvos)
166 set(DARWIN_tvos_MIN_VER_FLAG -mtvos-version-min)
167 set(DARWIN_tvos_BUILTIN_MIN_VER 9.0)
168 set(DARWIN_tvos_BUILTIN_MIN_VER_FLAG
169 ${DARWIN_tvos_MIN_VER_FLAG}=${DARWIN_tvos_BUILTIN_MIN_VER})
170 set(DARWIN_tvos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 arm64)
171 set(DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
172 find_darwin_sdk_version(tvossim_sdk_version "appletvsimulator")
173 if ("${tvossim_sdk_version}" VERSION_GREATER 14.0 OR "${tvossim_sdk_version}" VERSION_EQUAL 14.0)
174 list(APPEND DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)
177 if(COMPILER_RT_ENABLE_XROS)
178 list(APPEND DARWIN_EMBEDDED_PLATFORMS xros)
179 set(DARWIN_xros_BUILTIN_ALL_POSSIBLE_ARCHS ${ARM64} ${ARM32})
180 set(DARWIN_xrossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)
183 set(BUILTIN_SUPPORTED_OS osx)
185 # We're setting the flag manually for each target OS
186 set(CMAKE_OSX_DEPLOYMENT_TARGET "")
188 # NOTE: We deliberately avoid using `DARWIN_<os>_ARCHS` here because that is
189 # used by `config-ix.cmake` in the context of building the rest of
190 # compiler-rt where the global `${TEST_COMPILE_ONLY}` (used by
191 # `darwin_test_archs()`) has a different value.
192 darwin_test_archs(osx
193 DARWIN_osx_BUILTIN_ARCHS
194 ${DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS}
196 message(STATUS "OSX supported builtin arches: ${DARWIN_osx_BUILTIN_ARCHS}")
197 foreach(arch ${DARWIN_osx_BUILTIN_ARCHS})
198 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
199 set(CAN_TARGET_${arch} 1)
202 foreach(platform ${DARWIN_EMBEDDED_PLATFORMS})
203 if(DARWIN_${platform}sim_SYSROOT)
204 set(DARWIN_${platform}sim_BUILTIN_MIN_VER
205 ${DARWIN_${platform}_BUILTIN_MIN_VER})
206 set(DARWIN_${platform}sim_BUILTIN_MIN_VER_FLAG
207 ${DARWIN_${platform}_BUILTIN_MIN_VER_FLAG})
209 set(DARWIN_${platform}sim_SKIP_CC_KEXT On)
211 darwin_test_archs(${platform}sim
212 DARWIN_${platform}sim_BUILTIN_ARCHS
213 ${DARWIN_${platform}sim_BUILTIN_ALL_POSSIBLE_ARCHS}
215 message(STATUS "${platform} Simulator supported builtin arches: ${DARWIN_${platform}sim_BUILTIN_ARCHS}")
216 if(DARWIN_${platform}sim_BUILTIN_ARCHS)
217 list(APPEND BUILTIN_SUPPORTED_OS ${platform}sim)
219 foreach(arch ${DARWIN_${platform}sim_BUILTIN_ARCHS})
220 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
221 set(CAN_TARGET_${arch} 1)
225 if(DARWIN_${platform}_SYSROOT)
226 darwin_test_archs(${platform}
227 DARWIN_${platform}_BUILTIN_ARCHS
228 ${DARWIN_${platform}_BUILTIN_ALL_POSSIBLE_ARCHS}
230 message(STATUS "${platform} supported builtin arches: ${DARWIN_${platform}_BUILTIN_ARCHS}")
231 if(DARWIN_${platform}_BUILTIN_ARCHS)
232 list(APPEND BUILTIN_SUPPORTED_OS ${platform})
234 foreach(arch ${DARWIN_${platform}_BUILTIN_ARCHS})
235 list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
236 set(CAN_TARGET_${arch} 1)
241 list_intersect(BUILTIN_SUPPORTED_ARCH ALL_BUILTIN_SUPPORTED_ARCH COMPILER_RT_SUPPORTED_ARCH)
244 # If we're not building the builtins standalone, just rely on the tests in
245 # config-ix.cmake to tell us what to build. Otherwise we need to do some leg
247 if(COMPILER_RT_BUILTINS_STANDALONE_BUILD)
250 # Architectures supported by compiler-rt libraries.
251 filter_available_targets(BUILTIN_SUPPORTED_ARCH
252 ${ALL_BUILTIN_SUPPORTED_ARCH})
255 if(OS_NAME MATCHES "Linux|SerenityOS" AND NOT LLVM_USE_SANITIZER AND NOT
256 COMPILER_RT_GPU_BUILD)
257 set(COMPILER_RT_HAS_CRT TRUE)
259 set(COMPILER_RT_HAS_CRT FALSE)
262 message(STATUS "Builtin supported architectures: ${BUILTIN_SUPPORTED_ARCH}")