From 44014739f2d5d33a9030f68b4621b29b7dbf88ab Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Mon, 29 Sep 2014 13:18:55 +0000 Subject: [sanitizer] Android build cleanup. * Detect Android toolchain target arch and set correct runtime library name. * Merged a lot of Android and non-Android code paths. * Android is only supported in standalone build of compiler-rt now. * Linking lsan-common in ASan-Android (makes lsan annotations work). * Relying on -fsanitize=address linker flag when building tests (again, unification with non-Android path). * Runtime library moved from lib/asan to lib/linux. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@218605 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/asan/CMakeLists.txt | 28 ++------- lib/asan/scripts/asan_device_setup | 4 +- lib/asan/tests/CMakeLists.txt | 68 ++++++++++++---------- lib/interception/CMakeLists.txt | 4 -- lib/lsan/CMakeLists.txt | 2 +- lib/sanitizer_common/CMakeLists.txt | 8 --- .../sanitizer_platform_limits_posix.h | 2 +- lib/sanitizer_common/tests/CMakeLists.txt | 38 +++++++----- 8 files changed, 68 insertions(+), 86 deletions(-) (limited to 'lib') diff --git a/lib/asan/CMakeLists.txt b/lib/asan/CMakeLists.txt index dec764deb..45b381bd8 100644 --- a/lib/asan/CMakeLists.txt +++ b/lib/asan/CMakeLists.txt @@ -66,6 +66,8 @@ append_if(COMPILER_RT_HAS_LIBM m ASAN_DYNAMIC_LIBS) append_if(COMPILER_RT_HAS_LIBPTHREAD pthread ASAN_DYNAMIC_LIBS) append_if(COMPILER_RT_HAS_LIBSTDCXX stdc++ ASAN_DYNAMIC_LIBS) +append_if(ANDROID log ASAN_DYNAMIC_LIBS) + # Compile ASan sources into an object library. if(APPLE) foreach(os ${SANITIZER_COMMON_SUPPORTED_DARWIN_OS}) @@ -75,11 +77,6 @@ if(APPLE) CFLAGS ${ASAN_CFLAGS} DEFS ${ASAN_COMMON_DEFINITIONS}) endforeach() -elseif(ANDROID) - add_library(RTAsan.arm.android OBJECT ${ASAN_SOURCES} ${ASAN_CXX_SOURCES}) - set_target_compile_flags(RTAsan.arm.android ${ASAN_CFLAGS}) - set_property(TARGET RTAsan.arm.android APPEND PROPERTY - COMPILE_DEFINITIONS ${ASAN_COMMON_DEFINITIONS}) else() foreach(arch ${ASAN_SUPPORTED_ARCH}) add_compiler_rt_object_library(RTAsan ${arch} @@ -114,21 +111,6 @@ if(APPLE) DEFS ${ASAN_COMMON_DEFINITIONS}) add_dependencies(asan clang_rt.asan_${os}_dynamic) endforeach() - -elseif(ANDROID) - add_library(clang_rt.asan-arm-android SHARED - $ - $ - $) - set_target_compile_flags(clang_rt.asan-arm-android - ${ASAN_CFLAGS}) - set_property(TARGET clang_rt.asan-arm-android APPEND PROPERTY - COMPILE_DEFINITIONS ${ASAN_COMMON_DEFINITIONS}) - target_link_libraries(clang_rt.asan-arm-android dl log) - add_dependencies(asan clang_rt.asan-arm-android) - install(TARGETS clang_rt.asan-arm-android - ARCHIVE DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR} - LIBRARY DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR}) else() # Build separate libraries for each target. foreach(arch ${ASAN_SUPPORTED_ARCH}) @@ -136,7 +118,7 @@ else() $ $ $) - if (NOT WIN32) + if(NOT WIN32) # We can't build Leak Sanitizer on Windows yet. list(APPEND ASAN_COMMON_RUNTIME_OBJECTS $) @@ -164,9 +146,9 @@ else() add_dependencies(asan clang_rt.asan-preinit-${arch}) if (WIN32) - set(SHARED_ASAN_NAME clang_rt.asan_dynamic-${arch}) + set(SHARED_ASAN_NAME clang_rt.asan_dynamic-${arch}${COMPILER_RT_OS_SUFFIX}) else() - set(SHARED_ASAN_NAME clang_rt.asan-${arch}) + set(SHARED_ASAN_NAME clang_rt.asan-${arch}${COMPILER_RT_OS_SUFFIX}) endif() add_compiler_rt_runtime(clang_rt.asan-dynamic-${arch} ${arch} SHARED diff --git a/lib/asan/scripts/asan_device_setup b/lib/asan/scripts/asan_device_setup index 12eee990e..a8b6d93e7 100755 --- a/lib/asan/scripts/asan_device_setup +++ b/lib/asan/scripts/asan_device_setup @@ -107,8 +107,8 @@ elif [[ -f "$HERE/$ASAN_RT" ]]; then ASAN_RT_PATH="$HERE" elif [[ $(basename "$HERE") == "bin" ]]; then # We could be in the toolchain's base directory. - # Consider ../lib, ../lib/asan and ../lib/clang/$VERSION/lib/linux. - P=$(ls "$HERE"/../lib/"$ASAN_RT" "$HERE"/../lib/asan/"$ASAN_RT" "$HERE"/../lib/clang/*/lib/linux/"$ASAN_RT" 2>/dev/null | sort | tail -1) + # Consider ../lib, ../lib/asan, ../lib/linux and ../lib/clang/$VERSION/lib/linux. + P=$(ls "$HERE"/../lib/"$ASAN_RT" "$HERE"/../lib/asan/"$ASAN_RT" "$HERE"/../lib/linux/"$ASAN_RT" "$HERE"/../lib/clang/*/lib/linux/"$ASAN_RT" 2>/dev/null | sort | tail -1) if [[ -n "$P" ]]; then ASAN_RT_PATH="$(dirname "$P")" fi diff --git a/lib/asan/tests/CMakeLists.txt b/lib/asan/tests/CMakeLists.txt index bb9553a4c..cef6fbceb 100644 --- a/lib/asan/tests/CMakeLists.txt +++ b/lib/asan/tests/CMakeLists.txt @@ -73,16 +73,16 @@ endif() set(ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS ${ASAN_UNITTEST_COMMON_LINKFLAGS}) -# On Android, we link with ASan runtime manually. On other platforms we depend -# on Clang driver behavior, passing -fsanitize=address flag. -if(NOT ANDROID) - list(APPEND ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS -fsanitize=address) -endif() +list(APPEND ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS -fsanitize=address) set(ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINKFLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS} -shared-libasan) +set(ASAN_UNITTEST_INSTRUMENTED_LIBS) +# NDK r10 requires -latomic almost always. +append_if(ANDROID atomic ASAN_UNITTEST_INSTRUMENTED_LIBS) + set(ASAN_UNITTEST_NOINST_LINKFLAGS ${ASAN_UNITTEST_COMMON_LINKFLAGS}) append_if(COMPILER_RT_HAS_LIBM -lm ASAN_UNITTEST_NOINST_LINKFLAGS) append_if(COMPILER_RT_HAS_LIBDL -ldl ASAN_UNITTEST_NOINST_LINKFLAGS) @@ -90,6 +90,12 @@ append_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_UNITTEST_NOINST_LINKFLAGS) append_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINKFLAGS) +# TODO(eugenis): move all -l flags above to _LIBS? +set(ASAN_UNITTEST_NOINST_LIBS) +append_if(ANDROID log ASAN_UNITTEST_NOINST_LIBS) +# NDK r10 requires -latomic almost always. +append_if(ANDROID atomic ASAN_UNITTEST_NOINST_LIBS) + # Compile source for the given architecture, using compiler # options in ${ARGN}, and add it to the object list. macro(asan_compile obj_list source arch kind) @@ -198,7 +204,7 @@ macro(add_asan_tests_for_arch_and_kind arch kind) $ $ $) - if(NOT MSVC) + if(NOT WIN32) list(APPEND ASAN_TEST_RUNTIME_OBJECTS $) endif() @@ -242,31 +248,31 @@ if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID) endif() if(ANDROID) - # We assume that unit tests on Android are built in a build - # tree with fresh Clang as a host compiler. - - # Test w/o ASan instrumentation. Link it with ASan statically. - add_executable(AsanNoinstTest - $ - $ - $ - ${COMPILER_RT_GTEST_SOURCE} - ${ASAN_NOINST_TEST_SOURCES}) - set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS}) - set_target_link_flags(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LINKFLAGS}) - target_link_libraries(AsanNoinstTest log) + foreach(arch ${ASAN_SUPPORTED_ARCH}) + # Test w/o ASan instrumentation. Link it with ASan statically. + add_executable(AsanNoinstTest # FIXME: .arch? + $ + $ + $ + $ + ${COMPILER_RT_GTEST_SOURCE} + ${ASAN_NOINST_TEST_SOURCES}) + set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS}) + set_target_link_flags(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LINKFLAGS}) + target_link_libraries(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LIBS}) - # Test with ASan instrumentation. Link with ASan dynamic runtime. - add_executable(AsanTest - ${COMPILER_RT_GTEST_SOURCE} - ${ASAN_INST_TEST_SOURCES}) - set_target_compile_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS}) - set_target_link_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS}) - target_link_libraries(AsanTest clang_rt.asan-arm-android) + # Test with ASan instrumentation. Link with ASan dynamic runtime. + add_executable(AsanTest + ${COMPILER_RT_GTEST_SOURCE} + ${ASAN_INST_TEST_SOURCES}) + set_target_compile_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS}) + set_target_link_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS}) + target_link_libraries(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LIBS}) - # Setup correct output directory and link flags. - set_target_properties(AsanNoinstTest AsanTest PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - # Add unit test to test suite. - add_dependencies(AsanUnitTests AsanNoinstTest AsanTest) + # Setup correct output directory and link flags. + set_target_properties(AsanNoinstTest AsanTest PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + # Add unit tests to the test suite. + add_dependencies(AsanUnitTests AsanNoinstTest AsanTest) + endforeach() endif() diff --git a/lib/interception/CMakeLists.txt b/lib/interception/CMakeLists.txt index cf8b3b4f9..b77f2d156 100644 --- a/lib/interception/CMakeLists.txt +++ b/lib/interception/CMakeLists.txt @@ -20,10 +20,6 @@ if(APPLE) SOURCES ${INTERCEPTION_SOURCES} CFLAGS ${INTERCEPTION_CFLAGS}) endforeach() -elseif(ANDROID) - add_library(RTInterception.arm.android OBJECT ${INTERCEPTION_SOURCES}) - set_target_compile_flags(RTInterception.arm.android - ${INTERCEPTION_CFLAGS}) else() # Otherwise, build separate libraries for each target. foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH}) diff --git a/lib/lsan/CMakeLists.txt b/lib/lsan/CMakeLists.txt index bb4c89df8..2ea765de1 100644 --- a/lib/lsan/CMakeLists.txt +++ b/lib/lsan/CMakeLists.txt @@ -25,7 +25,7 @@ if(APPLE) SOURCES ${LSAN_COMMON_SOURCES} CFLAGS ${LSAN_CFLAGS}) endforeach() -elseif(NOT ANDROID) +else() foreach(arch ${LSAN_COMMON_SUPPORTED_ARCH}) add_compiler_rt_object_library(RTLSanCommon ${arch} SOURCES ${LSAN_COMMON_SOURCES} diff --git a/lib/sanitizer_common/CMakeLists.txt b/lib/sanitizer_common/CMakeLists.txt index 3b1fab8ec..5eeb64e2a 100644 --- a/lib/sanitizer_common/CMakeLists.txt +++ b/lib/sanitizer_common/CMakeLists.txt @@ -121,14 +121,6 @@ if(APPLE) DEFS ${SANITIZER_COMMON_DEFINITIONS}) list(APPEND SANITIZER_RUNTIME_LIBRARIES RTSanitizerCommon.${os}) endforeach() -elseif(ANDROID) - add_library(RTSanitizerCommon.arm.android OBJECT - ${SANITIZER_SOURCES} ${SANITIZER_LIBCDEP_SOURCES}) - set_target_compile_flags(RTSanitizerCommon.arm.android - ${SANITIZER_CFLAGS}) - set_property(TARGET RTSanitizerCommon.arm.android APPEND PROPERTY - COMPILE_DEFINITIONS ${SANITIZER_COMMON_DEFINITIONS}) - list(APPEND SANITIZER_RUNTIME_LIBRARIES RTSanitizerCommon.arm.android) else() # Otherwise, build separate libraries for each target. foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH}) diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h index 01ed51b32..80a3ddb36 100644 --- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -472,7 +472,7 @@ namespace __sanitizer { typedef long __sanitizer___kernel_off_t; #endif -#if defined(__powerpc__) || defined(__aarch64__) || defined(__mips__) +#if defined(__powerpc__) || defined(__mips__) typedef unsigned int __sanitizer___kernel_old_uid_t; typedef unsigned int __sanitizer___kernel_old_gid_t; #else diff --git a/lib/sanitizer_common/tests/CMakeLists.txt b/lib/sanitizer_common/tests/CMakeLists.txt index 480badda0..40725ad72 100644 --- a/lib/sanitizer_common/tests/CMakeLists.txt +++ b/lib/sanitizer_common/tests/CMakeLists.txt @@ -57,6 +57,11 @@ if(NOT MSVC) list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON --driver-mode=g++) endif() +set(SANITIZER_TEST_LINK_LIBS) +append_if(ANDROID log SANITIZER_TEST_LINK_LIBS) +# NDK r10 requires -latomic almost always. +append_if(ANDROID atomic SANITIZER_TEST_LINK_LIBS) + append_if(COMPILER_RT_HAS_LIBDL -ldl SANITIZER_TEST_LINK_FLAGS_COMMON) append_if(COMPILER_RT_HAS_LIBPTHREAD -pthread SANITIZER_TEST_LINK_FLAGS_COMMON) # x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. Also, @@ -172,20 +177,21 @@ if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID) endif() if(ANDROID) - # We assume that unit tests on Android are built in a build - # tree with fresh Clang as a host compiler. - add_executable(SanitizerTest - ${SANITIZER_UNITTESTS} - ${COMPILER_RT_GTEST_SOURCE} - $) - set_target_compile_flags(SanitizerTest - ${SANITIZER_COMMON_CFLAGS} - ${SANITIZER_TEST_CFLAGS_COMMON}) - # Setup correct output directory and link flags. - set_target_properties(SanitizerTest PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON}) - target_link_libraries(SanitizerTest log) - # Add unit test to test suite. - add_dependencies(SanitizerUnitTests SanitizerTest) + foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH}) + add_executable(SanitizerTest + ${SANITIZER_UNITTESTS} + ${COMPILER_RT_GTEST_SOURCE} + $ + $) + set_target_compile_flags(SanitizerTest + ${SANITIZER_COMMON_CFLAGS} + ${SANITIZER_TEST_CFLAGS_COMMON}) + # Setup correct output directory and link flags. + set_target_properties(SanitizerTest PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON}) + target_link_libraries(SanitizerTest ${SANITIZER_TEST_LINK_LIBS}) + # Add unit test to test suite. + add_dependencies(SanitizerUnitTests SanitizerTest) + endforeach() endif() -- cgit v1.2.3