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_FREESTANDING_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
25
26set(ARM64 aarch64)
27set(ARM32 arm armhf armv6m armv7m armv7em armv7 armv7s armv7k)
28set(HEXAGON hexagon)
29set(X86 i386)
30set(X86_64 x86_64)
31set(MIPS32 mips mipsel)
32set(MIPS64 mips64 mips64el)
33set(PPC64 powerpc64 powerpc64le)
34set(RISCV32 riscv32)
35set(RISCV64 riscv64)
36set(SPARC sparc)
37set(SPARCV9 sparcv9)
38set(WASM32 wasm32)
39set(WASM64 wasm64)
40set(VE ve)
41
42if(APPLE)
43  set(ARM64 arm64 arm64e)
44  set(ARM32 armv7 armv7k armv7s)
45  set(X86_64 x86_64 x86_64h)
46endif()
47
48set(ALL_BUILTIN_SUPPORTED_ARCH
49  ${X86} ${X86_64} ${ARM32} ${ARM64}
50  ${HEXAGON} ${MIPS32} ${MIPS64} ${PPC64}
51  ${RISCV32} ${RISCV64} ${SPARC} ${SPARCV9}
52  ${WASM32} ${WASM64} ${VE})
53
54include(CompilerRTUtils)
55include(CompilerRTDarwinUtils)
56
57if(APPLE)
58
59  find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx)
60  find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator)
61  find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos)
62  find_darwin_sdk_dir(DARWIN_watchossim_SYSROOT watchsimulator)
63  find_darwin_sdk_dir(DARWIN_watchos_SYSROOT watchos)
64  find_darwin_sdk_dir(DARWIN_tvossim_SYSROOT appletvsimulator)
65  find_darwin_sdk_dir(DARWIN_tvos_SYSROOT appletvos)
66
67  # Get supported architecture from SDKSettings.
68  function(sdk_has_arch_support sdk_path os arch has_support)
69    execute_process(COMMAND
70        /usr/libexec/PlistBuddy -c "Print :SupportedTargets:${os}:Archs" ${sdk_path}/SDKSettings.plist
71      OUTPUT_VARIABLE SDK_SUPPORTED_ARCHS
72      RESULT_VARIABLE PLIST_ERROR)
73    if (PLIST_ERROR EQUAL 0 AND
74        SDK_SUPPORTED_ARCHS MATCHES " ${arch}\n")
75      message(STATUS "Found ${arch} support in ${sdk_path}/SDKSettings.plist")
76      set("${has_support}" On PARENT_SCOPE)
77    else()
78      message(STATUS "No ${arch} support in ${sdk_path}/SDKSettings.plist")
79      set("${has_support}" Off PARENT_SCOPE)
80    endif()
81  endfunction()
82
83  set(DARWIN_EMBEDDED_PLATFORMS)
84  set(DARWIN_osx_BUILTIN_MIN_VER 10.5)
85  set(DARWIN_osx_BUILTIN_MIN_VER_FLAG
86      -mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER})
87  set(DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
88  # Add support for arm64 macOS if available in SDK.
89  foreach(arch ${ARM64})
90    sdk_has_arch_support(${DARWIN_osx_SYSROOT} macosx ${arch} MACOS_ARM_SUPPORT)
91    if (MACOS_ARM_SUPPORT)
92     list(APPEND DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${arch})
93    endif()
94  endforeach(arch)
95
96  if(COMPILER_RT_ENABLE_IOS)
97    list(APPEND DARWIN_EMBEDDED_PLATFORMS ios)
98    set(DARWIN_ios_MIN_VER_FLAG -miphoneos-version-min)
99    set(DARWIN_ios_BUILTIN_MIN_VER 6.0)
100    set(DARWIN_ios_BUILTIN_MIN_VER_FLAG
101      ${DARWIN_ios_MIN_VER_FLAG}=${DARWIN_ios_BUILTIN_MIN_VER})
102    set(DARWIN_ios_BUILTIN_ALL_POSSIBLE_ARCHS ${ARM64} ${ARM32})
103    set(DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
104  endif()
105  if(COMPILER_RT_ENABLE_WATCHOS)
106    list(APPEND DARWIN_EMBEDDED_PLATFORMS watchos)
107    set(DARWIN_watchos_MIN_VER_FLAG -mwatchos-version-min)
108    set(DARWIN_watchos_BUILTIN_MIN_VER 2.0)
109    set(DARWIN_watchos_BUILTIN_MIN_VER_FLAG
110      ${DARWIN_watchos_MIN_VER_FLAG}=${DARWIN_watchos_BUILTIN_MIN_VER})
111    set(DARWIN_watchos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 armv7k)
112    set(DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86})
113  endif()
114  if(COMPILER_RT_ENABLE_TVOS)
115    list(APPEND DARWIN_EMBEDDED_PLATFORMS tvos)
116    set(DARWIN_tvos_MIN_VER_FLAG -mtvos-version-min)
117    set(DARWIN_tvos_BUILTIN_MIN_VER 9.0)
118    set(DARWIN_tvos_BUILTIN_MIN_VER_FLAG
119      ${DARWIN_tvos_MIN_VER_FLAG}=${DARWIN_tvos_BUILTIN_MIN_VER})
120    set(DARWIN_tvos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 arm64)
121    set(DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
122  endif()
123
124  set(BUILTIN_SUPPORTED_OS osx)
125
126  # We're setting the flag manually for each target OS
127  set(CMAKE_OSX_DEPLOYMENT_TARGET "")
128
129  # NOTE: We deliberately avoid using `DARWIN_<os>_ARCHS` here because that is
130  # used by `config-ix.cmake` in the context of building the rest of
131  # compiler-rt where the global `${TEST_COMPILE_ONLY}` (used by
132  # `darwin_test_archs()`) has a different value.
133  darwin_test_archs(osx
134    DARWIN_osx_BUILTIN_ARCHS
135    ${DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS}
136  )
137  message(STATUS "OSX supported builtin arches: ${DARWIN_osx_BUILTIN_ARCHS}")
138  foreach(arch ${DARWIN_osx_BUILTIN_ARCHS})
139    list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
140    set(CAN_TARGET_${arch} 1)
141  endforeach()
142
143  foreach(platform ${DARWIN_EMBEDDED_PLATFORMS})
144    if(DARWIN_${platform}sim_SYSROOT)
145      set(DARWIN_${platform}sim_BUILTIN_MIN_VER
146        ${DARWIN_${platform}_BUILTIN_MIN_VER})
147      set(DARWIN_${platform}sim_BUILTIN_MIN_VER_FLAG
148        ${DARWIN_${platform}_BUILTIN_MIN_VER_FLAG})
149
150      set(DARWIN_${platform}sim_SKIP_CC_KEXT On)
151
152      darwin_test_archs(${platform}sim
153        DARWIN_${platform}sim_BUILTIN_ARCHS
154        ${DARWIN_${platform}sim_BUILTIN_ALL_POSSIBLE_ARCHS}
155      )
156      message(STATUS "${platform} Simulator supported builtin arches: ${DARWIN_${platform}sim_BUILTIN_ARCHS}")
157      if(DARWIN_${platform}sim_BUILTIN_ARCHS)
158        list(APPEND BUILTIN_SUPPORTED_OS ${platform}sim)
159      endif()
160      foreach(arch ${DARWIN_${platform}sim_BUILTIN_ARCHS})
161        list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
162        set(CAN_TARGET_${arch} 1)
163      endforeach()
164    endif()
165
166    if(DARWIN_${platform}_SYSROOT)
167      darwin_test_archs(${platform}
168        DARWIN_${platform}_BUILTIN_ARCHS
169        ${DARWIN_${platform}_BUILTIN_ALL_POSSIBLE_ARCHS}
170      )
171      message(STATUS "${platform} supported builtin arches: ${DARWIN_${platform}_BUILTIN_ARCHS}")
172      if(DARWIN_${platform}_BUILTIN_ARCHS)
173        list(APPEND BUILTIN_SUPPORTED_OS ${platform})
174      endif()
175      foreach(arch ${DARWIN_${platform}_BUILTIN_ARCHS})
176        list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
177        set(CAN_TARGET_${arch} 1)
178      endforeach()
179    endif()
180  endforeach()
181
182  list_intersect(BUILTIN_SUPPORTED_ARCH ALL_BUILTIN_SUPPORTED_ARCH COMPILER_RT_SUPPORTED_ARCH)
183
184else()
185  # If we're not building the builtins standalone, just rely on the  tests in
186  # config-ix.cmake to tell us what to build. Otherwise we need to do some leg
187  # work here...
188  if(COMPILER_RT_BUILTINS_STANDALONE_BUILD)
189    test_targets()
190  endif()
191  # Architectures supported by compiler-rt libraries.
192  filter_available_targets(BUILTIN_SUPPORTED_ARCH
193    ${ALL_BUILTIN_SUPPORTED_ARCH})
194endif()
195
196message(STATUS "Builtin supported architectures: ${BUILTIN_SUPPORTED_ARCH}")
197