CMakeLists.txt revision b43d6a8ca10b9af8a903e8726003ae7767f9e823
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Testing rules for AddressSanitizer. 2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu# 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# These are broken into two buckets. One set of tests directly interacts with 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# the runtime library and checks its functionality. These are the 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# no-instrumentation tests. 6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Another group of tests relies upon the ability to compile the test with 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# address sanitizer instrumentation pass. These tests form "integration" tests 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# and have some elements of version skew -- they test the *host* compiler's 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# instrumentation against the just-built runtime library. 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectinclude(CheckCXXCompilerFlag) 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectinclude_directories(..) 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectinclude_directories(../..) 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectset(ASAN_UNITTEST_COMMON_CFLAGS 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -Wall 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -Wno-format 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -Werror 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -fvisibility=hidden 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -g 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -O2 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project) 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Use -D instead of definitions to please custom compile command. 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectif(ANDROID) 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project list(APPEND ASAN_UNITTEST_COMMON_CFLAGS 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_LOW_MEMORY=1 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_HAS_BLACKLIST=1 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_HAS_EXCEPTIONS=1 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_NEEDS_SEGV=0 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_UAR=0 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -fPIE 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ) 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectelse() 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project list(APPEND ASAN_UNITTEST_COMMON_CFLAGS 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_HAS_BLACKLIST=1 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_HAS_EXCEPTIONS=1 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_NEEDS_SEGV=1 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -DASAN_UAR=0 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ) 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectendif() 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Support 64-bit and 32-bit builds. 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectif(LLVM_BUILD_32_BITS) 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -m32) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectelse() 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -m64) 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectendif() 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectset(ASAN_GTEST_INCLUDE_CFLAGS 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -I${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -I${LLVM_MAIN_SRC_DIR}/include 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -I${LLVM_BINARY_DIR}/include 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -D__STDC_CONSTANT_MACROS 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -D__STDC_LIMIT_MACROS 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project) 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectset(ASAN_UNITTEST_INSTRUMENTED_CFLAGS 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ${ASAN_UNITTEST_COMMON_CFLAGS} 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ${ASAN_GTEST_INCLUDE_CFLAGS} 63392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom -faddress-sanitizer 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -mllvm "-asan-blacklist=${CMAKE_CURRENT_SOURCE_DIR}/asan_test.ignore" 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -mllvm -asan-stack=1 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -mllvm -asan-globals=1 67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom -mllvm -asan-mapping-scale=0 # default will be used 68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom -mllvm -asan-mapping-offset-log=-1 # default will be used 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project -mllvm -asan-use-after-return=0 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project) 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfunction(add_asan_test testsuite testname) 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add_unittest(${testsuite} ${testname} ${ARGN}) 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (APPLE) 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # Darwin-specific linker flags. 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_property(TARGET ${testname} APPEND PROPERTY 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LINK_FLAGS "-framework Foundation") 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project target_link_libraries(${testname} clang_rt.asan_osx) 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project elseif (ANDROID) 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project target_link_libraries(${testname} clang_rt.asan-arm-android) 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project elseif (UNIX) 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # Linux-specific linker flags. 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_property(TARGET ${testname} APPEND PROPERTY 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project LINK_FLAGS "-lpthread -ldl -rdynamic") 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(LLVM_BUILD_32_BITS) 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project target_link_libraries(${testname} clang_rt.asan-i386) 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else() 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project target_link_libraries(${testname} clang_rt.asan-x86_64) 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project endif() 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project endif() 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set(add_compile_flags "") 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project get_property(compile_flags TARGET ${testname} PROPERTY COMPILE_FLAGS) 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project foreach(arg ${ASAN_UNITTEST_COMMON_CFLAGS}) 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set(add_compile_flags "${add_compile_flags} ${arg}") 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project endforeach(arg ${ASAN_UNITTEST_COMMON_CFLAGS}) 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set_property(TARGET ${testname} PROPERTY COMPILE_FLAGS 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "${compile_flags} ${add_compile_flags}") 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectendfunction() 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 100392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromset(ASAN_NOINST_TEST_SOURCES 101392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom asan_noinst_test.cc 102392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom asan_break_optimization.cc 103392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom) 104392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 105392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromset(ASAN_INST_TEST_OBJECTS) 106392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 107392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# We only support building instrumented tests when we're not cross compiling 108392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# and targeting a unix-like system where we can predict viable compilation and 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# linking strategies. 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# We use a different approach to build these tests for Android. See below. 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectif("${CMAKE_HOST_SYSTEM}" STREQUAL "${CMAKE_SYSTEM}" AND UNIX AND NOT ANDROID) 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # This function is a custom routine to manage manually compiling source files 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # for unit tests with the just-built Clang binary, using the ASan 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # instrumentation, and linking them into a test executable. 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project function(add_asan_compile_command source extra_cflags) 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project set(output_obj "${source}.asan.o") 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add_custom_command( 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OUTPUT ${output_obj} 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project COMMAND clang 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} 122 ${extra_cflags} 123 -c -o "${output_obj}" 124 ${CMAKE_CURRENT_SOURCE_DIR}/${source} 125 MAIN_DEPENDENCY ${source} 126 DEPENDS clang ${ASAN_RUNTIME_LIBRARIES} ${ARGN} 127 ) 128 endfunction() 129 130 add_asan_compile_command(asan_globals_test.cc "") 131 add_asan_compile_command(asan_test.cc "") 132 list(APPEND ASAN_INST_TEST_OBJECTS asan_globals_test.cc.asan.o 133 asan_test.cc.asan.o) 134 if (APPLE) 135 add_asan_compile_command(asan_mac_test.mm "-ObjC") 136 list(APPEND ASAN_INST_TEST_OBJECTS asan_mac_test.mm.asan.o) 137 endif() 138 139 # Build benchmarks test instrumented with AddressSanitizer. 140 add_asan_compile_command(asan_benchmarks_test.cc "") 141 add_custom_target(AsanBenchmarks) 142 set_target_properties(AsanBenchmarks PROPERTIES FOLDER "Asan benchmarks") 143 add_asan_test(AsanBenchmarks AsanBenchmark asan_break_optimization.cc 144 asan_benchmarks_test.cc.asan.o) 145endif() 146 147# Main AddressSanitizer unit tests. 148add_custom_target(AsanUnitTests) 149set_target_properties(AsanUnitTests PROPERTIES FOLDER "ASan unit tests") 150 151if(ANDROID) 152 set(ASAN_INST_TEST_SOURCES asan_globals_test.cc asan_test.cc) 153 add_library(asan_noinst_test OBJECT 154 ${ASAN_NOINST_TEST_SOURCES} 155 ) 156 set_target_compile_flags(asan_noinst_test 157 ${ASAN_UNITTEST_COMMON_CFLAGS} ${ASAN_GTEST_INCLUDE_CFLAGS} 158 ) 159 add_asan_test(AsanUnitTests AsanTest 160 ${ASAN_INST_TEST_SOURCES} 161 $<TARGET_OBJECTS:asan_noinst_test> 162 ) 163 set_target_compile_flags(AsanTest 164 ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} ${ASAN_GTEST_INCLUDE_CFLAGS} 165 ) 166 set_target_link_flags(AsanTest 167 -pie 168 ) 169else() 170 add_asan_test(AsanUnitTests AsanTest ${ASAN_NOINST_TEST_SOURCES} 171 ${ASAN_INST_TEST_OBJECTS}) 172endif() 173