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