From 2cf990fa274dac4539168410afd9680a0fbaf234 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Wed, 19 Jun 2019 09:09:39 +0000 Subject: [PATCH] Revert r363633 "[CMake] Fix the value of `config.target_cflags` for non-macOS Apple platforms. Attempt #2." This caused Chromium's clang package to stop building, see comment on https://reviews.llvm.org/D61242 for details. > Summary: > 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 > /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 > /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 second 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 `_SUPPORTED_ARCH` (where `` is a Sanitizer > name) to iterate through the correct list of architectures. > > rdar://problem/50124489 > > Reviewers: kubamracek, yln, vsk, juliehockett, phosek > > Subscribers: mgorny, javed.absar, kristof.beyls, #sanitizers, llvm-commits > > Tags: #llvm, #sanitizers > > Differential Revision: https://reviews.llvm.org/D61242 llvm-svn: 363779 --- compiler-rt/cmake/config-ix.cmake | 26 ---------- compiler-rt/test/asan/CMakeLists.txt | 19 ++----- compiler-rt/test/fuzzer/CMakeLists.txt | 11 +--- compiler-rt/test/tsan/CMakeLists.txt | 70 +++++++++++--------------- compiler-rt/test/ubsan/CMakeLists.txt | 6 +-- 5 files changed, 35 insertions(+), 97 deletions(-) diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake index bfbd7970f8505e..166b8ce08532a3 100644 --- a/compiler-rt/cmake/config-ix.cmake +++ b/compiler-rt/cmake/config-ix.cmake @@ -208,32 +208,6 @@ 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/compiler-rt/test/asan/CMakeLists.txt b/compiler-rt/test/asan/CMakeLists.txt index e6f299a4de735d..2a44aebd55dd89 100644 --- a/compiler-rt/test/asan/CMakeLists.txt +++ b/compiler-rt/test/asan/CMakeLists.txt @@ -81,22 +81,15 @@ 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) - list_intersect(ASAN_TEST_IOSSIM_ARCHS ASAN_SUPPORTED_ARCH DARWIN_iossim_ARCHS) - foreach(arch ${ASAN_TEST_IOSSIM_ARCHS}) + foreach(arch ${DARWIN_iossim_ARCHS}) set(ASAN_TEST_APPLE_PLATFORM "iossim") set(ASAN_TEST_TARGET_ARCH ${arch}) - get_test_cflags_for_apple_platform( - "${ASAN_TEST_APPLE_PLATFORM}" - "${ASAN_TEST_TARGET_ARCH}" - ASAN_TEST_TARGET_CFLAGS - ) + set(ASAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_iossim_SYSROOT} ${COMPILER_RT_TEST_COMPILER_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) @@ -110,14 +103,10 @@ if(APPLE) DEPENDS ${ASAN_TEST_DEPS}) endforeach() - list_intersect(ASAN_TEST_IOS_ARCHS ASAN_SUPPORTED_ARCH DARWIN_ios_ARCHS) - foreach (arch ${ASAN_TEST_IOS_ARCHS}) + foreach (arch ${DARWIN_ios_ARCHS}) set(ASAN_TEST_APPLE_PLATFORM "ios") set(ASAN_TEST_TARGET_ARCH ${arch}) - get_test_cflags_for_apple_platform( - "${ASAN_TEST_APPLE_PLATFORM}" - "${arch}" - ASAN_TEST_TARGET_CFLAGS) + set(ASAN_TEST_TARGET_CFLAGS "-arch ${arch} -isysroot ${DARWIN_ios_SYSROOT} ${COMPILER_RT_TEST_COMPILER_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/compiler-rt/test/fuzzer/CMakeLists.txt b/compiler-rt/test/fuzzer/CMakeLists.txt index 9acbfdd9c6dabb..8e9f12dd122528 100644 --- a/compiler-rt/test/fuzzer/CMakeLists.txt +++ b/compiler-rt/test/fuzzer/CMakeLists.txt @@ -89,19 +89,12 @@ 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) - list_intersect(FUZZER_TEST_IOS_ARCHS FUZZER_SUPPORTED_ARCH DARWIN_ios_ARCHS) - foreach(arch ${FUZZER_TEST_IOS_ARCHS}) + foreach(arch ${DARWIN_ios_ARCHS}) set(LIBFUZZER_TEST_APPLE_PLATFORM "ios") set(LIBFUZZER_TEST_TARGET_ARCH ${arch}) - get_test_cflags_for_apple_platform( - "${LIBFUZZER_TEST_APPLE_PLATFORM}" - "${LIBFUZZER_TEST_TARGET_ARCH}" - LIBFUZZER_TEST_FLAGS - ) + set(LIBFUZZER_TEST_FLAGS "-arch ${arch} -isysroot ${DARWIN_ios_SYSROOT} ${COMPILER_RT_TEST_COMPILER_CFLAGS}") 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/compiler-rt/test/tsan/CMakeLists.txt b/compiler-rt/test/tsan/CMakeLists.txt index d95993ed425d71..c62eb1d6b3d3b8 100644 --- a/compiler-rt/test/tsan/CMakeLists.txt +++ b/compiler-rt/test/tsan/CMakeLists.txt @@ -49,53 +49,39 @@ 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}) - 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.in - ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg - ) - 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 "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.in + ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg + ) + 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_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.in - ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg - ) - add_lit_testsuite(check-tsan-ios-${arch} "ThreadSanitizer iOS ${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.in + ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg + ) + add_lit_testsuite(check-tsan-ios-${arch} "ThreadSanitizer iOS Simulator ${arch} tests" + ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/ + DEPENDS ${TSAN_TEST_DEPS}) set(EXCLUDE_FROM_ALL OFF) endif() diff --git a/compiler-rt/test/ubsan/CMakeLists.txt b/compiler-rt/test/ubsan/CMakeLists.txt index 280f96777406a9..60ef84d7530fb0 100644 --- a/compiler-rt/test/ubsan/CMakeLists.txt +++ b/compiler-rt/test/ubsan/CMakeLists.txt @@ -113,11 +113,7 @@ if(APPLE) endif() foreach(platform ${UBSAN_APPLE_PLATFORMS}) foreach(arch ${DARWIN_${platform}_ARCHS}) - get_test_cflags_for_apple_platform( - "${platform}" - "${arch}" - UBSAN_TEST_TARGET_CFLAGS - ) + 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()