]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/sanitizer_common/CMakeLists.txt
Vendor import of compiler-rt trunk r351319 (just before the release_80
[FreeBSD/FreeBSD.git] / lib / sanitizer_common / CMakeLists.txt
1 # Build system for the common Sanitizer runtime support library components.
2 # These components are shared between AddressSanitizer and ThreadSanitizer.
3
4 set(SANITIZER_SOURCES_NOTERMINATION
5   sanitizer_allocator.cc
6   sanitizer_common.cc
7   sanitizer_deadlock_detector1.cc
8   sanitizer_deadlock_detector2.cc
9   sanitizer_errno.cc
10   sanitizer_file.cc
11   sanitizer_flags.cc
12   sanitizer_flag_parser.cc
13   sanitizer_fuchsia.cc
14   sanitizer_libc.cc
15   sanitizer_libignore.cc
16   sanitizer_linux.cc
17   sanitizer_linux_s390.cc
18   sanitizer_mac.cc
19   sanitizer_netbsd.cc
20   sanitizer_openbsd.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
28   sanitizer_posix.cc
29   sanitizer_printf.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
35   sanitizer_rtems.cc
36   sanitizer_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
42   sanitizer_win.cc)
43
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)
49 endif()
50
51 set(SANITIZER_SOURCES
52   ${SANITIZER_SOURCES_NOTERMINATION} sanitizer_termination.cc)
53
54 # Libc functions stubs. These sources should be linked instead of
55 # SANITIZER_LIBCDEP_SOURCES when sanitizer_common library must not depend on
56 # libc.
57 set(SANITIZER_NOLIBC_SOURCES
58   sanitizer_common_nolibc.cc)
59
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)
67
68 set(SANITIZER_COVERAGE_SOURCES
69   sancov_flags.cc
70   sanitizer_coverage_fuchsia.cc
71   sanitizer_coverage_libcdep_new.cc
72   sanitizer_coverage_win_sections.cc)
73
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)
91
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
96   sancov_flags.h
97   sancov_flags.inc
98   sanitizer_addrhashmap.h
99   sanitizer_allocator.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
112   sanitizer_asm.h
113   sanitizer_atomic.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
120   sanitizer_bvgraph.h
121   sanitizer_common.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
129   sanitizer_dbghelp.h
130   sanitizer_deadlock_detector.h
131   sanitizer_deadlock_detector_interface.h
132   sanitizer_errno.h
133   sanitizer_errno_codes.h
134   sanitizer_file.h
135   sanitizer_flag_parser.h
136   sanitizer_flags.h
137   sanitizer_flags.inc
138   sanitizer_freebsd.h
139   sanitizer_fuchsia.h
140   sanitizer_getauxval.h
141   sanitizer_interceptors_ioctl_netbsd.inc
142   sanitizer_interface_internal.h
143   sanitizer_internal_defs.h
144   sanitizer_lfstack.h
145   sanitizer_libc.h
146   sanitizer_libignore.h
147   sanitizer_linux.h
148   sanitizer_list.h
149   sanitizer_local_address_space_view.h
150   sanitizer_mac.h
151   sanitizer_malloc_mac.inc
152   sanitizer_mutex.h
153   sanitizer_persistent_allocator.h
154   sanitizer_placement_new.h
155   sanitizer_platform.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
161   sanitizer_posix.h
162   sanitizer_procmaps.h
163   sanitizer_quarantine.h
164   sanitizer_report_decorator.h
165   sanitizer_ring_buffer.h
166   sanitizer_rtems.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
187   sanitizer_vector.h
188   sanitizer_win.h
189   sanitizer_win_defs.h
190   sanitizer_win_dll_thunk.h
191   sanitizer_win_weak_interception.h)
192
193 include_directories(..)
194
195 set(SANITIZER_COMMON_DEFINITIONS
196   HAVE_RPC_XDR_H=${HAVE_RPC_XDR_H})
197
198 set(SANITIZER_CFLAGS ${SANITIZER_COMMON_CFLAGS})
199 append_rtti_flag(OFF SANITIZER_CFLAGS)
200
201 append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=570
202                SANITIZER_CFLAGS)
203 append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors
204                SANITIZER_CFLAGS)
205
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")
217 endif ()
218
219 if(APPLE)
220   set(OS_OPTION OS ${SANITIZER_COMMON_SUPPORTED_OS})
221 endif()
222
223 add_compiler_rt_object_libraries(RTSanitizerCommon
224   ${OS_OPTION}
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
231   ${OS_OPTION}
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
238   ${OS_OPTION}
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
245   ${OS_OPTION}
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
252   ${OS_OPTION}
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
259   ${OS_OPTION}
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})
265
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
269   ${OS_OPTION}
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
276   ${OS_OPTION}
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
283   ${OS_OPTION}
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})
289
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})
300
301   add_compiler_rt_runtime(clang_rt.sancov_begin
302     STATIC
303     ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
304     OBJECT_LIBS SancovBegin
305     CFLAGS ${SANITIZER_CFLAGS}
306     DEFS ${SANITIZER_COMMON_DEFINITIONS})
307
308   add_compiler_rt_object_libraries(SancovEnd
309     ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
310     SOURCES sancov_end.S
311     CFLAGS ${SANITIZER_CFLAGS}
312     DEFS ${SANITIZER_COMMON_DEFINITIONS})
313
314   add_compiler_rt_runtime(clang_rt.sancov_end
315     STATIC
316     ARCHS ${SANITIZER_COMMON_SUPPORTED_ARCH}
317     OBJECT_LIBS SancovEnd
318     CFLAGS ${SANITIZER_CFLAGS}
319     DEFS ${SANITIZER_COMMON_DEFINITIONS})
320 endif()
321
322 if(WIN32)
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})
335
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})
349
350   set(DYNAMIC_RUNTIME_THUNK_CFLAGS "-DSANITIZER_DYNAMIC_RUNTIME_THUNK")
351   if(MSVC)
352     list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-Zl")
353   elseif(CMAKE_C_COMPILER_ID MATCHES Clang)
354     list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-nodefaultlibs")
355   endif()
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})
369 endif()
370
371 # Unit tests for common sanitizer runtime.
372 if(COMPILER_RT_INCLUDE_TESTS)
373   add_subdirectory(tests)
374 endif()