13cab2bb3Spatrickinclude(BuiltinTests)
23cab2bb3Spatrickinclude(CheckCSourceCompiles)
33cab2bb3Spatrick
43cab2bb3Spatrick# Make all the tests only check the compiler
53cab2bb3Spatrickset(TEST_COMPILE_ONLY On)
63cab2bb3Spatrick
73cab2bb3Spatrick# Check host compiler support for certain flags
83cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fPIC                 COMPILER_RT_HAS_FPIC_FLAG)
93cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fPIE                 COMPILER_RT_HAS_FPIE_FLAG)
103cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fno-builtin          COMPILER_RT_HAS_FNO_BUILTIN_FLAG)
113cab2bb3Spatrickbuiltin_check_c_compiler_flag(-std=c11              COMPILER_RT_HAS_STD_C11_FLAG)
123cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fvisibility=hidden   COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG)
13*810390e3Srobertbuiltin_check_c_compiler_flag(-fomit-frame-pointer  COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG)
14*810390e3Srobertbuiltin_check_c_compiler_flag(-ffreestanding        COMPILER_RT_HAS_FFREESTANDING_FLAG)
153cab2bb3Spatrickbuiltin_check_c_compiler_flag(-fxray-instrument     COMPILER_RT_HAS_XRAY_COMPILER_FLAG)
163cab2bb3Spatrick
173cab2bb3Spatrickbuiltin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD
183cab2bb3Spatrick"
193cab2bb3Spatrickint foo(int x, int y) {
203cab2bb3Spatrick _Atomic int result = x * y;
213cab2bb3Spatrick return result;
223cab2bb3Spatrick}
233cab2bb3Spatrick")
243cab2bb3Spatrick
25d89ec533Spatrickbuiltin_check_c_compiler_source(COMPILER_RT_HAS_ASM_LSE
26d89ec533Spatrick"
27d89ec533Spatrickasm(\".arch armv8-a+lse\");
28d89ec533Spatrickasm(\"cas w0, w1, [x2]\");
29d89ec533Spatrick")
303cab2bb3Spatrick
313cab2bb3Spatrickset(ARM64 aarch64)
32*810390e3Srobertset(ARM32 arm armhf armv4t armv5te armv6 armv6m armv7m armv7em armv7 armv7s armv7k armv8m.main armv8.1m.main)
33*810390e3Srobertset(AVR avr)
343cab2bb3Spatrickset(HEXAGON hexagon)
353cab2bb3Spatrickset(X86 i386)
363cab2bb3Spatrickset(X86_64 x86_64)
37*810390e3Srobertset(LOONGARCH64 loongarch64)
383cab2bb3Spatrickset(MIPS32 mips mipsel)
393cab2bb3Spatrickset(MIPS64 mips64 mips64el)
40*810390e3Srobertset(PPC32 powerpc powerpcspe)
413cab2bb3Spatrickset(PPC64 powerpc64 powerpc64le)
423cab2bb3Spatrickset(RISCV32 riscv32)
433cab2bb3Spatrickset(RISCV64 riscv64)
443cab2bb3Spatrickset(SPARC sparc)
453cab2bb3Spatrickset(SPARCV9 sparcv9)
463cab2bb3Spatrickset(WASM32 wasm32)
473cab2bb3Spatrickset(WASM64 wasm64)
481f9cb04fSpatrickset(VE ve)
493cab2bb3Spatrick
503cab2bb3Spatrickif(APPLE)
511f9cb04fSpatrick  set(ARM64 arm64 arm64e)
523cab2bb3Spatrick  set(ARM32 armv7 armv7k armv7s)
533cab2bb3Spatrick  set(X86_64 x86_64 x86_64h)
543cab2bb3Spatrickendif()
553cab2bb3Spatrick
561f9cb04fSpatrickset(ALL_BUILTIN_SUPPORTED_ARCH
57*810390e3Srobert  ${X86} ${X86_64} ${ARM32} ${ARM64} ${AVR}
58d89ec533Spatrick  ${HEXAGON} ${MIPS32} ${MIPS64} ${PPC32} ${PPC64}
591f9cb04fSpatrick  ${RISCV32} ${RISCV64} ${SPARC} ${SPARCV9}
60*810390e3Srobert  ${WASM32} ${WASM64} ${VE} ${LOONGARCH64})
613cab2bb3Spatrick
623cab2bb3Spatrickinclude(CompilerRTUtils)
633cab2bb3Spatrickinclude(CompilerRTDarwinUtils)
643cab2bb3Spatrick
653cab2bb3Spatrickif(APPLE)
663cab2bb3Spatrick
673cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx)
683cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator)
693cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos)
703cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_watchossim_SYSROOT watchsimulator)
713cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_watchos_SYSROOT watchos)
723cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_tvossim_SYSROOT appletvsimulator)
733cab2bb3Spatrick  find_darwin_sdk_dir(DARWIN_tvos_SYSROOT appletvos)
743cab2bb3Spatrick
751f9cb04fSpatrick  # Get supported architecture from SDKSettings.
761f9cb04fSpatrick  function(sdk_has_arch_support sdk_path os arch has_support)
771f9cb04fSpatrick    execute_process(COMMAND
781f9cb04fSpatrick        /usr/libexec/PlistBuddy -c "Print :SupportedTargets:${os}:Archs" ${sdk_path}/SDKSettings.plist
791f9cb04fSpatrick      OUTPUT_VARIABLE SDK_SUPPORTED_ARCHS
80*810390e3Srobert      RESULT_VARIABLE PLIST_ERROR
81*810390e3Srobert      ERROR_QUIET)
821f9cb04fSpatrick    if (PLIST_ERROR EQUAL 0 AND
831f9cb04fSpatrick        SDK_SUPPORTED_ARCHS MATCHES " ${arch}\n")
841f9cb04fSpatrick      message(STATUS "Found ${arch} support in ${sdk_path}/SDKSettings.plist")
851f9cb04fSpatrick      set("${has_support}" On PARENT_SCOPE)
861f9cb04fSpatrick    else()
871f9cb04fSpatrick      message(STATUS "No ${arch} support in ${sdk_path}/SDKSettings.plist")
881f9cb04fSpatrick      set("${has_support}" Off PARENT_SCOPE)
891f9cb04fSpatrick    endif()
901f9cb04fSpatrick  endfunction()
911f9cb04fSpatrick
923cab2bb3Spatrick  set(DARWIN_EMBEDDED_PLATFORMS)
93*810390e3Srobert  set(DARWIN_osx_BUILTIN_MIN_VER 10.7)
943cab2bb3Spatrick  set(DARWIN_osx_BUILTIN_MIN_VER_FLAG
953cab2bb3Spatrick      -mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER})
963cab2bb3Spatrick  set(DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
971f9cb04fSpatrick  # Add support for arm64 macOS if available in SDK.
981f9cb04fSpatrick  foreach(arch ${ARM64})
991f9cb04fSpatrick    sdk_has_arch_support(${DARWIN_osx_SYSROOT} macosx ${arch} MACOS_ARM_SUPPORT)
1001f9cb04fSpatrick    if (MACOS_ARM_SUPPORT)
1011f9cb04fSpatrick     list(APPEND DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS ${arch})
1021f9cb04fSpatrick    endif()
1031f9cb04fSpatrick  endforeach(arch)
1043cab2bb3Spatrick
1053cab2bb3Spatrick  if(COMPILER_RT_ENABLE_IOS)
1063cab2bb3Spatrick    list(APPEND DARWIN_EMBEDDED_PLATFORMS ios)
1073cab2bb3Spatrick    set(DARWIN_ios_MIN_VER_FLAG -miphoneos-version-min)
1083cab2bb3Spatrick    set(DARWIN_ios_BUILTIN_MIN_VER 6.0)
1093cab2bb3Spatrick    set(DARWIN_ios_BUILTIN_MIN_VER_FLAG
1103cab2bb3Spatrick      ${DARWIN_ios_MIN_VER_FLAG}=${DARWIN_ios_BUILTIN_MIN_VER})
1113cab2bb3Spatrick    set(DARWIN_ios_BUILTIN_ALL_POSSIBLE_ARCHS ${ARM64} ${ARM32})
1123cab2bb3Spatrick    set(DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
113*810390e3Srobert    find_darwin_sdk_version(iossim_sdk_version "iphonesimulator")
114*810390e3Srobert    if ("${iossim_sdk_version}" VERSION_GREATER 14.0 OR "${iossim_sdk_version}" VERSION_EQUAL 14.0)
115*810390e3Srobert      list(APPEND DARWIN_iossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)
116*810390e3Srobert    endif()
1173cab2bb3Spatrick  endif()
1183cab2bb3Spatrick  if(COMPILER_RT_ENABLE_WATCHOS)
1193cab2bb3Spatrick    list(APPEND DARWIN_EMBEDDED_PLATFORMS watchos)
1203cab2bb3Spatrick    set(DARWIN_watchos_MIN_VER_FLAG -mwatchos-version-min)
1213cab2bb3Spatrick    set(DARWIN_watchos_BUILTIN_MIN_VER 2.0)
1223cab2bb3Spatrick    set(DARWIN_watchos_BUILTIN_MIN_VER_FLAG
1233cab2bb3Spatrick      ${DARWIN_watchos_MIN_VER_FLAG}=${DARWIN_watchos_BUILTIN_MIN_VER})
124d89ec533Spatrick    set(DARWIN_watchos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 armv7k arm64_32)
1253cab2bb3Spatrick    set(DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86})
126*810390e3Srobert    find_darwin_sdk_version(watchossim_sdk_version "watchsimulator")
127*810390e3Srobert    if ("${watchossim_sdk_version}" VERSION_GREATER 7.0 OR "${watchossim_sdk_version}" VERSION_EQUAL 7.0)
128*810390e3Srobert      list(APPEND DARWIN_watchossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)
129*810390e3Srobert    endif()
1303cab2bb3Spatrick  endif()
1313cab2bb3Spatrick  if(COMPILER_RT_ENABLE_TVOS)
1323cab2bb3Spatrick    list(APPEND DARWIN_EMBEDDED_PLATFORMS tvos)
1333cab2bb3Spatrick    set(DARWIN_tvos_MIN_VER_FLAG -mtvos-version-min)
1343cab2bb3Spatrick    set(DARWIN_tvos_BUILTIN_MIN_VER 9.0)
1353cab2bb3Spatrick    set(DARWIN_tvos_BUILTIN_MIN_VER_FLAG
1363cab2bb3Spatrick      ${DARWIN_tvos_MIN_VER_FLAG}=${DARWIN_tvos_BUILTIN_MIN_VER})
1373cab2bb3Spatrick    set(DARWIN_tvos_BUILTIN_ALL_POSSIBLE_ARCHS armv7 arm64)
1383cab2bb3Spatrick    set(DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS ${X86} ${X86_64})
139*810390e3Srobert    find_darwin_sdk_version(tvossim_sdk_version "appletvsimulator")
140*810390e3Srobert    if ("${tvossim_sdk_version}" VERSION_GREATER 14.0 OR "${tvossim_sdk_version}" VERSION_EQUAL 14.0)
141*810390e3Srobert      list(APPEND DARWIN_tvossim_BUILTIN_ALL_POSSIBLE_ARCHS arm64)
142*810390e3Srobert    endif()
1433cab2bb3Spatrick  endif()
1443cab2bb3Spatrick
1453cab2bb3Spatrick  set(BUILTIN_SUPPORTED_OS osx)
1463cab2bb3Spatrick
1473cab2bb3Spatrick  # We're setting the flag manually for each target OS
1483cab2bb3Spatrick  set(CMAKE_OSX_DEPLOYMENT_TARGET "")
1493cab2bb3Spatrick
1503cab2bb3Spatrick  # NOTE: We deliberately avoid using `DARWIN_<os>_ARCHS` here because that is
1513cab2bb3Spatrick  # used by `config-ix.cmake` in the context of building the rest of
1523cab2bb3Spatrick  # compiler-rt where the global `${TEST_COMPILE_ONLY}` (used by
1533cab2bb3Spatrick  # `darwin_test_archs()`) has a different value.
1543cab2bb3Spatrick  darwin_test_archs(osx
1553cab2bb3Spatrick    DARWIN_osx_BUILTIN_ARCHS
1563cab2bb3Spatrick    ${DARWIN_osx_BUILTIN_ALL_POSSIBLE_ARCHS}
1573cab2bb3Spatrick  )
1583cab2bb3Spatrick  message(STATUS "OSX supported builtin arches: ${DARWIN_osx_BUILTIN_ARCHS}")
1593cab2bb3Spatrick  foreach(arch ${DARWIN_osx_BUILTIN_ARCHS})
1603cab2bb3Spatrick    list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
1613cab2bb3Spatrick    set(CAN_TARGET_${arch} 1)
1623cab2bb3Spatrick  endforeach()
1633cab2bb3Spatrick
1643cab2bb3Spatrick  foreach(platform ${DARWIN_EMBEDDED_PLATFORMS})
1653cab2bb3Spatrick    if(DARWIN_${platform}sim_SYSROOT)
1663cab2bb3Spatrick      set(DARWIN_${platform}sim_BUILTIN_MIN_VER
1673cab2bb3Spatrick        ${DARWIN_${platform}_BUILTIN_MIN_VER})
1683cab2bb3Spatrick      set(DARWIN_${platform}sim_BUILTIN_MIN_VER_FLAG
1693cab2bb3Spatrick        ${DARWIN_${platform}_BUILTIN_MIN_VER_FLAG})
1703cab2bb3Spatrick
1713cab2bb3Spatrick      set(DARWIN_${platform}sim_SKIP_CC_KEXT On)
1723cab2bb3Spatrick
1733cab2bb3Spatrick      darwin_test_archs(${platform}sim
1743cab2bb3Spatrick        DARWIN_${platform}sim_BUILTIN_ARCHS
1753cab2bb3Spatrick        ${DARWIN_${platform}sim_BUILTIN_ALL_POSSIBLE_ARCHS}
1763cab2bb3Spatrick      )
1773cab2bb3Spatrick      message(STATUS "${platform} Simulator supported builtin arches: ${DARWIN_${platform}sim_BUILTIN_ARCHS}")
1783cab2bb3Spatrick      if(DARWIN_${platform}sim_BUILTIN_ARCHS)
1793cab2bb3Spatrick        list(APPEND BUILTIN_SUPPORTED_OS ${platform}sim)
1803cab2bb3Spatrick      endif()
1813cab2bb3Spatrick      foreach(arch ${DARWIN_${platform}sim_BUILTIN_ARCHS})
1823cab2bb3Spatrick        list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
1833cab2bb3Spatrick        set(CAN_TARGET_${arch} 1)
1843cab2bb3Spatrick      endforeach()
1853cab2bb3Spatrick    endif()
1863cab2bb3Spatrick
1873cab2bb3Spatrick    if(DARWIN_${platform}_SYSROOT)
1883cab2bb3Spatrick      darwin_test_archs(${platform}
1893cab2bb3Spatrick        DARWIN_${platform}_BUILTIN_ARCHS
1903cab2bb3Spatrick        ${DARWIN_${platform}_BUILTIN_ALL_POSSIBLE_ARCHS}
1913cab2bb3Spatrick      )
1923cab2bb3Spatrick      message(STATUS "${platform} supported builtin arches: ${DARWIN_${platform}_BUILTIN_ARCHS}")
1933cab2bb3Spatrick      if(DARWIN_${platform}_BUILTIN_ARCHS)
1943cab2bb3Spatrick        list(APPEND BUILTIN_SUPPORTED_OS ${platform})
1953cab2bb3Spatrick      endif()
1963cab2bb3Spatrick      foreach(arch ${DARWIN_${platform}_BUILTIN_ARCHS})
1973cab2bb3Spatrick        list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
1983cab2bb3Spatrick        set(CAN_TARGET_${arch} 1)
1993cab2bb3Spatrick      endforeach()
2003cab2bb3Spatrick    endif()
2013cab2bb3Spatrick  endforeach()
2023cab2bb3Spatrick
2033cab2bb3Spatrick  list_intersect(BUILTIN_SUPPORTED_ARCH ALL_BUILTIN_SUPPORTED_ARCH COMPILER_RT_SUPPORTED_ARCH)
2043cab2bb3Spatrick
2053cab2bb3Spatrickelse()
2063cab2bb3Spatrick  # If we're not building the builtins standalone, just rely on the  tests in
2073cab2bb3Spatrick  # config-ix.cmake to tell us what to build. Otherwise we need to do some leg
2083cab2bb3Spatrick  # work here...
2093cab2bb3Spatrick  if(COMPILER_RT_BUILTINS_STANDALONE_BUILD)
2103cab2bb3Spatrick    test_targets()
2113cab2bb3Spatrick  endif()
2123cab2bb3Spatrick  # Architectures supported by compiler-rt libraries.
2133cab2bb3Spatrick  filter_available_targets(BUILTIN_SUPPORTED_ARCH
2143cab2bb3Spatrick    ${ALL_BUILTIN_SUPPORTED_ARCH})
2153cab2bb3Spatrickendif()
2163cab2bb3Spatrick
2173cab2bb3Spatrickmessage(STATUS "Builtin supported architectures: ${BUILTIN_SUPPORTED_ARCH}")
218