1 # Build system for the common Sanitizer runtime support library components.
2 # These components are shared between AddressSanitizer and ThreadSanitizer.
4 set(SANITIZER_SOURCES_NOTERMINATION
7 sanitizer_deadlock_detector1.cc
8 sanitizer_deadlock_detector2.cc
12 sanitizer_flag_parser.cc
15 sanitizer_libignore.cc
17 sanitizer_linux_s390.cc
21 sanitizer_persistent_allocator.cc
22 sanitizer_platform_limits_freebsd.cc
23 sanitizer_platform_limits_linux.cc
24 sanitizer_platform_limits_netbsd.cc
25 sanitizer_platform_limits_openbsd.cc
26 sanitizer_platform_limits_posix.cc
27 sanitizer_platform_limits_solaris.cc
30 sanitizer_procmaps_common.cc
31 sanitizer_procmaps_bsd.cc
32 sanitizer_procmaps_linux.cc
33 sanitizer_procmaps_mac.cc
34 sanitizer_procmaps_solaris.cc
37 sanitizer_stoptheworld_mac.cc
38 sanitizer_suppressions.cc
39 sanitizer_tls_get_addr.cc
40 sanitizer_thread_registry.cc
41 sanitizer_type_traits.cc
44 if(UNIX AND NOT APPLE AND NOT OS_NAME MATCHES "SunOS")
45 list(APPEND SANITIZER_SOURCES_NOTERMINATION
46 sanitizer_linux_x86_64.S)
47 list(APPEND SANITIZER_SOURCES_NOTERMINATION
48 sanitizer_linux_mips64.S)
52 ${SANITIZER_SOURCES_NOTERMINATION} sanitizer_termination.cc)
54 # Libc functions stubs. These sources should be linked instead of
55 # SANITIZER_LIBCDEP_SOURCES when sanitizer_common library must not depend on
57 set(SANITIZER_NOLIBC_SOURCES
58 sanitizer_common_nolibc.cc)
60 set(SANITIZER_LIBCDEP_SOURCES
61 sanitizer_common_libcdep.cc
62 sanitizer_allocator_checks.cc
63 sanitizer_linux_libcdep.cc
64 sanitizer_mac_libcdep.cc
65 sanitizer_posix_libcdep.cc
66 sanitizer_stoptheworld_linux_libcdep.cc)
68 set(SANITIZER_COVERAGE_SOURCES
70 sanitizer_coverage_fuchsia.cc
71 sanitizer_coverage_libcdep_new.cc
72 sanitizer_coverage_win_sections.cc)
74 set(SANITIZER_SYMBOLIZER_SOURCES
75 sanitizer_allocator_report.cc
76 sanitizer_stackdepot.cc
77 sanitizer_stacktrace.cc
78 sanitizer_stacktrace_libcdep.cc
79 sanitizer_stacktrace_printer.cc
80 sanitizer_stacktrace_sparc.cc
81 sanitizer_symbolizer.cc
82 sanitizer_symbolizer_libbacktrace.cc
83 sanitizer_symbolizer_libcdep.cc
84 sanitizer_symbolizer_mac.cc
85 sanitizer_symbolizer_markup.cc
86 sanitizer_symbolizer_posix_libcdep.cc
87 sanitizer_symbolizer_report.cc
88 sanitizer_symbolizer_win.cc
89 sanitizer_unwind_linux_libcdep.cc
90 sanitizer_unwind_win.cc)
92 # Explicitly list all sanitizer_common headers. Not all of these are
93 # included in sanitizer_common source files, but we need to depend on
94 # headers when building our custom unit tests.
95 set(SANITIZER_IMPL_HEADERS
98 sanitizer_addrhashmap.h
100 sanitizer_allocator_bytemap.h
101 sanitizer_allocator_checks.h
102 sanitizer_allocator_combined.h
103 sanitizer_allocator_interface.h
104 sanitizer_allocator_internal.h
105 sanitizer_allocator_local_cache.h
106 sanitizer_allocator_primary32.h
107 sanitizer_allocator_primary64.h
108 sanitizer_allocator_report.h
109 sanitizer_allocator_secondary.h
110 sanitizer_allocator_size_class_map.h
111 sanitizer_allocator_stats.h
114 sanitizer_atomic_clang.h
115 sanitizer_atomic_clang_mips.h
116 sanitizer_atomic_clang_other.h
117 sanitizer_atomic_clang_x86.h
118 sanitizer_atomic_msvc.h
119 sanitizer_bitvector.h
122 sanitizer_common_interceptors.inc
123 sanitizer_common_interceptors_format.inc
124 sanitizer_common_interceptors_ioctl.inc
125 sanitizer_common_interface.inc
126 sanitizer_common_interface_posix.inc
127 sanitizer_common_syscalls.inc
128 sanitizer_coverage_interface.inc
130 sanitizer_deadlock_detector.h
131 sanitizer_deadlock_detector_interface.h
133 sanitizer_errno_codes.h
135 sanitizer_flag_parser.h
140 sanitizer_getauxval.h
141 sanitizer_interceptors_ioctl_netbsd.inc
142 sanitizer_interface_internal.h
143 sanitizer_internal_defs.h
146 sanitizer_libignore.h
149 sanitizer_local_address_space_view.h
151 sanitizer_malloc_mac.inc
153 sanitizer_persistent_allocator.h
154 sanitizer_placement_new.h
156 sanitizer_platform_interceptors.h
157 sanitizer_platform_limits_netbsd.h
158 sanitizer_platform_limits_openbsd.h
159 sanitizer_platform_limits_posix.h
160 sanitizer_platform_limits_solaris.h
163 sanitizer_quarantine.h
164 sanitizer_report_decorator.h
165 sanitizer_ring_buffer.h
167 sanitizer_signal_interceptors.inc
168 sanitizer_stackdepot.h
169 sanitizer_stackdepotbase.h
170 sanitizer_stacktrace.h
171 sanitizer_stacktrace_printer.h
172 sanitizer_stoptheworld.h
173 sanitizer_suppressions.h
174 sanitizer_symbolizer.h
175 sanitizer_symbolizer_fuchsia.h
176 sanitizer_symbolizer_internal.h
177 sanitizer_symbolizer_libbacktrace.h
178 sanitizer_symbolizer_mac.h
179 sanitizer_symbolizer_rtems.h
180 sanitizer_syscall_generic.inc
181 sanitizer_syscall_linux_aarch64.inc
182 sanitizer_syscall_linux_arm.inc
183 sanitizer_syscall_linux_x86_64.inc
184 sanitizer_syscalls_netbsd.inc
185 sanitizer_thread_registry.h
186 sanitizer_tls_get_addr.h
190 sanitizer_win_dll_thunk.h
191 sanitizer_win_weak_interception.h)
193 include_directories(..)
195 set(SANITIZER_COMMON_DEFINITIONS
196 HAVE_RPC_XDR_H=${HAVE_RPC_XDR_H})
198 set(SANITIZER_CFLAGS ${SANITIZER_COMMON_CFLAGS})
199 append_rtti_flag(OFF SANITIZER_CFLAGS)
201 append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=570
203 append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors
206 if (LLVM_ENABLE_PEDANTIC AND UNIX AND NOT APPLE)
207 # With -pedantic, our .S files raise warnings about empty macro arguments
208 # from __USER_LABEL_PREFIX__ being an empty arg to GLUE(). Unfortunately,
209 # there is no simple way to test for an empty define, nor to disable just
210 # that warning or to disable -pedantic. There is also no simple way to
211 # remove -pedantic from just this file (we'd have to remove from
212 # CMAKE_C*_FLAGS and re-add as a source property to all the non-.S files).
213 set_source_files_properties(sanitizer_linux_x86_64.S
214 PROPERTIES COMPILE_FLAGS "-w")
215 set_source_files_properties(sanitizer_linux_mips64.S
216 PROPERTIES COMPILE_FLAGS "-w")
220 set(OS_OPTION OS ${SANITIZER_COMMON_SUPPORTED_OS})
223 add_compiler_rt_object_libraries(RTSanitizerCommon
225 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
226 SOURCES ${SANITIZER_SOURCES}
227 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
228 CFLAGS ${SANITIZER_CFLAGS}
229 DEFS ${SANITIZER_COMMON_DEFINITIONS})
230 add_compiler_rt_object_libraries(RTSanitizerCommonNoTermination
232 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
233 SOURCES ${SANITIZER_SOURCES_NOTERMINATION}
234 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
235 CFLAGS ${SANITIZER_CFLAGS}
236 DEFS ${SANITIZER_COMMON_DEFINITIONS})
237 add_compiler_rt_object_libraries(RTSanitizerCommonNoLibc
239 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
240 SOURCES ${SANITIZER_NOLIBC_SOURCES}
241 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
242 CFLAGS ${SANITIZER_CFLAGS}
243 DEFS ${SANITIZER_COMMON_DEFINITIONS})
244 add_compiler_rt_object_libraries(RTSanitizerCommonLibc
246 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
247 SOURCES ${SANITIZER_LIBCDEP_SOURCES}
248 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
249 CFLAGS ${SANITIZER_CFLAGS}
250 DEFS ${SANITIZER_COMMON_DEFINITIONS})
251 add_compiler_rt_object_libraries(RTSanitizerCommonCoverage
253 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
254 SOURCES ${SANITIZER_COVERAGE_SOURCES}
255 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
256 CFLAGS ${SANITIZER_CFLAGS}
257 DEFS ${SANITIZER_COMMON_DEFINITIONS})
258 add_compiler_rt_object_libraries(RTSanitizerCommonSymbolizer
260 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
261 SOURCES ${SANITIZER_SYMBOLIZER_SOURCES}
262 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
263 CFLAGS ${SANITIZER_CFLAGS}
264 DEFS ${SANITIZER_COMMON_DEFINITIONS})
266 set(SANITIZER_NO_WEAK_HOOKS_CFLAGS ${SANITIZER_CFLAGS})
267 list(APPEND SANITIZER_NO_WEAK_HOOKS_CFLAGS "-DSANITIZER_SUPPORTS_WEAK_HOOKS=0")
268 add_compiler_rt_object_libraries(RTSanitizerCommonNoHooks
270 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
271 SOURCES ${SANITIZER_SOURCES}
272 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
273 CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
274 DEFS ${SANITIZER_COMMON_DEFINITIONS})
275 add_compiler_rt_object_libraries(RTSanitizerCommonLibcNoHooks
277 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
278 SOURCES ${SANITIZER_LIBCDEP_SOURCES}
279 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
280 CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
281 DEFS ${SANITIZER_COMMON_DEFINITIONS})
282 add_compiler_rt_object_libraries(RTSanitizerCommonSymbolizerNoHooks
284 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
285 SOURCES ${SANITIZER_SYMBOLIZER_SOURCES}
286 ADDITIONAL_HEADERS ${SANITIZER_IMPL_HEADERS}
287 CFLAGS ${SANITIZER_NO_WEAK_HOOKS_CFLAGS}
288 DEFS ${SANITIZER_COMMON_DEFINITIONS})
290 if(OS_NAME MATCHES "SunOS")
291 # Solaris ld doesn't support the non-standard GNU ld extension of adding
292 # __start_SECNAME and __stop_SECNAME labels to sections whose names are
293 # valid C identifiers. Instead we add our own definitions for the
294 # __sancov_guards section.
295 add_compiler_rt_object_libraries(SancovBegin
296 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
297 SOURCES sancov_begin.S
298 CFLAGS ${SANITIZER_CFLAGS}
299 DEFS ${SANITIZER_COMMON_DEFINITIONS})
301 add_compiler_rt_runtime(clang_rt.sancov_begin
303 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
304 OBJECT_LIBS SancovBegin
305 CFLAGS ${SANITIZER_CFLAGS}
306 DEFS ${SANITIZER_COMMON_DEFINITIONS})
308 add_compiler_rt_object_libraries(SancovEnd
309 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
311 CFLAGS ${SANITIZER_CFLAGS}
312 DEFS ${SANITIZER_COMMON_DEFINITIONS})
314 add_compiler_rt_runtime(clang_rt.sancov_end
316 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
317 OBJECT_LIBS SancovEnd
318 CFLAGS ${SANITIZER_CFLAGS}
319 DEFS ${SANITIZER_COMMON_DEFINITIONS})
323 add_compiler_rt_object_libraries(SanitizerCommonWeakInterception
324 ${SANITIZER_COMMON_SUPPORTED_OS}
325 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
326 SOURCES sanitizer_win_weak_interception.cc
327 CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DYNAMIC
328 DEFS ${SANITIZER_COMMON_DEFINITIONS})
329 add_compiler_rt_object_libraries(SancovWeakInterception
330 ${SANITIZER_COMMON_SUPPORTED_OS}
331 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
332 SOURCES sanitizer_coverage_win_weak_interception.cc
333 CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DYNAMIC
334 DEFS ${SANITIZER_COMMON_DEFINITIONS})
336 add_compiler_rt_object_libraries(SanitizerCommonDllThunk
337 ${SANITIZER_COMMON_SUPPORTED_OS}
338 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
339 SOURCES sanitizer_win_dll_thunk.cc
340 CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DLL_THUNK
341 DEFS ${SANITIZER_COMMON_DEFINITIONS})
342 add_compiler_rt_object_libraries(SancovDllThunk
343 ${SANITIZER_COMMON_SUPPORTED_OS}
344 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
345 SOURCES sanitizer_coverage_win_dll_thunk.cc
346 sanitizer_coverage_win_sections.cc
347 CFLAGS ${SANITIZER_CFLAGS} -DSANITIZER_DLL_THUNK
348 DEFS ${SANITIZER_COMMON_DEFINITIONS})
350 set(DYNAMIC_RUNTIME_THUNK_CFLAGS "-DSANITIZER_DYNAMIC_RUNTIME_THUNK")
352 list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-Zl")
353 elseif(CMAKE_C_COMPILER_ID MATCHES Clang)
354 list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-nodefaultlibs")
356 add_compiler_rt_object_libraries(SanitizerCommonDynamicRuntimeThunk
357 ${SANITIZER_COMMON_SUPPORTED_OS}
358 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
359 SOURCES sanitizer_win_dynamic_runtime_thunk.cc
360 CFLAGS ${SANITIZER_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS}
361 DEFS ${SANITIZER_COMMON_DEFINITIONS})
362 add_compiler_rt_object_libraries(SancovDynamicRuntimeThunk
363 ${SANITIZER_COMMON_SUPPORTED_OS}
364 ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
365 SOURCES sanitizer_coverage_win_dynamic_runtime_thunk.cc
366 sanitizer_coverage_win_sections.cc
367 CFLAGS ${SANITIZER_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS}
368 DEFS ${SANITIZER_COMMON_DEFINITIONS})
371 # Unit tests for common sanitizer runtime.
372 if(COMPILER_RT_INCLUDE_TESTS)
373 add_subdirectory(tests)