CMakeLists.txt revision 49496747758bf44163768ce3e07e40c8f95ccba9
1# Build system for the common Sanitizer runtime support library components.
2# These components are shared between AddressSanitizer and ThreadSanitizer.
3
4set(SANITIZER_SOURCES
5  sanitizer_allocator.cc
6  sanitizer_common.cc
7  sanitizer_flags.cc
8  sanitizer_libc.cc
9  sanitizer_libignore.cc
10  sanitizer_linux.cc
11  sanitizer_mac.cc
12  sanitizer_platform_limits_linux.cc
13  sanitizer_platform_limits_posix.cc
14  sanitizer_posix.cc
15  sanitizer_printf.cc
16  sanitizer_stackdepot.cc
17  sanitizer_stacktrace.cc
18  sanitizer_suppressions.cc
19  sanitizer_symbolizer.cc
20  sanitizer_symbolizer_win.cc
21  sanitizer_thread_registry.cc
22  sanitizer_win.cc)
23
24set(SANITIZER_LIBCDEP_SOURCES
25  sanitizer_common_libcdep.cc
26  sanitizer_linux_libcdep.cc
27  sanitizer_posix_libcdep.cc
28  sanitizer_stacktrace_libcdep.cc
29  sanitizer_stoptheworld_linux_libcdep.cc
30  sanitizer_symbolizer_libcdep.cc
31  sanitizer_symbolizer_posix_libcdep.cc)
32
33# Explicitly list all sanitizer_common headers. Not all of these are
34# included in sanitizer_common source files, but we need to depend on
35# headers when building our custom unit tests.
36set(SANITIZER_HEADERS
37  sanitizer_allocator.h
38  sanitizer_allocator_internal.h
39  sanitizer_atomic_clang.h
40  sanitizer_atomic_msvc.h
41  sanitizer_atomic.h
42  sanitizer_common.h
43  sanitizer_common_interceptors.inc
44  sanitizer_common_interceptors_ioctl.inc
45  sanitizer_common_interceptors_scanf.inc
46  sanitizer_common_syscalls.inc
47  sanitizer_flags.h
48  sanitizer_internal_defs.h
49  sanitizer_lfstack.h
50  sanitizer_libc.h
51  sanitizer_libignore.h
52  sanitizer_linux.h
53  sanitizer_list.h
54  sanitizer_mutex.h
55  sanitizer_placement_new.h
56  sanitizer_platform_interceptors.h
57  sanitizer_procmaps.h
58  sanitizer_quarantine.h
59  sanitizer_report_decorator.h
60  sanitizer_stackdepot.h
61  sanitizer_stacktrace.h
62  sanitizer_symbolizer.h
63  sanitizer_thread_registry.h)
64
65if (NOT MSVC)
66  set(SANITIZER_CFLAGS
67    ${SANITIZER_COMMON_CFLAGS}
68    -fno-rtti)
69else()
70  set(SANITIZER_CFLAGS
71    ${SANITIZER_COMMON_CFLAGS}
72    /GR-)
73endif()
74
75if(SUPPORTS_GLOBAL_CONSTRUCTORS_FLAG)
76  list(APPEND SANITIZER_CFLAGS -Wglobal-constructors)
77endif()
78
79set(SANITIZER_RUNTIME_LIBRARIES)
80if(APPLE)
81  # Build universal binary on APPLE.
82  foreach(os ${SANITIZER_COMMON_SUPPORTED_DARWIN_OS})
83    add_compiler_rt_darwin_object_library(RTSanitizerCommon ${os}
84      ARCH ${SANITIZER_COMMON_SUPPORTED_ARCH}
85      SOURCES ${SANITIZER_SOURCES} ${SANITIZER_LIBCDEP_SOURCES}
86      CFLAGS ${SANITIZER_CFLAGS})
87    list(APPEND SANITIZER_RUNTIME_LIBRARIES RTSanitizerCommon.${os})
88  endforeach()
89elseif(ANDROID)
90  add_library(RTSanitizerCommon.arm.android OBJECT
91    ${SANITIZER_SOURCES} ${SANITIZER_LIBCDEP_SOURCES})
92  set_target_compile_flags(RTSanitizerCommon.arm.android
93    ${SANITIZER_CFLAGS})
94  list(APPEND SANITIZER_RUNTIME_LIBRARIES RTSanitizerCommon.arm.android)
95else()
96  # Otherwise, build separate libraries for each target.
97  foreach(arch ${SANITIZER_COMMON_SUPPORTED_ARCH})
98    add_compiler_rt_object_library(RTSanitizerCommon ${arch}
99      SOURCES ${SANITIZER_SOURCES} CFLAGS ${SANITIZER_CFLAGS})
100    add_compiler_rt_object_library(RTSanitizerCommonLibc ${arch}
101      SOURCES ${SANITIZER_LIBCDEP_SOURCES} CFLAGS ${SANITIZER_CFLAGS})
102    add_compiler_rt_static_runtime(clang_rt.san-${arch} ${arch}
103      SOURCES $<TARGET_OBJECTS:RTSanitizerCommon.${arch}>
104              $<TARGET_OBJECTS:RTSanitizerCommonLibc.${arch}>
105      CFLAGS ${SANITIZER_CFLAGS})
106    list(APPEND SANITIZER_RUNTIME_LIBRARIES RTSanitizerCommon.${arch}
107                                            RTSanitizerCommonLibc.${arch})
108  endforeach()
109endif()
110
111# Unit tests for common sanitizer runtime.
112if(LLVM_INCLUDE_TESTS)
113  add_subdirectory(tests)
114endif()
115