CMakeLists.txt revision cc8ed30ebfb4ff6f9d9c7e77760dd5c7841a1af8
1include(CompilerRTCompile)
2
3set(SANITIZER_UNITTESTS
4  sanitizer_allocator_test.cc
5  sanitizer_atomic_test.cc
6  sanitizer_common_test.cc
7  sanitizer_flags_test.cc
8  sanitizer_libc_test.cc
9  sanitizer_linux_test.cc
10  sanitizer_list_test.cc
11  sanitizer_mutex_test.cc
12  sanitizer_nolibc_test.cc
13  sanitizer_printf_test.cc
14  sanitizer_scanf_interceptor_test.cc
15  sanitizer_stackdepot_test.cc
16  sanitizer_stacktrace_test.cc
17  sanitizer_stoptheworld_test.cc
18  sanitizer_test_main.cc
19  sanitizer_thread_registry_test.cc
20  )
21
22set(SANITIZER_TEST_HEADERS)
23foreach(header ${SANITIZER_HEADERS})
24  list(APPEND SANITIZER_TEST_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../${header})
25endforeach()
26
27set(SANITIZER_TEST_CFLAGS_COMMON
28  ${COMPILER_RT_GTEST_INCLUDE_CFLAGS}
29  -I${COMPILER_RT_SOURCE_DIR}/include
30  -I${COMPILER_RT_SOURCE_DIR}/lib
31  -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common
32  -DGTEST_HAS_RTTI=0
33  -O2 -g -fno-rtti
34  -Wall -Werror -Werror=sign-compare)
35
36set(SANITIZER_TEST_LINK_FLAGS_COMMON
37  -lstdc++ -ldl)
38
39include_directories(..)
40include_directories(../..)
41
42# Adds static library which contains sanitizer_common object file
43# (universal binary on Mac and arch-specific object files on Linux).
44macro(add_sanitizer_common_lib library)
45  add_library(${library} STATIC ${ARGN})
46  set_target_properties(${library} PROPERTIES
47    ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
48endmacro()
49
50function(get_sanitizer_common_lib_for_arch arch lib lib_name)
51  if(APPLE)
52    set(tgt_name "RTSanitizerCommon.test.osx")
53  else()
54    set(tgt_name "RTSanitizerCommon.test.${arch}")
55  endif()
56  set(${lib} "${tgt_name}" PARENT_SCOPE)
57  set(${lib_name} "lib${tgt_name}.a" PARENT_SCOPE)
58endfunction()
59
60# Sanitizer_common unit tests testsuite.
61add_custom_target(SanitizerUnitTests)
62set_target_properties(SanitizerUnitTests PROPERTIES
63  FOLDER "Sanitizer unittests")
64
65# Adds sanitizer tests for architecture.
66macro(add_sanitizer_tests_for_arch arch)
67  get_target_flags_for_arch(${arch} TARGET_FLAGS)
68  set(SANITIZER_TEST_SOURCES ${SANITIZER_UNITTESTS}
69                             ${COMPILER_RT_GTEST_SOURCE})
70  set(SANITIZER_TEST_OBJECTS)
71  foreach(source ${SANITIZER_TEST_SOURCES})
72    get_filename_component(basename ${source} NAME)
73    set(output_obj "${basename}.${arch}.o")
74    clang_compile(${output_obj} ${source}
75                  CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS}
76                  DEPS gtest ${SANITIZER_RUNTIME_LIBRARIES}
77                       ${SANITIZER_TEST_HEADERS})
78    list(APPEND SANITIZER_TEST_OBJECTS ${output_obj})
79  endforeach()
80  get_sanitizer_common_lib_for_arch(${arch} SANITIZER_COMMON_LIB
81                                    SANITIZER_COMMON_LIB_NAME)
82  # Add unittest target.
83  set(SANITIZER_TEST_NAME "Sanitizer-${arch}-Test")
84  add_compiler_rt_test(SanitizerUnitTests ${SANITIZER_TEST_NAME}
85                       OBJECTS ${SANITIZER_TEST_OBJECTS}
86                               ${SANITIZER_COMMON_LIB_NAME}
87                       DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB}
88                       LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON}
89                                  -lpthread ${TARGET_FLAGS})
90
91  if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64")
92    # Test that the libc-independent part of sanitizer_common is indeed
93    # independent of libc, by linking this binary without libc (here) and
94    # executing it (unit test in sanitizer_nolibc_test.cc).
95    clang_compile(sanitizer_nolibc_test_main.${arch}.o
96                  sanitizer_nolibc_test_main.cc
97                  CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS}
98                  DEPS ${SANITIZER_RUNTIME_LIBRARIES} ${SANITIZER_TEST_HEADERS})
99    add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc"
100                         OBJECTS sanitizer_nolibc_test_main.${arch}.o
101                                 -Wl,-whole-archive
102                                 libRTSanitizerCommon.test.nolibc.${arch}.a
103                                 -Wl,-no-whole-archive
104                         DEPS sanitizer_nolibc_test_main.${arch}.o
105                              RTSanitizerCommon.test.nolibc.${arch}
106                         LINK_FLAGS -nostdlib ${TARGET_FLAGS})
107  endif()
108endmacro()
109
110if(COMPILER_RT_CAN_EXECUTE_TESTS)
111  # We use just-built clang to build sanitizer_common unittests, so we must
112  # be sure that produced binaries would work.
113  if(APPLE)
114    add_sanitizer_common_lib("RTSanitizerCommon.test.osx"
115                             $<TARGET_OBJECTS:RTSanitizerCommon.osx>)
116  else()
117    if(CAN_TARGET_x86_64)
118      add_sanitizer_common_lib("RTSanitizerCommon.test.x86_64"
119                               $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>
120                               $<TARGET_OBJECTS:RTSanitizerCommonLibc.x86_64>)
121      add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64"
122                               $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>)
123    endif()
124    if(CAN_TARGET_i386)
125      add_sanitizer_common_lib("RTSanitizerCommon.test.i386"
126                               $<TARGET_OBJECTS:RTSanitizerCommon.i386>
127                               $<TARGET_OBJECTS:RTSanitizerCommonLibc.i386>)
128    endif()
129  endif()
130  if(CAN_TARGET_x86_64)
131    add_sanitizer_tests_for_arch(x86_64)
132  endif()
133  if(CAN_TARGET_i386)
134    add_sanitizer_tests_for_arch(i386)
135  endif()
136
137  # Run unittests as a part of lit testsuite.
138  configure_lit_site_cfg(
139    ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in
140    ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
141    )
142
143  add_lit_testsuite(check-sanitizer "Running sanitizer library unittests"
144    ${CMAKE_CURRENT_BINARY_DIR}
145    DEPENDS SanitizerUnitTests
146    )
147  set_target_properties(check-sanitizer PROPERTIES FOLDER "Sanitizer unittests")
148endif()
149
150if(ANDROID)
151  # We assume that unit tests on Android are built in a build
152  # tree with fresh Clang as a host compiler.
153  add_executable(SanitizerTest
154    ${SANITIZER_UNITTESTS}
155    ${COMPILER_RT_GTEST_SOURCE}
156    $<TARGET_OBJECTS:RTSanitizerCommon.arm.android>)
157  set_target_compile_flags(SanitizerTest
158    ${SANITIZER_COMMON_CFLAGS}
159    ${SANITIZER_TEST_CFLAGS_COMMON})
160  # Setup correct output directory and link flags.
161  set_target_properties(SanitizerTest PROPERTIES
162    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
163  set_target_link_flags(SanitizerTest ${SANITIZER_TEST_LINK_FLAGS_COMMON})
164  # Add unit test to test suite.
165  add_dependencies(SanitizerUnitTests SanitizerTest)
166endif()
167