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_mutex.cpp
20  sanitizer_netbsd.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_posix.cpp
26  sanitizer_platform_limits_solaris.cpp
27  sanitizer_posix.cpp
28  sanitizer_printf.cpp
29  sanitizer_procmaps_common.cpp
30  sanitizer_procmaps_bsd.cpp
31  sanitizer_procmaps_fuchsia.cpp
32  sanitizer_procmaps_linux.cpp
33  sanitizer_procmaps_mac.cpp
34  sanitizer_procmaps_solaris.cpp
35  sanitizer_solaris.cpp
36  sanitizer_stoptheworld_fuchsia.cpp
37  sanitizer_stoptheworld_mac.cpp
38  sanitizer_suppressions.cpp
39  sanitizer_tls_get_addr.cpp
40  sanitizer_thread_registry.cpp
41  sanitizer_type_traits.cpp
42  sanitizer_win.cpp
43  )
44
45set(SANITIZER_SOURCES
46  ${SANITIZER_SOURCES_NOTERMINATION}
47  sanitizer_termination.cpp
48  )
49
50# Libc functions stubs. These sources should be linked instead of
51# SANITIZER_LIBCDEP_SOURCES when sanitizer_common library must not depend on
52# libc.
53set(SANITIZER_NOLIBC_SOURCES
54  sanitizer_common_nolibc.cpp
55  )
56
57set(SANITIZER_LIBCDEP_SOURCES
58  sanitizer_common_libcdep.cpp
59  sanitizer_allocator_checks.cpp
60  sanitizer_linux_libcdep.cpp
61  sanitizer_mac_libcdep.cpp
62  sanitizer_posix_libcdep.cpp
63  sanitizer_stoptheworld_linux_libcdep.cpp
64  sanitizer_stoptheworld_netbsd_libcdep.cpp
65  )
66
67set(SANITIZER_COVERAGE_SOURCES
68  sancov_flags.cpp
69  sanitizer_coverage_fuchsia.cpp
70  sanitizer_coverage_libcdep_new.cpp
71  sanitizer_coverage_win_sections.cpp
72  )
73
74set(SANITIZER_SYMBOLIZER_SOURCES
75  sanitizer_allocator_report.cpp
76  sanitizer_chained_origin_depot.cpp
77  sanitizer_stackdepot.cpp
78  sanitizer_stacktrace.cpp
79  sanitizer_stacktrace_libcdep.cpp
80  sanitizer_stacktrace_printer.cpp
81  sanitizer_stacktrace_sparc.cpp
82  sanitizer_symbolizer.cpp
83  sanitizer_symbolizer_libbacktrace.cpp
84  sanitizer_symbolizer_libcdep.cpp
85  sanitizer_symbolizer_mac.cpp
86  sanitizer_symbolizer_markup.cpp
87  sanitizer_symbolizer_posix_libcdep.cpp
88  sanitizer_symbolizer_report.cpp
89  sanitizer_symbolizer_win.cpp
90  sanitizer_unwind_linux_libcdep.cpp
91  sanitizer_unwind_win.cpp
92  )
93
94# Explicitly list all sanitizer_common headers. Not all of these are
95# included in sanitizer_common source files, but we need to depend on
96# headers when building our custom unit tests.
97set(SANITIZER_IMPL_HEADERS
98  sancov_flags.h
99  sancov_flags.inc
100  sanitizer_addrhashmap.h
101  sanitizer_allocator.h
102  sanitizer_allocator_bytemap.h
103  sanitizer_allocator_checks.h
104  sanitizer_allocator_combined.h
105  sanitizer_allocator_interface.h
106  sanitizer_allocator_internal.h
107  sanitizer_allocator_local_cache.h
108  sanitizer_allocator_primary32.h
109  sanitizer_allocator_primary64.h
110  sanitizer_allocator_report.h
111  sanitizer_allocator_secondary.h
112  sanitizer_allocator_size_class_map.h
113  sanitizer_allocator_stats.h
114  sanitizer_asm.h
115  sanitizer_atomic.h
116  sanitizer_atomic_clang.h
117  sanitizer_atomic_clang_mips.h
118  sanitizer_atomic_clang_other.h
119  sanitizer_atomic_clang_x86.h
120  sanitizer_atomic_msvc.h
121  sanitizer_bitvector.h
122  sanitizer_bvgraph.h
123  sanitizer_chained_origin_depot.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_posix.h
163  sanitizer_platform_limits_solaris.h
164  sanitizer_posix.h
165  sanitizer_procmaps.h
166  sanitizer_ptrauth.h
167  sanitizer_quarantine.h
168  sanitizer_report_decorator.h
169  sanitizer_ring_buffer.h
170  sanitizer_signal_interceptors.inc
171  sanitizer_stackdepot.h
172  sanitizer_stackdepotbase.h
173  sanitizer_stacktrace.h
174  sanitizer_stacktrace_printer.h
175  sanitizer_stoptheworld.h
176  sanitizer_suppressions.h
177  sanitizer_symbolizer.h
178  sanitizer_symbolizer_fuchsia.h
179  sanitizer_symbolizer_internal.h
180  sanitizer_symbolizer_libbacktrace.h
181  sanitizer_symbolizer_mac.h
182  sanitizer_syscall_generic.inc
183  sanitizer_syscall_linux_aarch64.inc
184  sanitizer_syscall_linux_arm.inc
185  sanitizer_syscall_linux_x86_64.inc
186  sanitizer_syscall_linux_riscv64.inc
187  sanitizer_syscalls_netbsd.inc
188  sanitizer_thread_registry.h
189  sanitizer_thread_safety.h
190  sanitizer_tls_get_addr.h
191  sanitizer_vector.h
192  sanitizer_win.h
193  sanitizer_win_defs.h
194  sanitizer_win_dll_thunk.h
195  sanitizer_win_weak_interception.h
196  )
197
198include_directories(..)
199
200set(SANITIZER_COMMON_DEFINITIONS
201  HAVE_RPC_XDR_H=${HAVE_RPC_XDR_H})
202
203set(SANITIZER_CFLAGS ${SANITIZER_COMMON_CFLAGS})
204append_rtti_flag(OFF SANITIZER_CFLAGS)
205
206append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=570
207               SANITIZER_CFLAGS)
208append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors
209               SANITIZER_CFLAGS)
210
211if(APPLE)
212  set(OS_OPTION OS ${SANITIZER_COMMON_SUPPORTED_OS})
213endif()
214
215add_compiler_rt_object_libraries(RTSanitizerCommon
216  ${OS_OPTION}
217  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
218  SOURCES ${SANITIZER_SOURCES}
219  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
220  CFLAGS ${SANITIZER_CFLAGS}
221  DEFS ${SANITIZER_COMMON_DEFINITIONS})
222add_compiler_rt_object_libraries(RTSanitizerCommonNoTermination
223  ${OS_OPTION}
224  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
225  SOURCES ${SANITIZER_SOURCES_NOTERMINATION}
226  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
227  CFLAGS ${SANITIZER_CFLAGS}
228  DEFS ${SANITIZER_COMMON_DEFINITIONS})
229add_compiler_rt_object_libraries(RTSanitizerCommonNoLibc
230  ${OS_OPTION}
231  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
232  SOURCES ${SANITIZER_NOLIBC_SOURCES}
233  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
234  CFLAGS ${SANITIZER_CFLAGS}
235  DEFS ${SANITIZER_COMMON_DEFINITIONS})
236add_compiler_rt_object_libraries(RTSanitizerCommonLibc
237  ${OS_OPTION}
238  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
239  SOURCES ${SANITIZER_LIBCDEP_SOURCES}
240  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
241  CFLAGS ${SANITIZER_CFLAGS}
242  DEFS ${SANITIZER_COMMON_DEFINITIONS})
243add_compiler_rt_object_libraries(RTSanitizerCommonCoverage
244  ${OS_OPTION}
245  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
246  SOURCES ${SANITIZER_COVERAGE_SOURCES}
247  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
248  CFLAGS ${SANITIZER_CFLAGS}
249  DEFS ${SANITIZER_COMMON_DEFINITIONS})
250add_compiler_rt_object_libraries(RTSanitizerCommonSymbolizer
251  ${OS_OPTION}
252  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
253  SOURCES ${SANITIZER_SYMBOLIZER_SOURCES}
254  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
255  CFLAGS ${SANITIZER_CFLAGS}
256  DEFS ${SANITIZER_COMMON_DEFINITIONS})
257
258set(SANITIZER_NO_WEAK_HOOKS_CFLAGS ${SANITIZER_CFLAGS})
259list(APPEND SANITIZER_NO_WEAK_HOOKS_CFLAGS "-DSANITIZER_SUPPORTS_WEAK_HOOKS=0")
260add_compiler_rt_object_libraries(RTSanitizerCommonNoHooks
261  ${OS_OPTION}
262  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
263  SOURCES ${SANITIZER_SOURCES}
264  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
265  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
266  DEFS ${SANITIZER_COMMON_DEFINITIONS})
267add_compiler_rt_object_libraries(RTSanitizerCommonLibcNoHooks
268  ${OS_OPTION}
269  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
270  SOURCES ${SANITIZER_LIBCDEP_SOURCES}
271  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
272  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
273  DEFS ${SANITIZER_COMMON_DEFINITIONS})
274add_compiler_rt_object_libraries(RTSanitizerCommonSymbolizerNoHooks
275  ${OS_OPTION}
276  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
277  SOURCES ${SANITIZER_SYMBOLIZER_SOURCES}
278  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
279  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
280  DEFS ${SANITIZER_COMMON_DEFINITIONS})
281
282if(WIN32)
283  add_compiler_rt_object_libraries(SanitizerCommonWeakInterception
284    ${SANITIZER_COMMON_SUPPORTED_OS}
285    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
286    SOURCES sanitizer_win_weak_interception.cpp
287    CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DYNAMIC
288    DEFS ${SANITIZER_COMMON_DEFINITIONS})
289  add_compiler_rt_object_libraries(SancovWeakInterception
290    ${SANITIZER_COMMON_SUPPORTED_OS}
291    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
292    SOURCES sanitizer_coverage_win_weak_interception.cpp
293    CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DYNAMIC
294    DEFS ${SANITIZER_COMMON_DEFINITIONS})
295
296  add_compiler_rt_object_libraries(SanitizerCommonDllThunk
297    ${SANITIZER_COMMON_SUPPORTED_OS}
298    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
299    SOURCES sanitizer_win_dll_thunk.cpp
300    CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DLL_THUNK
301    DEFS ${SANITIZER_COMMON_DEFINITIONS})
302  add_compiler_rt_object_libraries(SancovDllThunk
303    ${SANITIZER_COMMON_SUPPORTED_OS}
304    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
305    SOURCES sanitizer_coverage_win_dll_thunk.cpp
306            sanitizer_coverage_win_sections.cpp
307    CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DLL_THUNK
308    DEFS ${SANITIZER_COMMON_DEFINITIONS})
309
310  set(DYNAMIC_RUNTIME_THUNK_CFLAGS "-DSANITIZER_DYNAMIC_RUNTIME_THUNK")
311  if(MSVC)
312    list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-Zl")
313  elseif(CMAKE_C_COMPILER_ID MATCHES Clang)
314    list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-nodefaultlibs")
315  endif()
316  add_compiler_rt_object_libraries(SanitizerCommonDynamicRuntimeThunk
317    ${SANITIZER_COMMON_SUPPORTED_OS}
318    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
319    SOURCES sanitizer_win_dynamic_runtime_thunk.cpp
320    CFLAGS ${SANITIZER_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS}
321    DEFS ${SANITIZER_COMMON_DEFINITIONS})
322  add_compiler_rt_object_libraries(SancovDynamicRuntimeThunk
323    ${SANITIZER_COMMON_SUPPORTED_OS}
324    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
325    SOURCES sanitizer_coverage_win_dynamic_runtime_thunk.cpp
326            sanitizer_coverage_win_sections.cpp
327    CFLAGS ${SANITIZER_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS}
328    DEFS ${SANITIZER_COMMON_DEFINITIONS})
329endif()
330
331# Unit tests for common sanitizer runtime.
332if(COMPILER_RT_INCLUDE_TESTS)
333  add_subdirectory(tests)
334endif()
335