diff options
Diffstat (limited to 'lib/asan/tests/CMakeLists.txt')
-rw-r--r-- | lib/asan/tests/CMakeLists.txt | 219 |
1 files changed, 123 insertions, 96 deletions
diff --git a/lib/asan/tests/CMakeLists.txt b/lib/asan/tests/CMakeLists.txt index fc0f1788bd35..7b363714e8a5 100644 --- a/lib/asan/tests/CMakeLists.txt +++ b/lib/asan/tests/CMakeLists.txt @@ -15,32 +15,29 @@ include(CompilerRTCompile) include_directories(..) include_directories(../..) -# Use zero-based shadow on Android. -if(ANDROID) - set(ASAN_TESTS_USE_ZERO_BASE_SHADOW TRUE) -else() - set(ASAN_TESTS_USE_ZERO_BASE_SHADOW FALSE) -endif() - set(ASAN_UNITTEST_HEADERS asan_mac_test.h asan_test_config.h asan_test_utils.h) set(ASAN_UNITTEST_COMMON_CFLAGS - ${COMPILER_RT_GTEST_INCLUDE_CFLAGS} + ${COMPILER_RT_TEST_CFLAGS} + ${COMPILER_RT_GTEST_CFLAGS} -I${COMPILER_RT_SOURCE_DIR}/include -I${COMPILER_RT_SOURCE_DIR}/lib -I${COMPILER_RT_SOURCE_DIR}/lib/asan -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/tests - -Wall + -fno-rtti + -O2 -Wno-format - -Werror - -Werror=sign-compare - -g - -O2) -if(SUPPORTS_NO_VARIADIC_MACROS_FLAG) - list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -Wno-variadic-macros) + -Werror=sign-compare) +append_list_if(COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG -Wno-variadic-macros ASAN_UNITTEST_COMMON_CFLAGS) + +# -gline-tables-only must be enough for ASan, so use it if possible. +if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang") + list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gline-tables-only) +else() + list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -g) endif() # Use -D instead of definitions to please custom compile command. @@ -48,79 +45,91 @@ list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -DASAN_HAS_BLACKLIST=1 -DASAN_HAS_EXCEPTIONS=1 -DASAN_UAR=0) -if(ANDROID) - list(APPEND ASAN_UNITTEST_COMMON_CFLAGS - -DASAN_FLEXIBLE_MAPPING_AND_OFFSET=0 - -DASAN_NEEDS_SEGV=0) -else() - list(APPEND ASAN_UNITTEST_COMMON_CFLAGS - -DASAN_FLEXIBLE_MAPPING_AND_OFFSET=1 - -DASAN_NEEDS_SEGV=1) -endif() set(ASAN_BLACKLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/asan_test.ignore") set(ASAN_UNITTEST_INSTRUMENTED_CFLAGS ${ASAN_UNITTEST_COMMON_CFLAGS} -fsanitize=address "-fsanitize-blacklist=${ASAN_BLACKLIST_FILE}" - -mllvm -asan-stack=1 - -mllvm -asan-globals=1 - -mllvm -asan-mapping-scale=0 # default will be used - -mllvm -asan-mapping-offset-log=-1 # default will be used ) -if(ASAN_TESTS_USE_ZERO_BASE_SHADOW) - list(APPEND ASAN_UNITTEST_INSTRUMENTED_CFLAGS - -fsanitize-address-zero-base-shadow) +if(CAN_TARGET_x86_64 OR CAN_TARGET_i386) + list(APPEND ASAN_UNITTEST_INSTRUMENTED_CFLAGS -mllvm -asan-instrument-assembly) +endif() + +if(NOT MSVC) + list(APPEND ASAN_UNITTEST_COMMON_LINKFLAGS --driver-mode=g++) +endif() + +# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. +if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE") + list(APPEND ASAN_UNITTEST_COMMON_LINKFLAGS "-lc++") endif() -# Unit tests require libstdc++. -set(ASAN_UNITTEST_COMMON_LINKFLAGS -lstdc++) # Unit tests on Mac depend on Foundation. if(APPLE) list(APPEND ASAN_UNITTEST_COMMON_LINKFLAGS -framework Foundation) endif() -if(ASAN_TESTS_USE_ZERO_BASE_SHADOW) +if(ANDROID) list(APPEND ASAN_UNITTEST_COMMON_LINKFLAGS -pie) 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_UNITTEST_NOINST_LINKFLAGS - ${ASAN_UNITTEST_COMMON_LINKFLAGS} - -ldl -lm) -if(NOT ANDROID) - list(APPEND ASAN_UNITTEST_NOINST_LINKFLAGS -lpthread) -endif() +set(ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINKFLAGS + ${ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS} + -shared-libasan) + +set(ASAN_UNITTEST_INSTRUMENTED_LIBS) +# NDK r10 requires -latomic almost always. +append_list_if(ANDROID atomic ASAN_UNITTEST_INSTRUMENTED_LIBS) + +set(ASAN_UNITTEST_NOINST_LINKFLAGS ${ASAN_UNITTEST_COMMON_LINKFLAGS}) +append_list_if(COMPILER_RT_HAS_LIBM -lm ASAN_UNITTEST_NOINST_LINKFLAGS) +append_list_if(COMPILER_RT_HAS_LIBDL -ldl ASAN_UNITTEST_NOINST_LINKFLAGS) +append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_UNITTEST_NOINST_LINKFLAGS) +append_list_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_list_if(ANDROID log ASAN_UNITTEST_NOINST_LIBS) +# NDK r10 requires -latomic almost always. +append_list_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) +macro(asan_compile obj_list source arch kind) get_filename_component(basename ${source} NAME) - set(output_obj "${obj_list}.${basename}.${arch}.o") + set(output_obj "${obj_list}.${basename}.${arch}${kind}.o") get_target_flags_for_arch(${arch} TARGET_CFLAGS) + set(COMPILE_DEPS ${ASAN_UNITTEST_HEADERS} ${ASAN_BLACKLIST_FILE}) + if(NOT COMPILER_RT_STANDALONE_BUILD) + list(APPEND COMPILE_DEPS gtest asan) + endif() clang_compile(${output_obj} ${source} CFLAGS ${ARGN} ${TARGET_CFLAGS} - DEPS gtest asan_runtime_libraries - ${ASAN_UNITTEST_HEADERS} - ${ASAN_BLACKLIST_FILE}) + DEPS ${COMPILE_DEPS}) list(APPEND ${obj_list} ${output_obj}) endmacro() # Link ASan unit test for a given architecture from a set # of objects in with given linker flags. -macro(add_asan_test test_suite test_name arch) +macro(add_asan_test test_suite test_name arch kind) parse_arguments(TEST "OBJECTS;LINKFLAGS" "WITH_TEST_RUNTIME" ${ARGN}) get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS) - set(TEST_DEPS asan_runtime_libraries ${TEST_OBJECTS}) + set(TEST_DEPS ${TEST_OBJECTS}) + if(NOT COMPILER_RT_STANDALONE_BUILD) + list(APPEND TEST_DEPS asan) + endif() if(TEST_WITH_TEST_RUNTIME) list(APPEND TEST_DEPS ${ASAN_TEST_RUNTIME}) - list(APPEND TEST_OBJECTS lib${ASAN_TEST_RUNTIME}.a) + if(NOT MSVC) + list(APPEND TEST_OBJECTS lib${ASAN_TEST_RUNTIME}.a) + else() + list(APPEND TEST_OBJECTS ${ASAN_TEST_RUNTIME}.lib) + endif() endif() add_compiler_rt_test(${test_suite} ${test_name} OBJECTS ${TEST_OBJECTS} @@ -144,6 +153,7 @@ set(ASAN_NOINST_TEST_SOURCES set(ASAN_INST_TEST_SOURCES ${COMPILER_RT_GTEST_SOURCE} + asan_asm_test.cc asan_globals_test.cc asan_interface_test.cc asan_test.cc @@ -157,27 +167,32 @@ endif() set(ASAN_BENCHMARKS_SOURCES ${COMPILER_RT_GTEST_SOURCE} - asan_benchmarks_test.cc) + asan_benchmarks_test.cc) # Adds ASan unit tests and benchmarks for architecture. -macro(add_asan_tests_for_arch arch) +macro(add_asan_tests_for_arch_and_kind arch kind) # Instrumented tests. set(ASAN_INST_TEST_OBJECTS) foreach(src ${ASAN_INST_TEST_SOURCES}) - asan_compile(ASAN_INST_TEST_OBJECTS ${src} ${arch} - ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS}) + asan_compile(ASAN_INST_TEST_OBJECTS ${src} ${arch} ${kind} + ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} ${ARGN}) endforeach() if (APPLE) # Add Mac-specific helper. - asan_compile(ASAN_INST_TEST_OBJECTS asan_mac_test_helpers.mm ${arch} - ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} -ObjC) + asan_compile(ASAN_INST_TEST_OBJECTS asan_mac_test_helpers.mm ${arch} ${kind} + ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} -ObjC ${ARGN}) endif() - add_asan_test(AsanUnitTests "Asan-${arch}-Test" ${arch} + add_asan_test(AsanUnitTests "Asan-${arch}${kind}-Test" ${arch} ${kind} OBJECTS ${ASAN_INST_TEST_OBJECTS} LINKFLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS}) + if(COMPILER_RT_BUILD_SHARED_ASAN) + add_asan_test(AsanUnitTests "Asan-${arch}${kind}-Dynamic-Test" ${arch} ${kind} + OBJECTS ${ASAN_INST_TEST_OBJECTS} + LINKFLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINKFLAGS}) + endif() # Add static ASan runtime that will be linked with uninstrumented tests. - set(ASAN_TEST_RUNTIME RTAsanTest.${arch}) + set(ASAN_TEST_RUNTIME RTAsanTest.${arch}${kind}) if(APPLE) set(ASAN_TEST_RUNTIME_OBJECTS $<TARGET_OBJECTS:RTAsan.osx> @@ -187,10 +202,14 @@ macro(add_asan_tests_for_arch arch) else() set(ASAN_TEST_RUNTIME_OBJECTS $<TARGET_OBJECTS:RTAsan.${arch}> + $<TARGET_OBJECTS:RTAsan_cxx.${arch}> $<TARGET_OBJECTS:RTInterception.${arch}> - $<TARGET_OBJECTS:RTLSanCommon.${arch}> $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>) + if(NOT WIN32) + list(APPEND ASAN_TEST_RUNTIME_OBJECTS + $<TARGET_OBJECTS:RTLSanCommon.${arch}>) + endif() endif() add_library(${ASAN_TEST_RUNTIME} STATIC ${ASAN_TEST_RUNTIME_OBJECTS}) set_target_properties(${ASAN_TEST_RUNTIME} PROPERTIES @@ -198,10 +217,10 @@ macro(add_asan_tests_for_arch arch) # Uninstrumented tests. set(ASAN_NOINST_TEST_OBJECTS) foreach(src ${ASAN_NOINST_TEST_SOURCES}) - asan_compile(ASAN_NOINST_TEST_OBJECTS ${src} ${arch} - ${ASAN_UNITTEST_COMMON_CFLAGS}) + asan_compile(ASAN_NOINST_TEST_OBJECTS ${src} ${arch} ${kind} + ${ASAN_UNITTEST_COMMON_CFLAGS} ${ARGN}) endforeach() - add_asan_test(AsanUnitTests "Asan-${arch}-Noinst-Test" ${arch} + add_asan_test(AsanUnitTests "Asan-${arch}${kind}-Noinst-Test" ${arch} ${kind} OBJECTS ${ASAN_NOINST_TEST_OBJECTS} LINKFLAGS ${ASAN_UNITTEST_NOINST_LINKFLAGS} WITH_TEST_RUNTIME) @@ -209,45 +228,53 @@ macro(add_asan_tests_for_arch arch) # Benchmarks. set(ASAN_BENCHMARKS_OBJECTS) foreach(src ${ASAN_BENCHMARKS_SOURCES}) - asan_compile(ASAN_BENCHMARKS_OBJECTS ${src} ${arch} - ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS}) + asan_compile(ASAN_BENCHMARKS_OBJECTS ${src} ${arch} ${kind} + ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} ${ARGN}) endforeach() - add_asan_test(AsanBenchmarks "Asan-${arch}-Benchmark" ${arch} + add_asan_test(AsanBenchmarks "Asan-${arch}${kind}-Benchmark" ${arch} ${kind} OBJECTS ${ASAN_BENCHMARKS_OBJECTS} LINKFLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINKFLAGS}) + if(COMPILER_RT_BUILD_SHARED_ASAN) + add_asan_test(AsanBenchmarks "Asan-${arch}${kind}-Dynamic-Benchmark" ${arch} ${kind} + OBJECTS ${ASAN_BENCHMARKS_OBJECTS} + LINKFLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINKFLAGS}) + endif() endmacro() -if(COMPILER_RT_CAN_EXECUTE_TESTS) +if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID) foreach(arch ${ASAN_SUPPORTED_ARCH}) - add_asan_tests_for_arch(${arch}) + add_asan_tests_for_arch_and_kind(${arch} "-inline") + add_asan_tests_for_arch_and_kind(${arch} "-with-calls" + -mllvm -asan-instrumentation-with-call-threshold=0) endforeach() 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 - $<TARGET_OBJECTS:RTAsan.arm.android> - $<TARGET_OBJECTS:RTInterception.arm.android> - $<TARGET_OBJECTS:RTSanitizerCommon.arm.android> - ${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}) - - # 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) - - # 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) + foreach(arch ${ASAN_SUPPORTED_ARCH}) + # Test w/o ASan instrumentation. Link it with ASan statically. + add_executable(AsanNoinstTest # FIXME: .arch? + $<TARGET_OBJECTS:RTAsan.${arch}> + $<TARGET_OBJECTS:RTInterception.${arch}> + $<TARGET_OBJECTS:RTSanitizerCommon.${arch}> + $<TARGET_OBJECTS:RTSanitizerCommonLibc.${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 ${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 tests to the test suite. + add_dependencies(AsanUnitTests AsanNoinstTest AsanTest) + endforeach() endif() |