1include(CompilerRTCompile) 2 3filter_available_targets(INTERCEPTION_UNITTEST_SUPPORTED_ARCH x86_64 i386 mips64 mips64el) 4 5set(INTERCEPTION_UNITTESTS 6 interception_linux_test.cpp 7 interception_linux_foreign_test.cpp 8 interception_test_main.cpp 9 interception_win_test.cpp 10 ) 11 12set(INTERCEPTION_TEST_HEADERS) 13 14set(INTERCEPTION_TEST_CFLAGS_COMMON 15 ${COMPILER_RT_UNITTEST_CFLAGS} 16 ${COMPILER_RT_GTEST_CFLAGS} 17 ${SANITIZER_TEST_CXX_CFLAGS} 18 -I${COMPILER_RT_SOURCE_DIR}/include 19 -I${COMPILER_RT_SOURCE_DIR}/lib 20 -I${COMPILER_RT_SOURCE_DIR}/lib/interception 21 -DSANITIZER_COMMON_NO_REDEFINE_BUILTINS 22 -fno-rtti 23 -fno-builtin-isdigit 24 -fno-builtin-isalpha 25 -fno-builtin-isalnum 26 -fno-builtin-islower 27 -O2 28 -Werror=sign-compare) 29 30set(INTERCEPTION_TEST_LINK_FLAGS_COMMON 31 ${COMPILER_RT_UNITTEST_LINK_FLAGS} 32 ${COMPILER_RT_UNWINDER_LINK_LIBS} 33 ${SANITIZER_TEST_CXX_LIBRARIES}) 34 35# -gline-tables-only must be enough for these tests, so use it if possible. 36if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang") 37 list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gline-tables-only) 38else() 39 list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -g) 40endif() 41if(MSVC) 42 list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gcodeview) 43 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON 44 -Wl,-largeaddressaware 45 -Wl,-nodefaultlib:libcmt,-defaultlib:msvcrt,-defaultlib:oldnames 46 ) 47endif() 48if(MINGW) 49 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON 50 -Wl,--large-address-aware 51 ) 52endif() 53list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON -g) 54 55if(NOT MSVC) 56 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON --driver-mode=g++) 57endif() 58 59if(ANDROID) 60 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON -pie) 61endif() 62 63set(INTERCEPTION_TEST_LINK_LIBS) 64append_list_if(COMPILER_RT_HAS_LIBLOG log INTERCEPTION_TEST_LINK_LIBS) 65 66append_list_if(COMPILER_RT_HAS_LIBDL -ldl INTERCEPTION_TEST_LINK_FLAGS_COMMON) 67append_list_if(COMPILER_RT_HAS_LIBRT -lrt INTERCEPTION_TEST_LINK_FLAGS_COMMON) 68append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread INTERCEPTION_TEST_LINK_FLAGS_COMMON) 69# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. Also, 70# 'libm' shall be specified explicitly to build i386 tests. 71if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE") 72 list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON "-lc++ -lm") 73endif() 74 75include_directories(..) 76include_directories(../..) 77 78# Adds static library which contains interception object file 79# (universal binary on Mac and arch-specific object files on Linux). 80macro(add_interceptor_lib library) 81 add_library(${library} STATIC ${ARGN}) 82 set_target_properties(${library} PROPERTIES 83 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 84 FOLDER "Compiler-RT/Tests/Runtime") 85endmacro() 86 87function(get_interception_lib_for_arch arch lib) 88 if(APPLE) 89 set(tgt_name "RTInterception.test.osx") 90 else() 91 set(tgt_name "RTInterception.test.${arch}") 92 endif() 93 set(${lib} "${tgt_name}" PARENT_SCOPE) 94endfunction() 95 96# Interception unit tests testsuite. 97add_custom_target(InterceptionUnitTests) 98set_target_properties(InterceptionUnitTests PROPERTIES 99 FOLDER "Compiler-RT/Tests") 100 101# Adds interception tests for architecture. 102macro(add_interception_tests_for_arch arch) 103 set(INTERCEPTION_TEST_OBJECTS) 104 get_interception_lib_for_arch(${arch} INTERCEPTION_COMMON_LIB) 105 generate_compiler_rt_tests(INTERCEPTION_TEST_OBJECTS 106 InterceptionUnitTests "Interception-${arch}-Test" ${arch} 107 RUNTIME ${INTERCEPTION_COMMON_LIB} 108 SOURCES ${INTERCEPTION_UNITTESTS} ${COMPILER_RT_GTEST_SOURCE} 109 COMPILE_DEPS ${INTERCEPTION_TEST_HEADERS} 110 CFLAGS ${INTERCEPTION_TEST_CFLAGS_COMMON} 111 LINK_FLAGS ${INTERCEPTION_TEST_LINK_FLAGS_COMMON}) 112endmacro() 113 114if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID AND NOT APPLE) 115 # We use just-built clang to build interception unittests, so we must 116 # be sure that produced binaries would work. 117 if(APPLE) 118 add_interceptor_lib("RTInterception.test.osx" 119 $<TARGET_OBJECTS:RTInterception.osx>) 120 else() 121 foreach(arch ${INTERCEPTION_UNITTEST_SUPPORTED_ARCH}) 122 add_interceptor_lib("RTInterception.test.${arch}" 123 $<TARGET_OBJECTS:RTInterception.${arch}>) 124 endforeach() 125 endif() 126 foreach(arch ${INTERCEPTION_UNITTEST_SUPPORTED_ARCH}) 127 add_interception_tests_for_arch(${arch}) 128 endforeach() 129endif() 130