xref: /llvm-project/compiler-rt/cmake/builtin-config-ix.cmake (revision 3c8344f7ba7e33febb93dec40374d55119c8571b)
1include(BuiltinTests)
2include(CheckIncludeFiles)
3include(CheckCSourceCompiles)
4
5# Make all the tests only check the compiler
6set(TEST_COMPILE_ONLY On)
7
8# Check host compiler support for certain flags
9builtin_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)
28
29builtin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD
30"
31int foo(int x, int y) {
32 _Atomic int result = x * y;
33 return result;
34}
35")
36
37builtin_check_c_compiler_source(COMPILER_RT_HAS_ASM_LSE
38"
39asm(\".arch armv8-a+lse\");
40asm(\"cas w0, w1, [x2]\");
41")
42
43builtin_check_c_compiler_source(COMPILER_RT_HAS_AARCH64_SME
44"
45void foo(void)  __arm_streaming_compatible {
46  asm(\".arch armv9-a+sme2\\n\"
47      \"smstart\\n\"
48      \"ldr zt0, [sp]\");
49}
50")
51
52check_include_files("sys/auxv.h"    COMPILER_RT_HAS_AUXV)
53
54if(ANDROID)
55  set(OS_NAME "Android")
56else()
57  set(OS_NAME "${CMAKE_SYSTEM_NAME}")
58endif()
59
60set(AMDGPU amdgcn)
61set(ARM64 aarch64)
62set(ARM32 arm armhf armv4t armv5te armv6 armv6m armv7m armv7em armv7 armv7s armv7k armv8m.base armv8m.main armv8.1m.main)
63set(AVR avr)
64set(HEXAGON hexagon)
65set(X86 i386)
66set(X86_64 x86_64)
67set(LOONGARCH64 loongarch64)
68set(MIPS32 mips mipsel)
69set(MIPS64 mips64 mips64el)
70set(NVPTX nvptx64)
71set(PPC32 powerpc powerpcspe)
72set(PPC64 powerpc64 powerpc64le)
73set(RISCV32 riscv32)
74set(RISCV64 riscv64)
75set(SPARC sparc)
76set(SPARCV9 sparcv9)
77set(WASM32 wasm32)
78set(WASM64 wasm64)
79set(VE ve)
80
81if(APPLE)
82  set(ARM64 arm64 arm64e)
83  set(ARM32 armv7 armv7k armv7s)
84  set(X86_64 x86_64 x86_64h)
85endif()
86
87set(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})
92
93include(CompilerRTUtils)
94include(CompilerRTDarwinUtils)
95
96if(APPLE)
97
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)
107
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
114      ERROR_QUIET)
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)
119    else()
120      message(STATUS "No ${arch} support in ${sdk_path}/SDKSettings.plist")
121      set("${has_support}" Off PARENT_SCOPE)
122    endif()
123  endfunction()
124
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})
135    endif()
136  endforeach(arch)
137
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)
149    endif()
150  endif()
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)
162    endif()
163  endif()
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)
175    endif()
176  endif()
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)
181  endif()
182
183  set(BUILTIN_SUPPORTED_OS osx)
184
185  # We're setting the flag manually for each target OS
186  set(CMAKE_OSX_DEPLOYMENT_TARGET "")
187
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}
195  )
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)
200  endforeach()
201
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})
208
209      set(DARWIN_${platform}sim_SKIP_CC_KEXT On)
210
211      darwin_test_archs(${platform}sim
212        DARWIN_${platform}sim_BUILTIN_ARCHS
213        ${DARWIN_${platform}sim_BUILTIN_ALL_POSSIBLE_ARCHS}
214      )
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)
218      endif()
219      foreach(arch ${DARWIN_${platform}sim_BUILTIN_ARCHS})
220        list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
221        set(CAN_TARGET_${arch} 1)
222      endforeach()
223    endif()
224
225    if(DARWIN_${platform}_SYSROOT)
226      darwin_test_archs(${platform}
227        DARWIN_${platform}_BUILTIN_ARCHS
228        ${DARWIN_${platform}_BUILTIN_ALL_POSSIBLE_ARCHS}
229      )
230      message(STATUS "${platform} supported builtin arches: ${DARWIN_${platform}_BUILTIN_ARCHS}")
231      if(DARWIN_${platform}_BUILTIN_ARCHS)
232        list(APPEND BUILTIN_SUPPORTED_OS ${platform})
233      endif()
234      foreach(arch ${DARWIN_${platform}_BUILTIN_ARCHS})
235        list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
236        set(CAN_TARGET_${arch} 1)
237      endforeach()
238    endif()
239  endforeach()
240
241  list_intersect(BUILTIN_SUPPORTED_ARCH ALL_BUILTIN_SUPPORTED_ARCH COMPILER_RT_SUPPORTED_ARCH)
242
243else()
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
246  # work here...
247  if(COMPILER_RT_BUILTINS_STANDALONE_BUILD)
248    test_targets()
249  endif()
250  # Architectures supported by compiler-rt libraries.
251  filter_available_targets(BUILTIN_SUPPORTED_ARCH
252    ${ALL_BUILTIN_SUPPORTED_ARCH})
253endif()
254
255if(OS_NAME MATCHES "Linux|SerenityOS" AND NOT LLVM_USE_SANITIZER AND NOT
256   COMPILER_RT_GPU_BUILD)
257  set(COMPILER_RT_HAS_CRT TRUE)
258else()
259  set(COMPILER_RT_HAS_CRT FALSE)
260endif()
261
262message(STATUS "Builtin supported architectures: ${BUILTIN_SUPPORTED_ARCH}")
263