summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Liew <dan@su-root.co.uk>2019-10-01 23:08:18 +0000
committerDan Liew <dan@su-root.co.uk>2019-10-01 23:08:18 +0000
commit5f8a0110ec12ac0b7c86545c5058ab287c070b5e (patch)
tree29c61705b3a7ff00220fdbaf48f2f542f29a11d1
parent156cec6232ae2971456bc206bfd0fce1133a1e6d (diff)
downloadcompiler-rt-5f8a0110ec12ac0b7c86545c5058ab287c070b5e.tar.gz
[CMake] Fix the value of `config.target_cflags` for non-macOS Apple platforms. Attempt #3.
The main problem here is that `-*-version_min=` was not being passed to the compiler when building test cases. This can cause problems when testing on devices running older OSs because Clang would previously assume the minimum deployment target is the the latest OS in the SDK which could be much newer than what the device is running. Previously the generated value looked like this: `-arch arm64 -isysroot <path_to_xcode>/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.1.sdk` With this change it now looks like: `-arch arm64 -stdlib=libc++ -miphoneos-version-min=8.0 -isysroot <path_to_xcode>/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.1.sdk` This mirrors the setting of config.target_cflags on macOS. This change is made for ASan, LibFuzzer, TSan, and UBSan. To implement this a new `get_test_cflags_for_apple_platform()` function has been added that when given an Apple platform name and architecture returns a string containing the C compiler flags to use when building tests. This also calls a new helper function `is_valid_apple_platform()` that validates Apple platform names. This is the third attempt at landing the patch. The first attempt (r359305) had to be reverted (r359327) due to a buildbot failure. The problem was that calling `get_test_cflags_for_apple_platform()` can trigger a CMake error if the provided architecture is not supported by the current CMake configuration. Previously, this could be triggered by passing `-DCOMPILER_RT_ENABLE_IOS=OFF` to CMake. The root cause is that we were generating test configurations for a list of architectures without checking if the relevant Sanitizer actually supported that architecture. We now intersect the list of architectures for an Apple platform with `<SANITIZER>_SUPPORTED_ARCH` (where `<SANITIZER>` is a Sanitizer name) to iterate through the correct list of architectures. The second attempt (r363633) had to be reverted (r363779) due to a build failure. The failed build was using a modified Apple toolchain where the iOS simulator SDK was missing. This exposed a bug in the existing UBSan test generation code where it was assumed that `COMPILER_RT_ENABLE_IOS` implied that the toolchain supported both iOS and the iOS simulator. This is not true. This has been fixed by using the list `SANITIZER_COMMON_SUPPORTED_OS` for the list of supported Apple platforms for UBSan. For consistency with the other Sanitizers we also now intersect the list of architectures with UBSAN_SUPPORTED_ARCH. rdar://problem/50124489 Differential Revision: https://reviews.llvm.org/D61242 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@373405 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--cmake/config-ix.cmake26
-rw-r--r--test/asan/CMakeLists.txt19
-rw-r--r--test/fuzzer/CMakeLists.txt11
-rw-r--r--test/tsan/CMakeLists.txt71
-rw-r--r--test/ubsan/CMakeLists.txt28
5 files changed, 105 insertions, 50 deletions
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake
index d2da0496b..875acc83b 100644
--- a/cmake/config-ix.cmake
+++ b/cmake/config-ix.cmake
@@ -208,6 +208,32 @@ macro(get_test_cc_for_arch arch cc_out cflags_out)
endif()
endmacro()
+# Returns CFLAGS that should be used to run tests for the
+# specific apple platform and architecture.
+function(get_test_cflags_for_apple_platform platform arch cflags_out)
+ is_valid_apple_platform("${platform}" is_valid_platform)
+ if (NOT is_valid_platform)
+ message(FATAL_ERROR "\"${platform}\" is not a valid apple platform")
+ endif()
+ set(test_cflags "")
+ get_target_flags_for_arch(${arch} test_cflags)
+ list(APPEND test_cflags ${DARWIN_${platform}_CFLAGS})
+ 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)
+endfunction()
+
+function(is_valid_apple_platform platform is_valid_out)
+ set(is_valid FALSE)
+ if ("${platform}" STREQUAL "")
+ message(FATAL_ERROR "platform cannot be empty")
+ endif()
+ if ("${platform}" MATCHES "^(osx|((ios|watchos|tvos)(sim)?))$")
+ set(is_valid TRUE)
+ endif()
+ set(${is_valid_out} ${is_valid} PARENT_SCOPE)
+endfunction()
+
set(ARM64 aarch64)
set(ARM32 arm armhf)
set(HEXAGON hexagon)
diff --git a/test/asan/CMakeLists.txt b/test/asan/CMakeLists.txt
index 1892c8818..79e34a016 100644
--- a/test/asan/CMakeLists.txt
+++ b/test/asan/CMakeLists.txt
@@ -82,15 +82,22 @@ endforeach()
# variable to select which iOS device or simulator to use, e.g.:
# SANITIZER_IOSSIM_TEST_DEVICE_IDENTIFIER="iPhone 6"
if(APPLE)
+ # FIXME(dliew): This logic should be refactored to the way UBSan Darwin
+ # testing is done.
set(EXCLUDE_FROM_ALL ON)
set(ASAN_TEST_TARGET_CC ${COMPILER_RT_TEST_COMPILER})
set(ASAN_TEST_DYNAMIC True)
- foreach(arch ${DARWIN_iossim_ARCHS})
+ list_intersect(ASAN_TEST_IOSSIM_ARCHS ASAN_SUPPORTED_ARCH DARWIN_iossim_ARCHS)
+ foreach(arch ${ASAN_TEST_IOSSIM_ARCHS})
set(ASAN_TEST_APPLE_PLATFORM "iossim")
set(ASAN_TEST_TARGET_ARCH ${arch})
- set(ASAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_iossim_SYSROOT} ${COMPILER_RT_TEST_COMPILER_CFLAGS}")
+ get_test_cflags_for_apple_platform(
+ "${ASAN_TEST_APPLE_PLATFORM}"
+ "${ASAN_TEST_TARGET_ARCH}"
+ ASAN_TEST_TARGET_CFLAGS
+ )
set(ASAN_TEST_CONFIG_SUFFIX "-${arch}-${ASAN_TEST_APPLE_PLATFORM}")
get_bits_for_arch(${arch} ASAN_TEST_BITS)
string(TOUPPER ${arch} ARCH_UPPER_CASE)
@@ -104,10 +111,14 @@ if(APPLE)
DEPENDS ${ASAN_TEST_DEPS})
endforeach()
- foreach (arch ${DARWIN_ios_ARCHS})
+ list_intersect(ASAN_TEST_IOS_ARCHS ASAN_SUPPORTED_ARCH DARWIN_ios_ARCHS)
+ foreach (arch ${ASAN_TEST_IOS_ARCHS})
set(ASAN_TEST_APPLE_PLATFORM "ios")
set(ASAN_TEST_TARGET_ARCH ${arch})
- set(ASAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_ios_SYSROOT} ${COMPILER_RT_TEST_COMPILER_CFLAGS}")
+ get_test_cflags_for_apple_platform(
+ "${ASAN_TEST_APPLE_PLATFORM}"
+ "${arch}"
+ ASAN_TEST_TARGET_CFLAGS)
set(ASAN_TEST_CONFIG_SUFFIX "-${arch}-${ASAN_TEST_APPLE_PLATFORM}")
get_bits_for_arch(${arch} ASAN_TEST_BITS)
string(TOUPPER ${arch} ARCH_UPPER_CASE)
diff --git a/test/fuzzer/CMakeLists.txt b/test/fuzzer/CMakeLists.txt
index 62161d001..25bdcd2f0 100644
--- a/test/fuzzer/CMakeLists.txt
+++ b/test/fuzzer/CMakeLists.txt
@@ -89,12 +89,19 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
endif()
if (APPLE)
+ # FIXME(dliew): This logic should be refactored to the way UBSan Darwin
+ # testing is done.
set(EXCLUDE_FROM_ALL ON)
- foreach(arch ${DARWIN_ios_ARCHS})
+ list_intersect(FUZZER_TEST_IOS_ARCHS FUZZER_SUPPORTED_ARCH DARWIN_ios_ARCHS)
+ foreach(arch ${FUZZER_TEST_IOS_ARCHS})
set(LIBFUZZER_TEST_APPLE_PLATFORM "ios")
set(LIBFUZZER_TEST_TARGET_ARCH ${arch})
- set(LIBFUZZER_TEST_FLAGS "-arch ${arch} -isysroot ${DARWIN_ios_SYSROOT} ${COMPILER_RT_TEST_COMPILER_CFLAGS}")
+ get_test_cflags_for_apple_platform(
+ "${LIBFUZZER_TEST_APPLE_PLATFORM}"
+ "${LIBFUZZER_TEST_TARGET_ARCH}"
+ LIBFUZZER_TEST_FLAGS
+ )
set(LIBFUZZER_TEST_CONFIG_SUFFIX "-${arch}-${LIBFUZZER_TEST_APPLE_PLATFORM}")
string(TOUPPER ${arch} ARCH_UPPER_CASE)
set(CONFIG_NAME "IOS${ARCH_UPPER_CASE}Config")
diff --git a/test/tsan/CMakeLists.txt b/test/tsan/CMakeLists.txt
index f21fc2a3b..9159e7512 100644
--- a/test/tsan/CMakeLists.txt
+++ b/test/tsan/CMakeLists.txt
@@ -49,39 +49,52 @@ endforeach()
# variable to select which iOS device or simulator to use, e.g.:
# SANITIZER_IOSSIM_TEST_DEVICE_IDENTIFIER="iPhone 6"
if(APPLE)
+ # FIXME(dliew): This logic should be refactored to the way UBSan Darwin
+ # testing is done.
set(EXCLUDE_FROM_ALL ON)
-
set(TSAN_TEST_TARGET_CC ${COMPILER_RT_TEST_COMPILER})
- set(TSAN_TEST_APPLE_PLATFORM "iossim")
- set(arch "x86_64")
- set(TSAN_TEST_TARGET_ARCH ${arch})
- set(TSAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_iossim_SYSROOT} ${COMPILER_RT_TEST_COMPILER_CFLAGS}")
- set(TSAN_TEST_CONFIG_SUFFIX "-${arch}-${TSAN_TEST_APPLE_PLATFORM}")
- string(TOUPPER ${arch} ARCH_UPPER_CASE)
- set(CONFIG_NAME "IOSSim${ARCH_UPPER_CASE}Config")
- configure_lit_site_cfg(
- ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
- ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg.py
- )
- add_lit_testsuite(check-tsan-iossim-${arch} "ThreadSanitizer iOS Simulator ${arch} tests"
- ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/
- DEPENDS ${TSAN_TEST_DEPS})
+ list_intersect(TSAN_TEST_IOSSIM_ARCHS TSAN_SUPPORTED_ARCH DARWIN_iossim_ARCHS)
+ foreach(arch ${TSAN_TEST_IOSSIM_ARCHS})
+ set(TSAN_TEST_APPLE_PLATFORM "iossim")
+ set(TSAN_TEST_TARGET_ARCH ${arch})
+ get_test_cflags_for_apple_platform(
+ "${TSAN_TEST_APPLE_PLATFORM}"
+ "${TSAN_TEST_TARGET_ARCH}"
+ TSAN_TEST_TARGET_CFLAGS
+ )
+ set(TSAN_TEST_CONFIG_SUFFIX "-${arch}-${TSAN_TEST_APPLE_PLATFORM}")
+ string(TOUPPER ${arch} ARCH_UPPER_CASE)
+ set(CONFIG_NAME "IOSSim${ARCH_UPPER_CASE}Config")
+ configure_lit_site_cfg(
+ ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
+ ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg.py
+ )
+ add_lit_testsuite(check-tsan-iossim-${arch} "ThreadSanitizer iOS Simulator ${arch} tests"
+ ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/
+ DEPENDS ${TSAN_TEST_DEPS})
+ endforeach()
- set(TSAN_TEST_APPLE_PLATFORM "ios")
- set(arch "arm64")
- set(TSAN_TEST_TARGET_ARCH ${arch})
- set(TSAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_ios_SYSROOT} ${COMPILER_RT_TEST_COMPILER_CFLAGS}")
- set(TSAN_TEST_CONFIG_SUFFIX "-${arch}-${TSAN_TEST_APPLE_PLATFORM}")
- string(TOUPPER ${arch} ARCH_UPPER_CASE)
- set(CONFIG_NAME "IOS${ARCH_UPPER_CASE}Config")
- configure_lit_site_cfg(
- ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
- ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg.py
- )
- add_lit_testsuite(check-tsan-ios-${arch} "ThreadSanitizer iOS Simulator ${arch} tests"
- ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/
- DEPENDS ${TSAN_TEST_DEPS})
+ list_intersect(TSAN_TEST_IOS_ARCHS TSAN_SUPPORTED_ARCH DARWIN_ios_ARCHS)
+ foreach(arch ${TSAN_TEST_IOS_ARCHS})
+ set(TSAN_TEST_APPLE_PLATFORM "ios")
+ set(TSAN_TEST_TARGET_ARCH ${arch})
+ get_test_cflags_for_apple_platform(
+ "${TSAN_TEST_APPLE_PLATFORM}"
+ "${TSAN_TEST_TARGET_ARCH}"
+ TSAN_TEST_TARGET_CFLAGS
+ )
+ set(TSAN_TEST_CONFIG_SUFFIX "-${arch}-${TSAN_TEST_APPLE_PLATFORM}")
+ string(TOUPPER ${arch} ARCH_UPPER_CASE)
+ set(CONFIG_NAME "IOS${ARCH_UPPER_CASE}Config")
+ configure_lit_site_cfg(
+ ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
+ ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg.py
+ )
+ add_lit_testsuite(check-tsan-ios-${arch} "ThreadSanitizer iOS ${arch} tests"
+ ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/
+ DEPENDS ${TSAN_TEST_DEPS})
+ endforeach()
set(EXCLUDE_FROM_ALL OFF)
endif()
diff --git a/test/ubsan/CMakeLists.txt b/test/ubsan/CMakeLists.txt
index ee7032a91..9f30718dd 100644
--- a/test/ubsan/CMakeLists.txt
+++ b/test/ubsan/CMakeLists.txt
@@ -101,22 +101,20 @@ if(APPLE)
# variable to select which iOS device or simulator to use, e.g.:
# SANITIZER_IOSSIM_TEST_DEVICE_IDENTIFIER="iPhone 6"
set(EXCLUDE_FROM_ALL ON)
- set(UBSAN_APPLE_PLATFORMS "")
- if (COMPILER_RT_ENABLE_IOS)
- list(APPEND UBSAN_APPLE_PLATFORMS ios iossim)
- endif()
- if (COMPILER_RT_ENABLE_WATCHOS)
- list(APPEND UBSAN_APPLE_PLATFORMS watchos watchossim)
- endif()
- if (COMPILER_RT_ENABLE_TVOS)
- list(APPEND UBSAN_APPLE_PLATFORMS tvos tvossim)
- endif()
+ set(UBSAN_APPLE_PLATFORMS ${SANITIZER_COMMON_SUPPORTED_OS})
foreach(platform ${UBSAN_APPLE_PLATFORMS})
- foreach(arch ${DARWIN_${platform}_ARCHS})
- set(UBSAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_${platform}_SYSROOT}")
- if (";${UBSAN_SUPPORTED_ARCH};" MATCHES ";${arch};")
- add_ubsan_device_testsuite("Standalone" ubsan ${platform} ${arch})
- endif()
+ list_intersect(
+ UBSAN_TEST_${platform}_ARCHS
+ UBSAN_SUPPORTED_ARCH
+ DARWIN_${platform}_ARCHS
+ )
+ foreach(arch ${UBSAN_TEST_${platform}_ARCHS})
+ get_test_cflags_for_apple_platform(
+ "${platform}"
+ "${arch}"
+ UBSAN_TEST_TARGET_CFLAGS
+ )
+ add_ubsan_device_testsuite("Standalone" ubsan ${platform} ${arch})
if(COMPILER_RT_HAS_ASAN AND ";${ASAN_SUPPORTED_ARCH};" MATCHES ";${arch};")
add_ubsan_device_testsuite("AddressSanitizer" asan ${platform} ${arch})