summaryrefslogtreecommitdiff
path: root/lib/interception/tests/CMakeLists.txt
blob: 5f40331049c5901d342d30d0d09fc2b8bc19c54f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
include(CompilerRTCompile)

filter_available_targets(INTERCEPTION_UNITTEST_SUPPORTED_ARCH x86_64 i386 mips64 mips64el)

set(INTERCEPTION_UNITTESTS
  interception_linux_test.cc
  interception_test_main.cc
  interception_win_test.cc
)

set(INTERCEPTION_TEST_HEADERS)

set(INTERCEPTION_TEST_CFLAGS_COMMON
  ${COMPILER_RT_UNITTEST_CFLAGS}
  ${COMPILER_RT_GTEST_CFLAGS}
  -I${COMPILER_RT_SOURCE_DIR}/include
  -I${COMPILER_RT_SOURCE_DIR}/lib
  -I${COMPILER_RT_SOURCE_DIR}/lib/interception
  -fno-rtti
  -O2
  -Werror=sign-compare
  -Wno-non-virtual-dtor)

# -gline-tables-only must be enough for these tests, so use it if possible.
if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
  list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gline-tables-only)
else()
  list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -g)
endif()
if(MSVC)
  list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gcodeview)
  list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON -Wl,-largeaddressaware)
endif()
list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON -g)

if(NOT MSVC)
  list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON --driver-mode=g++)
endif()

if(ANDROID)
  list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON -pie)
endif()

set(INTERCEPTION_TEST_LINK_LIBS)
append_list_if(COMPILER_RT_HAS_LIBLOG log INTERCEPTION_TEST_LINK_LIBS)
# NDK r10 requires -latomic almost always.
append_list_if(ANDROID atomic INTERCEPTION_TEST_LINK_LIBS)

append_list_if(COMPILER_RT_HAS_LIBDL -ldl INTERCEPTION_TEST_LINK_FLAGS_COMMON)
append_list_if(COMPILER_RT_HAS_LIBRT -lrt INTERCEPTION_TEST_LINK_FLAGS_COMMON)
append_list_if(COMPILER_RT_HAS_LIBPTHREAD -pthread INTERCEPTION_TEST_LINK_FLAGS_COMMON)
# x86_64 FreeBSD 9.2 additionally requires libc++ to build the tests. Also,
# 'libm' shall be specified explicitly to build i386 tests.
if(CMAKE_SYSTEM MATCHES "FreeBSD-9.2-RELEASE")
  list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON "-lc++ -lm")
endif()

include_directories(..)
include_directories(../..)

# Adds static library which contains interception object file
# (universal binary on Mac and arch-specific object files on Linux).
macro(add_interceptor_lib library)
  add_library(${library} STATIC ${ARGN})
  set_target_properties(${library} PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    FOLDER "Compiler-RT Runtime tests")
endmacro()

function(get_interception_lib_for_arch arch lib lib_name)
  if(APPLE)
    set(tgt_name "RTInterception.test.osx")
  else()
    set(tgt_name "RTInterception.test.${arch}")
  endif()
  set(${lib} "${tgt_name}" PARENT_SCOPE)
  set(${lib_name} $<TARGET_FILE:${tgt_name}> PARENT_SCOPE)
endfunction()

# Interception unit tests testsuite.
add_custom_target(InterceptionUnitTests)
set_target_properties(InterceptionUnitTests PROPERTIES
  FOLDER "Compiler-RT Tests")

# Adds interception tests for architecture.
macro(add_interception_tests_for_arch arch)
  get_target_flags_for_arch(${arch} TARGET_FLAGS)
  set(INTERCEPTION_TEST_SOURCES ${INTERCEPTION_UNITTESTS}
                             ${COMPILER_RT_GTEST_SOURCE})
  set(INTERCEPTION_TEST_COMPILE_DEPS ${INTERCEPTION_TEST_HEADERS})
  if(NOT COMPILER_RT_STANDALONE_BUILD)
    list(APPEND INTERCEPTION_TEST_COMPILE_DEPS gtest)
  endif()
  set(INTERCEPTION_TEST_OBJECTS)
  foreach(source ${INTERCEPTION_TEST_SOURCES})
    get_filename_component(basename ${source} NAME)
    set(output_obj "${CMAKE_CFG_RESOLVED_INTDIR}${basename}.${arch}.o")
    clang_compile(${output_obj} ${source}
                  CFLAGS ${INTERCEPTION_TEST_CFLAGS_COMMON} ${TARGET_FLAGS}
                  DEPS ${INTERCEPTION_TEST_COMPILE_DEPS})
    list(APPEND INTERCEPTION_TEST_OBJECTS ${output_obj})
  endforeach()
  get_interception_lib_for_arch(${arch} INTERCEPTION_COMMON_LIB
                                INTERCEPTION_COMMON_LIB_NAME)
  # Add unittest target.
  set(INTERCEPTION_TEST_NAME "Interception-${arch}-Test")
  add_compiler_rt_test(InterceptionUnitTests ${INTERCEPTION_TEST_NAME}
                       OBJECTS ${INTERCEPTION_TEST_OBJECTS}
                               ${INTERCEPTION_COMMON_LIB_NAME}
                       DEPS ${INTERCEPTION_TEST_OBJECTS} ${INTERCEPTION_COMMON_LIB}
                       LINK_FLAGS ${INTERCEPTION_TEST_LINK_FLAGS_COMMON}
                                  ${TARGET_FLAGS})
endmacro()

if(COMPILER_RT_CAN_EXECUTE_TESTS AND NOT ANDROID AND NOT APPLE)
  # We use just-built clang to build interception unittests, so we must
  # be sure that produced binaries would work.
  if(APPLE)
    add_interceptor_lib("RTInterception.test.osx"
                        $<TARGET_OBJECTS:RTInterception.osx>)
  else()
    foreach(arch ${INTERCEPTION_UNITTEST_SUPPORTED_ARCH})
      add_interceptor_lib("RTInterception.test.${arch}"
                          $<TARGET_OBJECTS:RTInterception.${arch}>)
    endforeach()
  endif()
  foreach(arch ${INTERCEPTION_UNITTEST_SUPPORTED_ARCH})
    add_interception_tests_for_arch(${arch})
  endforeach()
endif()