[Compiler-RT] For arm64e test suites use the SDK version as the minimum deployment target.

Previously we used the minimum deployment target used for the platform
(e.g. iOS is 9.0). Unfortunately this leads to ABI incompatibilities with
arm64e devices running newer OSs. In particular the following TSan test
cases that used libcxx would fail due to the ABI mismatch.

* Darwin/libcxx-shared-ptr-recursive.mm
* Darwin/libcxx-shared-ptr-stress.mm
* Darwin/libcxx-shared-ptr.mm
* libcxx/std_shared_ptr.cpp

Given that arm64e is not ABI stable we should ideally match the
deployment target for sanitizer runtimes and their tests cases to the
device when building for arm64e. Unfortunately having a mixed deployment
target (based on architecture) isn't currently supported by the build system
and is non-trivial to implement.

As a stop-gap measure this patch changes the sanitizer test suites (but not the
sanitizer runtimes themselves) to use a newer deployment target when
targetting arm64e.

The deployment target used for arm64e is the SDK version because this
"should" match the OS version running on the target device (it is a
configuration error to not match them).

rdar://83080611
This commit is contained in:
Dan Liew 2021-09-14 17:05:20 -07:00
parent 1ac2d195ec
commit f4382d4b09
1 changed files with 54 additions and 1 deletions

View File

@ -251,7 +251,35 @@ function(get_test_cflags_for_apple_platform platform arch cflags_out)
endif()
set(test_cflags "")
get_target_flags_for_arch(${arch} test_cflags)
list(APPEND test_cflags ${DARWIN_${platform}_CFLAGS})
if (NOT "${arch}" STREQUAL "arm64e")
list(APPEND test_cflags ${DARWIN_${platform}_CFLAGS})
else()
# arm64e is not currently ABI stable so we need to build for the
# OS version being tested. Rather than querying the device under test
# we use the SDK version which "should" be the same as the
# device under test (it is a configuration error for these not to match).
# FIXME(dliew): We can remove this if we build the runtimes with the appropriate
# deployment target for arm64e.
foreach (flag ${DARWIN_${platform}_CFLAGS})
if ("${flag}" MATCHES "^${DARWIN_${platform}_MIN_VER_FLAG}=.+")
# Find the SDK version
get_xcrun_platform_from_apple_platform("${platform}" xcrun_platform_name)
# TODO(dliew): Remove this check once get_xcrun_platform_from_apple_platform
# emits a fatal error for unrecognised platforms.
if (NOT "${xcrun_platform_name}" STREQUAL "")
find_darwin_sdk_version(platform_sdk_version "${xcrun_platform_name}")
# Patch flag with correct deployment target
set(replacement_flag "${DARWIN_${platform}_MIN_VER_FLAG}=${platform_sdk_version}")
list(APPEND test_cflags "${replacement_flag}")
endif()
else()
# Copy through
list(APPEND test_cflags "${flag}")
endif()
endforeach()
endif()
string(REPLACE ";" " " test_cflags_str "${test_cflags}")
string(APPEND test_cflags_str "${COMPILER_RT_TEST_COMPILER_CFLAGS}")
set(${cflags_out} "${test_cflags_str}" PARENT_SCOPE)
@ -280,6 +308,31 @@ function(is_valid_apple_platform platform is_valid_out)
set(${is_valid_out} ${is_valid} PARENT_SCOPE)
endfunction()
# Maps the Apple platform name used in Compiler-rt's CMake code
# to the name recognised by xcrun's `--sdk` argument
function(get_xcrun_platform_from_apple_platform platform out_var)
set(xcrun_platform "")
if ("${platform}" STREQUAL "osx")
set(xcrun_platform "macosx")
elseif ("${platform}" STREQUAL "iossim")
set(xcrun_platform "iphonesimulator")
elseif ("${platform}" STREQUAL "ios")
set(xcrun_platform "iphoneos")
elseif ("${platform}" STREQUAL "watchossim")
set(xcrun_platform "watchsimulator")
elseif ("${platform}" STREQUAL "watchos")
set(xcrun_platform "watchos")
elseif ("${platform}" STREQUAL "tvossim")
set(xcrun_platform "appletvsimulator")
elseif ("${platform}" STREQUAL "tvos")
set(xcrun_platform "appletvos")
else()
# TODO(dliew): Make this an error.
message(WARNING "\"${platform}\" is not a handled apple platform")
endif()
set(${out_var} ${xcrun_platform} PARENT_SCOPE)
endfunction()
include(AllSupportedArchDefs)
if(APPLE)