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