brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.3 KiB · 6d88c96 Raw
337 lines · plain
1# Testing rules for AddressSanitizer.2#3# These are broken into two buckets. One set of tests directly interacts with4# the runtime library and checks its functionality. These are the5# no-instrumentation tests.6#7# Another group of tests relies upon the ability to compile the test with8# address sanitizer instrumentation pass. These tests form "integration" tests9# and have some elements of version skew -- they test the *host* compiler's10# instrumentation against the just-built runtime library.11 12include(CheckCXXCompilerFlag)13include(CompilerRTCompile)14 15include_directories(..)16include_directories(../..)17 18set(ASAN_UNITTEST_HEADERS19  asan_mac_test.h20  asan_test_config.h21  asan_test_utils.h)22 23set(ASAN_UNITTEST_COMMON_CFLAGS24  ${COMPILER_RT_UNITTEST_CFLAGS}25  ${COMPILER_RT_GTEST_CFLAGS}26  ${SANITIZER_TEST_CXX_CFLAGS}27  -I${COMPILER_RT_SOURCE_DIR}/include28  -I${COMPILER_RT_SOURCE_DIR}/lib29  -I${COMPILER_RT_SOURCE_DIR}/lib/asan30  -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/tests31  -DSANITIZER_COMMON_NO_REDEFINE_BUILTINS32  -fno-rtti33  -O234  -Wno-format35  -Werror=sign-compare)36append_list_if(COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG -Wno-variadic-macros ASAN_UNITTEST_COMMON_CFLAGS)37 38# This will ensure the target linker is used39# during cross compilation40set(ASAN_UNITTEST_COMMON_LINK_FLAGS41  ${COMPILER_RT_UNITTEST_LINK_FLAGS}42  ${COMPILER_RT_UNWINDER_LINK_LIBS}43  ${SANITIZER_TEST_CXX_LIBRARIES})44 45# -gline-tables-only must be enough for ASan, so use it if possible.46if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")47  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gline-tables-only)48else()49  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -g)50endif()51if(MSVC)52  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gcodeview)53endif()54list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -g)55 56# Use -D instead of definitions to please custom compile command.57list(APPEND ASAN_UNITTEST_COMMON_CFLAGS58  -DASAN_HAS_IGNORELIST=159  -DASAN_HAS_EXCEPTIONS=160  -DASAN_UAR=061  )62 63if(APPLE)64  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS ${DARWIN_osx_CFLAGS})65  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${DARWIN_osx_LINK_FLAGS})66 67  add_weak_symbols("asan" WEAK_SYMBOL_LINK_FLAGS)68  add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)69  add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)70  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS})71endif()72 73set(ASAN_IGNORELIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/asan_test.ignore")74set(ASAN_UNITTEST_INSTRUMENTED_CFLAGS75  ${ASAN_UNITTEST_COMMON_CFLAGS}76  -fsanitize=address77  "-fsanitize-ignorelist=${ASAN_IGNORELIST_FILE}"78)79if(NOT MSVC)80  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS --driver-mode=g++)81endif()82 83# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests.84if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE")85  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS "-lc++")86endif()87 88# Unit tests on Mac depend on Foundation.89if(APPLE)90  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -framework Foundation)91endif()92if(ANDROID)93  list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -pie)94endif()95 96set(ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS97  ${ASAN_UNITTEST_COMMON_LINK_FLAGS})98list(APPEND ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS -fsanitize=address)99 100set(ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS101  ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS}102  -shared-libasan)103 104set(ASAN_UNITTEST_INSTRUMENTED_LIBS)105 106set(ASAN_UNITTEST_NOINST_LINK_FLAGS ${ASAN_UNITTEST_COMMON_LINK_FLAGS})107append_list_if(MSVC -Wl,-nodefaultlib:msvcrt ASAN_UNITTEST_NOINST_LINK_FLAGS)108if(NOT APPLE)109  append_list_if(COMPILER_RT_HAS_LIBM -lm ASAN_UNITTEST_NOINST_LINK_FLAGS)110  append_list_if(COMPILER_RT_HAS_LIBDL -ldl ASAN_UNITTEST_NOINST_LINK_FLAGS)111  append_list_if(COMPILER_RT_HAS_LIBRT -lrt ASAN_UNITTEST_NOINST_LINK_FLAGS)112  append_list_if(HAIKU -lbsd ASAN_UNITTEST_NOINST_LINK_FLAGS)113  append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_UNITTEST_NOINST_LINK_FLAGS)114  append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS)115endif()116 117# TODO(eugenis): move all -l flags above to _LIBS?118set(ASAN_UNITTEST_NOINST_LIBS)119append_list_if(COMPILER_RT_HAS_LIBLOG log ASAN_UNITTEST_NOINST_LIBS)120 121# Main AddressSanitizer unit tests.122add_custom_target(AsanUnitTests)123set_target_properties(AsanUnitTests PROPERTIES FOLDER "Compiler-RT/Tests")124 125# AddressSanitizer unit tests with dynamic runtime (on platforms where it's126# not the default).127add_custom_target(AsanDynamicUnitTests)128set_target_properties(AsanDynamicUnitTests PROPERTIES FOLDER "Compiler-RT/Tests")129# ASan benchmarks (not actively used now).130add_custom_target(AsanBenchmarks)131set_target_properties(AsanBenchmarks PROPERTIES FOLDER "Compiler-RT/Tests")132 133set(ASAN_NOINST_TEST_SOURCES134  ${COMPILER_RT_GTEST_SOURCE}135  asan_fake_stack_test.cpp136  asan_noinst_test.cpp137  asan_test_main.cpp138  )139 140set(ASAN_INST_TEST_SOURCES141  ${COMPILER_RT_GTEST_SOURCE}142  asan_globals_test.cpp143  asan_interface_test.cpp144  asan_internal_interface_test.cpp145  asan_test.cpp146  asan_oob_test.cpp147  asan_mem_test.cpp148  asan_str_test.cpp149  asan_test_main.cpp150  )151if(APPLE)152  list(APPEND ASAN_INST_TEST_SOURCES153    asan_mac_test.cpp154    asan_mac_test_helpers.mm155    )156endif()157 158set(ASAN_BENCHMARKS_SOURCES159  ${COMPILER_RT_GTEST_SOURCE}160  asan_benchmarks_test.cpp161  )162 163function(add_asan_tests arch test_runtime)164  cmake_parse_arguments(TEST "" "KIND" "CFLAGS" ${ARGN})165 166  # The Lit files are configured once per architecture and static/dynamic167  # selection. Each configuration expects the test binaries in a corresponding168  # subdirectory. Generate subdirectory names based on the architecture name.169  string(TOUPPER ${arch} ARCH_UPPER_CASE)170  set(CONFIG_NAME ${ARCH_UPPER_CASE}${OS_NAME}Config)171  set(CONFIG_NAME_DYNAMIC ${ARCH_UPPER_CASE}${OS_NAME}DynamicConfig)172 173  # On some platforms, unit tests can be run against the runtime that shipped174  # with the host compiler with COMPILER_RT_TEST_STANDALONE_BUILD_LIBS=OFF.175  # COMPILER_RT_ASAN_UNIT_TESTS_USE_HOST_RUNTIME=ON removes the dependency176  # on `asan`, allowing the tests to be run independently without177  # a newly built asan runtime.178  set(ASAN_UNIT_TEST_DEPS asan)179  if(COMPILER_RT_ASAN_UNIT_TESTS_USE_HOST_RUNTIME)180    set(ASAN_UNIT_TEST_DEPS)181  endif()182 183  # Closure to keep the values.184  function(generate_asan_tests test_objects test_suite testname)185    generate_compiler_rt_tests(${test_objects} ${test_suite} ${testname} ${arch}186      COMPILE_DEPS ${ASAN_UNITTEST_HEADERS} ${ASAN_IGNORELIST_FILE}187      DEPS ${ASAN_UNIT_TEST_DEPS}188      KIND ${TEST_KIND}189      ${ARGN}190      )191    set("${test_objects}" "${${test_objects}}" PARENT_SCOPE)192  endfunction()193 194  set(TARGET_LINK_FLAGS)195  get_target_link_flags_for_arch(${arch} TARGET_LINK_FLAGS)196 197  set(ASAN_INST_TEST_OBJECTS)198  generate_asan_tests(ASAN_INST_TEST_OBJECTS AsanUnitTests199    "Asan-${arch}${TEST_KIND}-Test"200    SUBDIR "${CONFIG_NAME}"201    LINK_FLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS} ${TARGET_LINK_FLAGS}202    SOURCES ${ASAN_INST_TEST_SOURCES}203    CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} ${TEST_CFLAGS})204 205  if(COMPILER_RT_ASAN_HAS_STATIC_RUNTIME)206    set(dynamic_test_name "Asan-${arch}${TEST_KIND}-Dynamic-Test")207    if(MSVC)208 209      # With the MSVC CRT, the choice between static and dynamic CRT is made at210      # compile time with a macro. Simulate the effect of passing /MD to clang-cl.211      set(ASAN_DYNAMIC_TEST_OBJECTS)212      generate_asan_tests(ASAN_DYNAMIC_TEST_OBJECTS213        AsanDynamicUnitTests "${dynamic_test_name}"214        SUBDIR "${CONFIG_NAME_DYNAMIC}"215        CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} -D_MT -D_DLL216        SOURCES ${ASAN_INST_TEST_SOURCES}217        LINK_FLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS}218          -D_MT -D_DLL -Wl,-nodefaultlib:libcmt,-defaultlib:msvcrt,-defaultlib:oldnames219        )220    else()221      set(DYNAMIC_LINK_FLAGS)222      get_dynamic_link_flags_for_arch(${arch} DYNAMIC_LINK_FLAGS)223 224      # Otherwise, reuse ASAN_INST_TEST_OBJECTS.225      add_compiler_rt_test(AsanDynamicUnitTests "${dynamic_test_name}" "${arch}"226        SUBDIR "${CONFIG_NAME_DYNAMIC}"227        OBJECTS ${ASAN_INST_TEST_OBJECTS}228        DEPS ${ASAN_UNIT_TEST_DEPS} ${ASAN_INST_TEST_OBJECTS}229        LINK_FLAGS ${ASAN_DYNAMIC_UNITTEST_INSTRUMENTED_LINK_FLAGS} ${TARGET_LINK_FLAGS} ${DYNAMIC_LINK_FLAGS}230        )231    endif()232  endif()233 234  # Uninstrumented tests.235  set(ASAN_NOINST_TEST_OBJECTS)236  generate_asan_tests(ASAN_NOINST_TEST_OBJECTS237    AsanUnitTests "Asan-${arch}${TEST_KIND}-Noinst-Test"238    SUBDIR "${CONFIG_NAME}"239    CFLAGS ${ASAN_UNITTEST_COMMON_CFLAGS}240    LINK_FLAGS ${ASAN_UNITTEST_NOINST_LINK_FLAGS} ${TARGET_LINK_FLAGS}241    SOURCES ${ASAN_NOINST_TEST_SOURCES}242    RUNTIME ${test_runtime})243 244  set(ASAN_BENCHMARK_OBJECTS)245  generate_asan_tests(ASAN_BENCHMARK_OBJECTS246    AsanBenchmarks "Asan-${arch}${TEST_KIND}-Benchmark"247    SUBDIR "${CONFIG_NAME}"248    CFLAGS ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS}249    SOURCES ${ASAN_BENCHMARKS_SOURCES}250    LINK_FLAGS ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS} ${TARGET_LINK_FLAGS})251endfunction()252 253if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID)254  set(ASAN_TEST_ARCH ${ASAN_SUPPORTED_ARCH})255  if(APPLE)256    darwin_filter_host_archs(ASAN_SUPPORTED_ARCH ASAN_TEST_ARCH)257  endif()258  list(REMOVE_ITEM ASAN_TEST_ARCH sparcv9)259  if(OS_NAME MATCHES "SunOS")260    list(REMOVE_ITEM ASAN_TEST_ARCH x86_64)261  endif()262 263  foreach(arch ${ASAN_TEST_ARCH})264 265    # Add static ASan runtime that will be linked with uninstrumented tests.266    set(ASAN_TEST_RUNTIME RTAsanTest.${arch})267    if(APPLE)268      set(ASAN_TEST_RUNTIME_OBJECTS269        $<TARGET_OBJECTS:RTAsan_dynamic.osx>270        $<TARGET_OBJECTS:RTInterception.osx>271        $<TARGET_OBJECTS:RTSanitizerCommon.osx>272        $<TARGET_OBJECTS:RTSanitizerCommonLibc.osx>273        $<TARGET_OBJECTS:RTSanitizerCommonCoverage.osx>274        $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.osx>275        $<TARGET_OBJECTS:RTLSanCommon.osx>276        $<TARGET_OBJECTS:RTUbsan.osx>)277    else()278      set(ASAN_TEST_RUNTIME_OBJECTS279        $<TARGET_OBJECTS:RTAsan.${arch}>280        $<TARGET_OBJECTS:RTAsan_cxx.${arch}>281        $<TARGET_OBJECTS:RTAsan_static.${arch}>282        $<TARGET_OBJECTS:RTInterception.${arch}>283        $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>284        $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>285        $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>286        $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>287        $<TARGET_OBJECTS:RTSanitizerCommonSymbolizerInternal.${arch}>288        $<TARGET_OBJECTS:RTLSanCommon.${arch}>289        $<TARGET_OBJECTS:RTUbsan.${arch}>)290    endif()291    add_library(${ASAN_TEST_RUNTIME} STATIC ${ASAN_TEST_RUNTIME_OBJECTS})292    set_target_properties(${ASAN_TEST_RUNTIME} PROPERTIES293      ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}294      FOLDER "Compiler-RT/Tests/Runtime")295 296    add_asan_tests(${arch} ${ASAN_TEST_RUNTIME} KIND "-inline")297    add_asan_tests(${arch} ${ASAN_TEST_RUNTIME} KIND "-calls"298      CFLAGS -mllvm -asan-instrumentation-with-call-threshold=0)299  endforeach()300endif()301 302if(ANDROID)303  foreach(arch ${ASAN_SUPPORTED_ARCH})304    # Test w/o ASan instrumentation. Link it with ASan statically.305    add_executable(AsanNoinstTest # FIXME: .arch?306      $<TARGET_OBJECTS:RTAsan.${arch}>307      $<TARGET_OBJECTS:RTAsan_static.${arch}>308      $<TARGET_OBJECTS:RTInterception.${arch}>309      $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>310      $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>311      $<TARGET_OBJECTS:RTSanitizerCommonCoverage.${arch}>312      $<TARGET_OBJECTS:RTSanitizerCommonSymbolizer.${arch}>313      $<TARGET_OBJECTS:RTSanitizerCommonSymbolizerInternal.${arch}>314      $<TARGET_OBJECTS:RTLSanCommon.${arch}>315      $<TARGET_OBJECTS:RTUbsan.${arch}>316      ${COMPILER_RT_GTEST_SOURCE}317      ${ASAN_NOINST_TEST_SOURCES})318    set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS})319    set_target_link_flags(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LINK_FLAGS})320    target_link_libraries(AsanNoinstTest ${ASAN_UNITTEST_NOINST_LIBS})321 322    # Test with ASan instrumentation. Link with ASan dynamic runtime.323    add_executable(AsanTest324      ${COMPILER_RT_GTEST_SOURCE}325      ${ASAN_INST_TEST_SOURCES})326    set_target_compile_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS})327    set_target_link_flags(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LINK_FLAGS})328    target_link_libraries(AsanTest ${ASAN_UNITTEST_INSTRUMENTED_LIBS})329 330    # Setup correct output directory and link flags.331    set_target_properties(AsanNoinstTest AsanTest PROPERTIES332      RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})333    # Add unit tests to the test suite.334    add_dependencies(AsanUnitTests AsanNoinstTest AsanTest)335  endforeach()336endif()337