CMakeLists.txt revision 60ab090deed8213613643729a7921ef0915ac704
144d362409d5469aed47d19e7908d19bd194493aThomas Graf# Testing rules for AddressSanitizer. 244d362409d5469aed47d19e7908d19bd194493aThomas Graf# 344d362409d5469aed47d19e7908d19bd194493aThomas Graf# These are broken into two buckets. One set of tests directly interacts with 444d362409d5469aed47d19e7908d19bd194493aThomas Graf# the runtime library and checks its functionality. These are the 544d362409d5469aed47d19e7908d19bd194493aThomas Graf# no-instrumentation tests. 644d362409d5469aed47d19e7908d19bd194493aThomas Graf# 744d362409d5469aed47d19e7908d19bd194493aThomas Graf# Another group of tests relies upon the ability to compile the test with 844d362409d5469aed47d19e7908d19bd194493aThomas Graf# address sanitizer instrumentation pass. These tests form "integration" tests 98a3efffa5b3fde252675239914118664d36a2c24Thomas Graf# and have some elements of version skew -- they test the *host* compiler's 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf# instrumentation against the just-built runtime library. 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf 1244d362409d5469aed47d19e7908d19bd194493aThomas Grafinclude(CheckCXXCompilerFlag) 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf 1444d362409d5469aed47d19e7908d19bd194493aThomas Grafinclude_directories(..) 1544d362409d5469aed47d19e7908d19bd194493aThomas Grafinclude_directories(../..) 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf 1744d362409d5469aed47d19e7908d19bd194493aThomas Grafset(ASAN_UNITTEST_COMMON_CFLAGS 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf # Use -D instead of definitions to please custom compile command. 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf -DASAN_HAS_BLACKLIST=1 2044d362409d5469aed47d19e7908d19bd194493aThomas Graf -DASAN_HAS_EXCEPTIONS=1 2144d362409d5469aed47d19e7908d19bd194493aThomas Graf -DASAN_NEEDS_SEGV=1 2244d362409d5469aed47d19e7908d19bd194493aThomas Graf -DASAN_UAR=0 2344d362409d5469aed47d19e7908d19bd194493aThomas Graf -Wall 2444d362409d5469aed47d19e7908d19bd194493aThomas Graf -Wno-format 2544d362409d5469aed47d19e7908d19bd194493aThomas Graf -fvisibility=hidden 2644d362409d5469aed47d19e7908d19bd194493aThomas Graf -g 2744d362409d5469aed47d19e7908d19bd194493aThomas Graf -O2 2844d362409d5469aed47d19e7908d19bd194493aThomas Graf) 2944d362409d5469aed47d19e7908d19bd194493aThomas Graf# Support 64-bit and 32-bit builds. 3044d362409d5469aed47d19e7908d19bd194493aThomas Grafif(LLVM_BUILD_32_BITS) 3144d362409d5469aed47d19e7908d19bd194493aThomas Graf list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -m32) 3244d362409d5469aed47d19e7908d19bd194493aThomas Grafelse() 3344d362409d5469aed47d19e7908d19bd194493aThomas Graf list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -m64) 3444d362409d5469aed47d19e7908d19bd194493aThomas Grafendif() 3544d362409d5469aed47d19e7908d19bd194493aThomas Graf 3644d362409d5469aed47d19e7908d19bd194493aThomas Grafset(ASAN_GTEST_INCLUDE_CFLAGS 3744d362409d5469aed47d19e7908d19bd194493aThomas Graf -I${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include 3844d362409d5469aed47d19e7908d19bd194493aThomas Graf -I${LLVM_MAIN_SRC_DIR}/include 3944d362409d5469aed47d19e7908d19bd194493aThomas Graf -I${LLVM_BINARY_DIR}/include 4044d362409d5469aed47d19e7908d19bd194493aThomas Graf -D__STDC_CONSTANT_MACROS 4144d362409d5469aed47d19e7908d19bd194493aThomas Graf -D__STDC_LIMIT_MACROS 4244d362409d5469aed47d19e7908d19bd194493aThomas Graf) 4344d362409d5469aed47d19e7908d19bd194493aThomas Graf 4444d362409d5469aed47d19e7908d19bd194493aThomas Grafset(ASAN_UNITTEST_INSTRUMENTED_CFLAGS 4544d362409d5469aed47d19e7908d19bd194493aThomas Graf ${ASAN_UNITTEST_COMMON_CFLAGS} 4644d362409d5469aed47d19e7908d19bd194493aThomas Graf ${ASAN_GTEST_INCLUDE_CFLAGS} 4744d362409d5469aed47d19e7908d19bd194493aThomas Graf -faddress-sanitizer 4844d362409d5469aed47d19e7908d19bd194493aThomas Graf -mllvm "-asan-blacklist=${CMAKE_CURRENT_SOURCE_DIR}/asan_test.ignore" 4944d362409d5469aed47d19e7908d19bd194493aThomas Graf) 5044d362409d5469aed47d19e7908d19bd194493aThomas Graf 5144d362409d5469aed47d19e7908d19bd194493aThomas Grafadd_custom_target(AsanUnitTests) 5244d362409d5469aed47d19e7908d19bd194493aThomas Grafset_target_properties(AsanUnitTests PROPERTIES FOLDER "ASan unit tests") 5344d362409d5469aed47d19e7908d19bd194493aThomas Graffunction(add_asan_test testname) 5444d362409d5469aed47d19e7908d19bd194493aThomas Graf add_unittest(AsanUnitTests ${testname} ${ARGN}) 5544d362409d5469aed47d19e7908d19bd194493aThomas Graf if (APPLE) 5644d362409d5469aed47d19e7908d19bd194493aThomas Graf # Darwin-specific linker flags. 5744d362409d5469aed47d19e7908d19bd194493aThomas Graf set_property(TARGET ${testname} APPEND PROPERTY 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf LINK_FLAGS "-framework Foundation") 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf target_link_libraries(${testname} clang_rt.asan_osx) 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf elseif (UNIX) 6144d362409d5469aed47d19e7908d19bd194493aThomas Graf # Linux-specific linker flags. 6244d362409d5469aed47d19e7908d19bd194493aThomas Graf set_property(TARGET ${testname} APPEND PROPERTY 6344d362409d5469aed47d19e7908d19bd194493aThomas Graf LINK_FLAGS "-lpthread -ldl -rdynamic") 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf if(LLVM_BUILD_32_BITS) 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf target_link_libraries(${testname} clang_rt.asan-i386) 6644d362409d5469aed47d19e7908d19bd194493aThomas Graf else() 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf target_link_libraries(${testname} clang_rt.asan-x86_64) 6844d362409d5469aed47d19e7908d19bd194493aThomas Graf endif() 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf endif() 7044d362409d5469aed47d19e7908d19bd194493aThomas Graf set(add_compile_flags "") 7144d362409d5469aed47d19e7908d19bd194493aThomas Graf get_property(compile_flags TARGET ${testname} PROPERTY COMPILE_FLAGS) 7244d362409d5469aed47d19e7908d19bd194493aThomas Graf foreach(arg ${ASAN_UNITTEST_COMMON_CFLAGS}) 7344d362409d5469aed47d19e7908d19bd194493aThomas Graf set(add_compile_flags "${add_compile_flags} ${arg}") 7444d362409d5469aed47d19e7908d19bd194493aThomas Graf endforeach(arg ${ASAN_UNITTEST_COMMON_CFLAGS}) 7544d362409d5469aed47d19e7908d19bd194493aThomas Graf set_property(TARGET ${testname} PROPERTY COMPILE_FLAGS 7644d362409d5469aed47d19e7908d19bd194493aThomas Graf "${compile_flags} ${add_compile_flags}") 7744d362409d5469aed47d19e7908d19bd194493aThomas Grafendfunction() 7844d362409d5469aed47d19e7908d19bd194493aThomas Graf 7944d362409d5469aed47d19e7908d19bd194493aThomas Grafset(ASAN_NOINST_TEST_SOURCES 8044d362409d5469aed47d19e7908d19bd194493aThomas Graf asan_noinst_test.cc 811155370f520cb64657e25153255cf7dc1424317fThomas Graf asan_break_optimization.cc 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf) 8344d362409d5469aed47d19e7908d19bd194493aThomas Graf 8444d362409d5469aed47d19e7908d19bd194493aThomas Grafset(ASAN_INST_TEST_OBJECTS) 8544d362409d5469aed47d19e7908d19bd194493aThomas Graf 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf# We only support building instrumented tests when we're not cross compiling 8744d362409d5469aed47d19e7908d19bd194493aThomas Graf# and targeting a unix-like system where we can predict viable compilation and 8844d362409d5469aed47d19e7908d19bd194493aThomas Graf# linking strategies. 8944d362409d5469aed47d19e7908d19bd194493aThomas Grafif("${CMAKE_HOST_SYSTEM}" STREQUAL "${CMAKE_SYSTEM}" AND UNIX) 9044d362409d5469aed47d19e7908d19bd194493aThomas Graf 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf # This function is a custom routine to manage manually compiling source files 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf # for unit tests with the just-built Clang binary, using the ASan 9344d362409d5469aed47d19e7908d19bd194493aThomas Graf # instrumentation, and linking them into a test executable. 9444d362409d5469aed47d19e7908d19bd194493aThomas Graf function(add_asan_compile_command source extra_cflags) 9544d362409d5469aed47d19e7908d19bd194493aThomas Graf set(output_obj "${source}.asan.o") 9644d362409d5469aed47d19e7908d19bd194493aThomas Graf add_custom_command( 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf OUTPUT ${output_obj} 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf COMMAND clang 9944d362409d5469aed47d19e7908d19bd194493aThomas Graf ${ASAN_UNITTEST_INSTRUMENTED_CFLAGS} 10044d362409d5469aed47d19e7908d19bd194493aThomas Graf ${extra_cflags} 10144d362409d5469aed47d19e7908d19bd194493aThomas Graf -c -o "${output_obj}" 10244d362409d5469aed47d19e7908d19bd194493aThomas Graf ${CMAKE_CURRENT_SOURCE_DIR}/${source} 10344d362409d5469aed47d19e7908d19bd194493aThomas Graf MAIN_DEPENDENCY ${source} 10444d362409d5469aed47d19e7908d19bd194493aThomas Graf DEPENDS clang ${ASAN_RUNTIME_LIBRARIES} ${ARGN} 10544d362409d5469aed47d19e7908d19bd194493aThomas Graf ) 10644d362409d5469aed47d19e7908d19bd194493aThomas Graf endfunction() 10744d362409d5469aed47d19e7908d19bd194493aThomas Graf 10844d362409d5469aed47d19e7908d19bd194493aThomas Graf add_asan_compile_command(asan_globals_test.cc "") 10944d362409d5469aed47d19e7908d19bd194493aThomas Graf add_asan_compile_command(asan_test.cc "") 11044d362409d5469aed47d19e7908d19bd194493aThomas Graf list(APPEND ASAN_INST_TEST_OBJECTS asan_globals_test.cc.asan.o 11144d362409d5469aed47d19e7908d19bd194493aThomas Graf asan_test.cc.asan.o) 11244d362409d5469aed47d19e7908d19bd194493aThomas Graf if (APPLE) 11344d362409d5469aed47d19e7908d19bd194493aThomas Graf add_asan_compile_command(asan_mac_test.mm "-ObjC") 11444d362409d5469aed47d19e7908d19bd194493aThomas Graf list(APPEND ASAN_INST_TEST_OBJECTS asan_mac_test.mm.asan.o) 1151155370f520cb64657e25153255cf7dc1424317fThomas Graf endif() 11644d362409d5469aed47d19e7908d19bd194493aThomas Graf 11744d362409d5469aed47d19e7908d19bd194493aThomas Grafendif() 11844d362409d5469aed47d19e7908d19bd194493aThomas Graf 11944d362409d5469aed47d19e7908d19bd194493aThomas Grafadd_asan_test(AsanTest ${ASAN_NOINST_TEST_SOURCES} 1201155370f520cb64657e25153255cf7dc1424317fThomas Graf ${ASAN_INST_TEST_OBJECTS}) 12144d362409d5469aed47d19e7908d19bd194493aThomas Graf