1# Build system for the common Sanitizer runtime support library components.
2# These components are shared between AddressSanitizer and ThreadSanitizer.
3
4set(SANITIZER_SOURCES_NOTERMINATION
5  sanitizer_allocator.cpp
6  sanitizer_common.cpp
7  sanitizer_deadlock_detector1.cpp
8  sanitizer_deadlock_detector2.cpp
9  sanitizer_errno.cpp
10  sanitizer_file.cpp
11  sanitizer_flags.cpp
12  sanitizer_flag_parser.cpp
13  sanitizer_fuchsia.cpp
14  sanitizer_libc.cpp
15  sanitizer_libignore.cpp
16  sanitizer_linux.cpp
17  sanitizer_linux_s390.cpp
18  sanitizer_mac.cpp
19  sanitizer_netbsd.cpp
20  sanitizer_openbsd.cpp
21  sanitizer_persistent_allocator.cpp
22  sanitizer_platform_limits_freebsd.cpp
23  sanitizer_platform_limits_linux.cpp
24  sanitizer_platform_limits_netbsd.cpp
25  sanitizer_platform_limits_openbsd.cpp
26  sanitizer_platform_limits_posix.cpp
27  sanitizer_platform_limits_solaris.cpp
28  sanitizer_posix.cpp
29  sanitizer_printf.cpp
30  sanitizer_procmaps_common.cpp
31  sanitizer_procmaps_bsd.cpp
32  sanitizer_procmaps_fuchsia.cpp
33  sanitizer_procmaps_linux.cpp
34  sanitizer_procmaps_mac.cpp
35  sanitizer_procmaps_solaris.cpp
36  sanitizer_rtems.cpp
37  sanitizer_solaris.cpp
38  sanitizer_stoptheworld_fuchsia.cpp
39  sanitizer_stoptheworld_mac.cpp
40  sanitizer_suppressions.cpp
41  sanitizer_tls_get_addr.cpp
42  sanitizer_thread_registry.cpp
43  sanitizer_type_traits.cpp
44  sanitizer_win.cpp
45  )
46
47set(SANITIZER_SOURCES
48  ${SANITIZER_SOURCES_NOTERMINATION}
49  sanitizer_termination.cpp
50  )
51
52# Libc functions stubs. These sources should be linked instead of
53# SANITIZER_LIBCDEP_SOURCES when sanitizer_common library must not depend on
54# libc.
55set(SANITIZER_NOLIBC_SOURCES
56  sanitizer_common_nolibc.cpp
57  )
58
59set(SANITIZER_LIBCDEP_SOURCES
60  sanitizer_common_libcdep.cpp
61  sanitizer_allocator_checks.cpp
62  sanitizer_linux_libcdep.cpp
63  sanitizer_mac_libcdep.cpp
64  sanitizer_posix_libcdep.cpp
65  sanitizer_stoptheworld_linux_libcdep.cpp
66  sanitizer_stoptheworld_netbsd_libcdep.cpp
67  )
68
69set(SANITIZER_COVERAGE_SOURCES
70  sancov_flags.cpp
71  sanitizer_coverage_fuchsia.cpp
72  sanitizer_coverage_libcdep_new.cpp
73  sanitizer_coverage_win_sections.cpp
74  )
75
76set(SANITIZER_SYMBOLIZER_SOURCES
77  sanitizer_allocator_report.cpp
78  sanitizer_stackdepot.cpp
79  sanitizer_stacktrace.cpp
80  sanitizer_stacktrace_libcdep.cpp
81  sanitizer_stacktrace_printer.cpp
82  sanitizer_stacktrace_sparc.cpp
83  sanitizer_symbolizer.cpp
84  sanitizer_symbolizer_libbacktrace.cpp
85  sanitizer_symbolizer_libcdep.cpp
86  sanitizer_symbolizer_mac.cpp
87  sanitizer_symbolizer_markup.cpp
88  sanitizer_symbolizer_posix_libcdep.cpp
89  sanitizer_symbolizer_report.cpp
90  sanitizer_symbolizer_win.cpp
91  sanitizer_unwind_linux_libcdep.cpp
92  sanitizer_unwind_win.cpp
93  )
94
95# Explicitly list all sanitizer_common headers. Not all of these are
96# included in sanitizer_common source files, but we need to depend on
97# headers when building our custom unit tests.
98set(SANITIZER_IMPL_HEADERS
99  sancov_flags.h
100  sancov_flags.inc
101  sanitizer_addrhashmap.h
102  sanitizer_allocator.h
103  sanitizer_allocator_bytemap.h
104  sanitizer_allocator_checks.h
105  sanitizer_allocator_combined.h
106  sanitizer_allocator_interface.h
107  sanitizer_allocator_internal.h
108  sanitizer_allocator_local_cache.h
109  sanitizer_allocator_primary32.h
110  sanitizer_allocator_primary64.h
111  sanitizer_allocator_report.h
112  sanitizer_allocator_secondary.h
113  sanitizer_allocator_size_class_map.h
114  sanitizer_allocator_stats.h
115  sanitizer_asm.h
116  sanitizer_atomic.h
117  sanitizer_atomic_clang.h
118  sanitizer_atomic_clang_mips.h
119  sanitizer_atomic_clang_other.h
120  sanitizer_atomic_clang_x86.h
121  sanitizer_atomic_msvc.h
122  sanitizer_bitvector.h
123  sanitizer_bvgraph.h
124  sanitizer_common.h
125  sanitizer_common_interceptors.inc
126  sanitizer_common_interceptors_format.inc
127  sanitizer_common_interceptors_ioctl.inc
128  sanitizer_common_interface.inc
129  sanitizer_common_interface_posix.inc
130  sanitizer_common_syscalls.inc
131  sanitizer_coverage_interface.inc
132  sanitizer_dbghelp.h
133  sanitizer_deadlock_detector.h
134  sanitizer_deadlock_detector_interface.h
135  sanitizer_errno.h
136  sanitizer_errno_codes.h
137  sanitizer_file.h
138  sanitizer_flag_parser.h
139  sanitizer_flags.h
140  sanitizer_flags.inc
141  sanitizer_freebsd.h
142  sanitizer_fuchsia.h
143  sanitizer_getauxval.h
144  sanitizer_hash.h
145  sanitizer_interceptors_ioctl_netbsd.inc
146  sanitizer_interface_internal.h
147  sanitizer_internal_defs.h
148  sanitizer_lfstack.h
149  sanitizer_libc.h
150  sanitizer_libignore.h
151  sanitizer_linux.h
152  sanitizer_list.h
153  sanitizer_local_address_space_view.h
154  sanitizer_mac.h
155  sanitizer_malloc_mac.inc
156  sanitizer_mutex.h
157  sanitizer_persistent_allocator.h
158  sanitizer_placement_new.h
159  sanitizer_platform.h
160  sanitizer_platform_interceptors.h
161  sanitizer_platform_limits_netbsd.h
162  sanitizer_platform_limits_openbsd.h
163  sanitizer_platform_limits_posix.h
164  sanitizer_platform_limits_solaris.h
165  sanitizer_posix.h
166  sanitizer_procmaps.h
167  sanitizer_ptrauth.h
168  sanitizer_quarantine.h
169  sanitizer_report_decorator.h
170  sanitizer_ring_buffer.h
171  sanitizer_rtems.h
172  sanitizer_signal_interceptors.inc
173  sanitizer_stackdepot.h
174  sanitizer_stackdepotbase.h
175  sanitizer_stacktrace.h
176  sanitizer_stacktrace_printer.h
177  sanitizer_stoptheworld.h
178  sanitizer_suppressions.h
179  sanitizer_symbolizer.h
180  sanitizer_symbolizer_fuchsia.h
181  sanitizer_symbolizer_internal.h
182  sanitizer_symbolizer_libbacktrace.h
183  sanitizer_symbolizer_mac.h
184  sanitizer_symbolizer_rtems.h
185  sanitizer_syscall_generic.inc
186  sanitizer_syscall_linux_aarch64.inc
187  sanitizer_syscall_linux_arm.inc
188  sanitizer_syscall_linux_x86_64.inc
189  sanitizer_syscalls_netbsd.inc
190  sanitizer_thread_registry.h
191  sanitizer_tls_get_addr.h
192  sanitizer_vector.h
193  sanitizer_win.h
194  sanitizer_win_defs.h
195  sanitizer_win_dll_thunk.h
196  sanitizer_win_weak_interception.h
197  )
198
199include_directories(..)
200
201set(SANITIZER_COMMON_DEFINITIONS
202  HAVE_RPC_XDR_H=${HAVE_RPC_XDR_H})
203
204set(SANITIZER_CFLAGS ${SANITIZER_COMMON_CFLAGS})
205append_rtti_flag(OFF SANITIZER_CFLAGS)
206
207append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=570
208               SANITIZER_CFLAGS)
209append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors
210               SANITIZER_CFLAGS)
211
212if(APPLE)
213  set(OS_OPTION OS ${SANITIZER_COMMON_SUPPORTED_OS})
214endif()
215
216add_compiler_rt_object_libraries(RTSanitizerCommon
217  ${OS_OPTION}
218  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
219  SOURCES ${SANITIZER_SOURCES}
220  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
221  CFLAGS ${SANITIZER_CFLAGS}
222  DEFS ${SANITIZER_COMMON_DEFINITIONS})
223add_compiler_rt_object_libraries(RTSanitizerCommonNoTermination
224  ${OS_OPTION}
225  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
226  SOURCES ${SANITIZER_SOURCES_NOTERMINATION}
227  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
228  CFLAGS ${SANITIZER_CFLAGS}
229  DEFS ${SANITIZER_COMMON_DEFINITIONS})
230add_compiler_rt_object_libraries(RTSanitizerCommonNoLibc
231  ${OS_OPTION}
232  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
233  SOURCES ${SANITIZER_NOLIBC_SOURCES}
234  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
235  CFLAGS ${SANITIZER_CFLAGS}
236  DEFS ${SANITIZER_COMMON_DEFINITIONS})
237add_compiler_rt_object_libraries(RTSanitizerCommonLibc
238  ${OS_OPTION}
239  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
240  SOURCES ${SANITIZER_LIBCDEP_SOURCES}
241  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
242  CFLAGS ${SANITIZER_CFLAGS}
243  DEFS ${SANITIZER_COMMON_DEFINITIONS})
244add_compiler_rt_object_libraries(RTSanitizerCommonCoverage
245  ${OS_OPTION}
246  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
247  SOURCES ${SANITIZER_COVERAGE_SOURCES}
248  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
249  CFLAGS ${SANITIZER_CFLAGS}
250  DEFS ${SANITIZER_COMMON_DEFINITIONS})
251add_compiler_rt_object_libraries(RTSanitizerCommonSymbolizer
252  ${OS_OPTION}
253  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
254  SOURCES ${SANITIZER_SYMBOLIZER_SOURCES}
255  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
256  CFLAGS ${SANITIZER_CFLAGS}
257  DEFS ${SANITIZER_COMMON_DEFINITIONS})
258
259set(SANITIZER_NO_WEAK_HOOKS_CFLAGS ${SANITIZER_CFLAGS})
260list(APPEND SANITIZER_NO_WEAK_HOOKS_CFLAGS "-DSANITIZER_SUPPORTS_WEAK_HOOKS=0")
261add_compiler_rt_object_libraries(RTSanitizerCommonNoHooks
262  ${OS_OPTION}
263  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
264  SOURCES ${SANITIZER_SOURCES}
265  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
266  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
267  DEFS ${SANITIZER_COMMON_DEFINITIONS})
268add_compiler_rt_object_libraries(RTSanitizerCommonLibcNoHooks
269  ${OS_OPTION}
270  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
271  SOURCES ${SANITIZER_LIBCDEP_SOURCES}
272  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
273  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
274  DEFS ${SANITIZER_COMMON_DEFINITIONS})
275add_compiler_rt_object_libraries(RTSanitizerCommonSymbolizerNoHooks
276  ${OS_OPTION}
277  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
278  SOURCES ${SANITIZER_SYMBOLIZER_SOURCES}
279  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
280  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
281  DEFS ${SANITIZER_COMMON_DEFINITIONS})
282
283if(WIN32)
284  add_compiler_rt_object_libraries(SanitizerCommonWeakInterception
285    ${SANITIZER_COMMON_SUPPORTED_OS}
286    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
287    SOURCES sanitizer_win_weak_interception.cpp
288    CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DYNAMIC
289    DEFS ${SANITIZER_COMMON_DEFINITIONS})
290  add_compiler_rt_object_libraries(SancovWeakInterception
291    ${SANITIZER_COMMON_SUPPORTED_OS}
292    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
293    SOURCES sanitizer_coverage_win_weak_interception.cpp
294    CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DYNAMIC
295    DEFS ${SANITIZER_COMMON_DEFINITIONS})
296
297  add_compiler_rt_object_libraries(SanitizerCommonDllThunk
298    ${SANITIZER_COMMON_SUPPORTED_OS}
299    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
300    SOURCES sanitizer_win_dll_thunk.cpp
301    CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DLL_THUNK
302    DEFS ${SANITIZER_COMMON_DEFINITIONS})
303  add_compiler_rt_object_libraries(SancovDllThunk
304    ${SANITIZER_COMMON_SUPPORTED_OS}
305    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
306    SOURCES sanitizer_coverage_win_dll_thunk.cpp
307            sanitizer_coverage_win_sections.cpp
308    CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DLL_THUNK
309    DEFS ${SANITIZER_COMMON_DEFINITIONS})
310
311  set(DYNAMIC_RUNTIME_THUNK_CFLAGS "-DSANITIZER_DYNAMIC_RUNTIME_THUNK")
312  if(MSVC)
313    list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-Zl")
314  elseif(CMAKE_C_COMPILER_ID MATCHES Clang)
315    list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-nodefaultlibs")
316  endif()
317  add_compiler_rt_object_libraries(SanitizerCommonDynamicRuntimeThunk
318    ${SANITIZER_COMMON_SUPPORTED_OS}
319    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
320    SOURCES sanitizer_win_dynamic_runtime_thunk.cpp
321    CFLAGS ${SANITIZER_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS}
322    DEFS ${SANITIZER_COMMON_DEFINITIONS})
323  add_compiler_rt_object_libraries(SancovDynamicRuntimeThunk
324    ${SANITIZER_COMMON_SUPPORTED_OS}
325    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
326    SOURCES sanitizer_coverage_win_dynamic_runtime_thunk.cpp
327            sanitizer_coverage_win_sections.cpp
328    CFLAGS ${SANITIZER_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS}
329    DEFS ${SANITIZER_COMMON_DEFINITIONS})
330endif()
331
332# Unit tests for common sanitizer runtime.
333if(COMPILER_RT_INCLUDE_TESTS)
334  add_subdirectory(tests)
335endif()
336