xref: /llvm-project/compiler-rt/lib/sanitizer_common/CMakeLists.txt (revision e10cb443a1ba30cd1368907df246e968b7508278)
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_platform_limits_freebsd.cpp
22  sanitizer_platform_limits_linux.cpp
23  sanitizer_platform_limits_netbsd.cpp
24  sanitizer_platform_limits_posix.cpp
25  sanitizer_platform_limits_solaris.cpp
26  sanitizer_posix.cpp
27  sanitizer_printf.cpp
28  sanitizer_procmaps_common.cpp
29  sanitizer_procmaps_bsd.cpp
30  sanitizer_procmaps_fuchsia.cpp
31  sanitizer_procmaps_linux.cpp
32  sanitizer_procmaps_mac.cpp
33  sanitizer_procmaps_solaris.cpp
34  sanitizer_range.cpp
35  sanitizer_solaris.cpp
36  sanitizer_stoptheworld_fuchsia.cpp
37  sanitizer_stoptheworld_mac.cpp
38  sanitizer_stoptheworld_win.cpp
39  sanitizer_suppressions.cpp
40  sanitizer_tls_get_addr.cpp
41  sanitizer_thread_arg_retval.cpp
42  sanitizer_thread_registry.cpp
43  sanitizer_type_traits.cpp
44  sanitizer_win.cpp
45  sanitizer_win_interception.cpp
46  )
47
48set(SANITIZER_SOURCES
49  ${SANITIZER_SOURCES_NOTERMINATION}
50  sanitizer_termination.cpp
51  )
52
53# Libc functions stubs. These sources should be linked instead of
54# SANITIZER_LIBCDEP_SOURCES when sanitizer_common library must not depend on
55# libc.
56set(SANITIZER_NOLIBC_SOURCES
57  sanitizer_common_nolibc.cpp
58  )
59
60set(SANITIZER_LIBCDEP_SOURCES
61  sanitizer_common_libcdep.cpp
62  sanitizer_allocator_checks.cpp
63  sanitizer_dl.cpp
64  sanitizer_linux_libcdep.cpp
65  sanitizer_mac_libcdep.cpp
66  sanitizer_posix_libcdep.cpp
67  sanitizer_stoptheworld_linux_libcdep.cpp
68  sanitizer_stoptheworld_netbsd_libcdep.cpp
69  )
70
71set(SANITIZER_COVERAGE_SOURCES
72  sancov_flags.cpp
73  sanitizer_coverage_fuchsia.cpp
74  sanitizer_coverage_libcdep_new.cpp
75  sanitizer_coverage_win_sections.cpp
76  )
77
78set(SANITIZER_SYMBOLIZER_SOURCES
79  sanitizer_allocator_report.cpp
80  sanitizer_chained_origin_depot.cpp
81  sanitizer_stack_store.cpp
82  sanitizer_stackdepot.cpp
83  sanitizer_stacktrace.cpp
84  sanitizer_stacktrace_libcdep.cpp
85  sanitizer_stacktrace_printer.cpp
86  sanitizer_stacktrace_sparc.cpp
87  sanitizer_symbolizer.cpp
88  sanitizer_symbolizer_libbacktrace.cpp
89  sanitizer_symbolizer_libcdep.cpp
90  sanitizer_symbolizer_mac.cpp
91  sanitizer_symbolizer_markup.cpp
92  sanitizer_symbolizer_markup_fuchsia.cpp
93  sanitizer_symbolizer_posix_libcdep.cpp
94  sanitizer_symbolizer_report.cpp
95  sanitizer_symbolizer_report_fuchsia.cpp
96  sanitizer_symbolizer_win.cpp
97  sanitizer_thread_history.cpp
98  sanitizer_unwind_linux_libcdep.cpp
99  sanitizer_unwind_fuchsia.cpp
100  sanitizer_unwind_win.cpp
101  )
102
103# Explicitly list all sanitizer_common headers. Not all of these are
104# included in sanitizer_common source files, but we need to depend on
105# headers when building our custom unit tests.
106set(SANITIZER_IMPL_HEADERS
107  sancov_flags.h
108  sancov_flags.inc
109  sanitizer_addrhashmap.h
110  sanitizer_allocator.h
111  sanitizer_allocator_checks.h
112  sanitizer_allocator_combined.h
113  sanitizer_allocator_dlsym.h
114  sanitizer_allocator_interface.h
115  sanitizer_allocator_internal.h
116  sanitizer_allocator_local_cache.h
117  sanitizer_allocator_primary32.h
118  sanitizer_allocator_primary64.h
119  sanitizer_allocator_report.h
120  sanitizer_allocator_secondary.h
121  sanitizer_allocator_size_class_map.h
122  sanitizer_allocator_stats.h
123  sanitizer_array_ref.h
124  sanitizer_asm.h
125  sanitizer_atomic.h
126  sanitizer_atomic_clang.h
127  sanitizer_atomic_msvc.h
128  sanitizer_bitvector.h
129  sanitizer_bvgraph.h
130  sanitizer_chained_origin_depot.h
131  sanitizer_common.h
132  sanitizer_common_interceptors.inc
133  sanitizer_common_interceptors_format.inc
134  sanitizer_common_interceptors_ioctl.inc
135  sanitizer_common_interceptors_memintrinsics.inc
136  sanitizer_common_interface.inc
137  sanitizer_common_interface_posix.inc
138  sanitizer_common_syscalls.inc
139  sanitizer_coverage_interface.inc
140  sanitizer_dbghelp.h
141  sanitizer_deadlock_detector.h
142  sanitizer_deadlock_detector_interface.h
143  sanitizer_dense_map.h
144  sanitizer_dense_map_info.h
145  sanitizer_dl.h
146  sanitizer_errno.h
147  sanitizer_errno_codes.h
148  sanitizer_file.h
149  sanitizer_flag_parser.h
150  sanitizer_flags.h
151  sanitizer_flags.inc
152  sanitizer_flat_map.h
153  sanitizer_fuchsia.h
154  sanitizer_getauxval.h
155  sanitizer_hash.h
156  sanitizer_interceptors_ioctl_netbsd.inc
157  sanitizer_interface_internal.h
158  sanitizer_internal_defs.h
159  sanitizer_leb128.h
160  sanitizer_lfstack.h
161  sanitizer_libc.h
162  sanitizer_libignore.h
163  sanitizer_linux.h
164  sanitizer_list.h
165  sanitizer_local_address_space_view.h
166  sanitizer_lzw.h
167  sanitizer_mac.h
168  sanitizer_malloc_mac.inc
169  sanitizer_mutex.h
170  sanitizer_placement_new.h
171  sanitizer_platform.h
172  sanitizer_platform_interceptors.h
173  sanitizer_platform_limits_netbsd.h
174  sanitizer_platform_limits_posix.h
175  sanitizer_platform_limits_solaris.h
176  sanitizer_posix.h
177  sanitizer_procmaps.h
178  sanitizer_ptrauth.h
179  sanitizer_quarantine.h
180  sanitizer_range.h
181  sanitizer_redefine_builtins.h
182  sanitizer_report_decorator.h
183  sanitizer_ring_buffer.h
184  sanitizer_signal_interceptors.inc
185  sanitizer_stack_store.h
186  sanitizer_stackdepot.h
187  sanitizer_stackdepotbase.h
188  sanitizer_stacktrace.h
189  sanitizer_stacktrace_printer.h
190  sanitizer_stoptheworld.h
191  sanitizer_suppressions.h
192  sanitizer_symbolizer.h
193  sanitizer_symbolizer_markup_constants.h
194  sanitizer_symbolizer_internal.h
195  sanitizer_symbolizer_libbacktrace.h
196  sanitizer_symbolizer_mac.h
197  sanitizer_symbolizer_markup.h
198  sanitizer_syscall_generic.inc
199  sanitizer_syscall_linux_aarch64.inc
200  sanitizer_syscall_linux_arm.inc
201  sanitizer_syscall_linux_x86_64.inc
202  sanitizer_syscall_linux_riscv64.inc
203  sanitizer_syscall_linux_loongarch64.inc
204  sanitizer_syscalls_netbsd.inc
205  sanitizer_thread_registry.h
206  sanitizer_thread_safety.h
207  sanitizer_tls_get_addr.h
208  sanitizer_vector.h
209  sanitizer_win.h
210  sanitizer_win_defs.h
211  sanitizer_win_interception.h
212  sanitizer_win_thunk_interception.h
213  )
214
215if(MSVC)
216  # asan on windows only supports the release dll version of the runtimes, in the interest of
217  # only having one asan dll to support/test. Having asan statically linked
218  # with the runtime might be possible, but it multiplies the number of scenerios to test.
219  # the program USING sanitizers can use whatever version of the runtime it wants to.
220  set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
221endif()
222
223include_directories(..)
224
225set(SANITIZER_COMMON_DEFINITIONS
226  HAVE_RPC_XDR_H=${HAVE_RPC_XDR_H})
227
228# note: L not I, this is nodefaultlibs for msvc
229append_list_if(MSVC /Zl SANITIZER_COMMON_CFLAGS)
230set(SANITIZER_CFLAGS ${SANITIZER_COMMON_CFLAGS})
231
232# Too many existing bugs, needs cleanup.
233append_list_if(COMPILER_RT_HAS_WNO_FORMAT -Wno-format SANITIZER_CFLAGS)
234
235append_rtti_flag(OFF SANITIZER_CFLAGS)
236
237append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=570
238               SANITIZER_CFLAGS)
239append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors
240               SANITIZER_CFLAGS)
241
242if(APPLE)
243  set(OS_OPTION OS ${SANITIZER_COMMON_SUPPORTED_OS})
244endif()
245
246add_compiler_rt_object_libraries(RTSanitizerCommon
247  ${OS_OPTION}
248  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
249  SOURCES ${SANITIZER_SOURCES}
250  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
251  CFLAGS ${SANITIZER_CFLAGS}
252  DEFS ${SANITIZER_COMMON_DEFINITIONS})
253add_compiler_rt_object_libraries(RTSanitizerCommonNoTermination
254  ${OS_OPTION}
255  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
256  SOURCES ${SANITIZER_SOURCES_NOTERMINATION}
257  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
258  CFLAGS ${SANITIZER_CFLAGS}
259  DEFS ${SANITIZER_COMMON_DEFINITIONS})
260add_compiler_rt_object_libraries(RTSanitizerCommonNoLibc
261  ${OS_OPTION}
262  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
263  SOURCES ${SANITIZER_NOLIBC_SOURCES}
264  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
265  CFLAGS ${SANITIZER_CFLAGS}
266  DEFS ${SANITIZER_COMMON_DEFINITIONS})
267add_compiler_rt_object_libraries(RTSanitizerCommonLibc
268  ${OS_OPTION}
269  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
270  SOURCES ${SANITIZER_LIBCDEP_SOURCES}
271  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
272  CFLAGS ${SANITIZER_CFLAGS}
273  DEFS ${SANITIZER_COMMON_DEFINITIONS})
274add_compiler_rt_object_libraries(RTSanitizerCommonCoverage
275  ${OS_OPTION}
276  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
277  SOURCES ${SANITIZER_COVERAGE_SOURCES}
278  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
279  CFLAGS ${SANITIZER_CFLAGS}
280  DEFS ${SANITIZER_COMMON_DEFINITIONS})
281add_compiler_rt_object_libraries(RTSanitizerCommonSymbolizer
282  ${OS_OPTION}
283  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
284  SOURCES ${SANITIZER_SYMBOLIZER_SOURCES}
285  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
286  CFLAGS ${SANITIZER_CFLAGS}
287  DEFS ${SANITIZER_COMMON_DEFINITIONS})
288
289set(SANITIZER_NO_WEAK_HOOKS_CFLAGS ${SANITIZER_CFLAGS})
290list(APPEND SANITIZER_NO_WEAK_HOOKS_CFLAGS "-DSANITIZER_SUPPORTS_WEAK_HOOKS=0")
291add_compiler_rt_object_libraries(RTSanitizerCommonNoHooks
292  ${OS_OPTION}
293  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
294  SOURCES ${SANITIZER_SOURCES}
295  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
296  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
297  DEFS ${SANITIZER_COMMON_DEFINITIONS})
298add_compiler_rt_object_libraries(RTSanitizerCommonLibcNoHooks
299  ${OS_OPTION}
300  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
301  SOURCES ${SANITIZER_LIBCDEP_SOURCES}
302  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
303  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
304  DEFS ${SANITIZER_COMMON_DEFINITIONS})
305add_compiler_rt_object_libraries(RTSanitizerCommonSymbolizerNoHooks
306  ${OS_OPTION}
307  ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
308  SOURCES ${SANITIZER_SYMBOLIZER_SOURCES}
309  ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
310  CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
311  DEFS ${SANITIZER_COMMON_DEFINITIONS})
312
313if(WIN32)
314  set(RUNTIME_THUNK_CFLAGS -DSANITIZER_DYNAMIC_RUNTIME_THUNK -DSANITIZER_STATIC_RUNTIME_THUNK)
315  append_list_if(MSVC /Zl RUNTIME_THUNK_CFLAGS)
316  add_compiler_rt_object_libraries(SanitizerRuntimeThunk
317    ${SANITIZER_COMMON_SUPPORTED_OS}
318    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
319    SOURCES
320      sanitizer_win_thunk_interception.cpp
321    CFLAGS ${SANITIZER_CFLAGS} ${RUNTIME_THUNK_CFLAGS}
322    DEFS ${SANITIZER_COMMON_DEFINITIONS})
323
324  add_compiler_rt_object_libraries(SancovRuntimeThunk
325    ${SANITIZER_COMMON_SUPPORTED_OS}
326    ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
327    SOURCES
328      sanitizer_coverage_win_runtime_thunk.cpp
329      sanitizer_coverage_win_sections.cpp
330    CFLAGS ${SANITIZER_CFLAGS} ${RUNTIME_THUNK_CFLAGS}
331    DEFS ${SANITIZER_COMMON_DEFINITIONS})
332endif()
333
334# Unit tests for common sanitizer runtime.
335if(COMPILER_RT_INCLUDE_TESTS)
336  add_subdirectory(tests)
337endif()
338
339
340foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH})
341  # Library implementing InternalSymbolizer. Empty by default.
342  add_library(RTSanitizerCommonSymbolizerInternal.${arch}
343              OBJECT IMPORTED GLOBAL)
344endforeach()
345
346if (COMPILER_RT_ENABLE_INTERNAL_SYMBOLIZER)
347  add_subdirectory(symbolizer)
348endif()
349