1# Build for the undefined behavior sanitizer runtime support library.
2
3set(UBSAN_SOURCES
4  ubsan_diag.cpp
5  ubsan_init.cpp
6  ubsan_flags.cpp
7  ubsan_handlers.cpp
8  ubsan_monitor.cpp
9  ubsan_value.cpp
10  )
11
12set(UBSAN_STANDALONE_SOURCES
13  ubsan_diag_standalone.cpp
14  ubsan_init_standalone.cpp
15  ubsan_signals_standalone.cpp
16  )
17
18set(UBSAN_CXXABI_SOURCES
19  ubsan_handlers_cxx.cpp
20  ubsan_type_hash.cpp
21  ubsan_type_hash_itanium.cpp
22  ubsan_type_hash_win.cpp
23 )
24
25set(UBSAN_HEADERS
26  ubsan_checks.inc
27  ubsan_diag.h
28  ubsan_flags.h
29  ubsan_flags.inc
30  ubsan_handlers.h
31  ubsan_handlers_cxx.h
32  ubsan_init.h
33  ubsan_interface.inc
34  ubsan_monitor.h
35  ubsan_platform.h
36  ubsan_signals_standalone.h
37  ubsan_type_hash.h
38  ubsan_value.h
39  )
40
41include_directories(..)
42
43set(UBSAN_CFLAGS ${SANITIZER_COMMON_CFLAGS})
44append_rtti_flag(OFF UBSAN_CFLAGS)
45append_list_if(SANITIZER_CAN_USE_CXXABI -DUBSAN_CAN_USE_CXXABI UBSAN_CFLAGS)
46
47# Too many existing bugs, needs cleanup.
48append_list_if(COMPILER_RT_HAS_WNO_FORMAT -Wno-format UBSAN_CFLAGS)
49
50set(UBSAN_STANDALONE_CFLAGS ${SANITIZER_COMMON_CFLAGS})
51append_rtti_flag(OFF UBSAN_STANDALONE_CFLAGS)
52append_list_if(SANITIZER_CAN_USE_CXXABI -DUBSAN_CAN_USE_CXXABI UBSAN_STANDALONE_CFLAGS)
53
54set(UBSAN_CXXFLAGS ${SANITIZER_COMMON_CFLAGS})
55append_rtti_flag(ON UBSAN_CXXFLAGS)
56append_list_if(SANITIZER_CAN_USE_CXXABI -DUBSAN_CAN_USE_CXXABI UBSAN_CXXFLAGS)
57
58# Silence warnings in system headers with MSVC.
59if(NOT CLANG_CL)
60  append_list_if(COMPILER_RT_HAS_EXTERNAL_FLAG "/experimental:external /external:W0 /external:anglebrackets" UBSAN_CXXFLAGS)
61endif()
62
63set(UBSAN_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS})
64
65set(UBSAN_DYNAMIC_LIBS
66  ${COMPILER_RT_UNWINDER_LINK_LIBS}
67  ${SANITIZER_CXX_ABI_LIBRARIES}
68  ${SANITIZER_COMMON_LINK_LIBS})
69
70append_list_if(COMPILER_RT_HAS_LIBDL dl UBSAN_DYNAMIC_LIBS)
71append_list_if(COMPILER_RT_HAS_LIBLOG log UBSAN_DYNAMIC_LIBS)
72append_list_if(COMPILER_RT_HAS_LIBRT rt UBSAN_DYNAMIC_LIBS)
73append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread UBSAN_DYNAMIC_LIBS)
74
75add_compiler_rt_component(ubsan)
76
77if(APPLE)
78  set(UBSAN_COMMON_SOURCES ${UBSAN_SOURCES})
79  if(SANITIZER_CAN_USE_CXXABI)
80    list(APPEND UBSAN_COMMON_SOURCES ${UBSAN_CXXABI_SOURCES})
81  endif()
82
83  # Common parts of UBSan runtime.
84  add_compiler_rt_object_libraries(RTUbsan
85    OS ${SANITIZER_COMMON_SUPPORTED_OS}
86    ARCHS ${UBSAN_COMMON_SUPPORTED_ARCH}
87    SOURCES ${UBSAN_COMMON_SOURCES}
88    ADDITIONAL_HEADERS ${UBSAN_HEADERS}
89    CFLAGS ${UBSAN_CXXFLAGS})
90
91  if(COMPILER_RT_HAS_UBSAN)
92    # Initializer of standalone UBSan runtime.
93    add_compiler_rt_object_libraries(RTUbsan_standalone
94      OS ${UBSAN_SUPPORTED_OS}
95      ARCHS ${UBSAN_SUPPORTED_ARCH}
96      SOURCES ${UBSAN_STANDALONE_SOURCES}
97      ADDITIONAL_HEADERS ${UBSAN_HEADERS}
98      CFLAGS ${UBSAN_STANDALONE_CFLAGS})
99
100    add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)
101    add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
102
103    add_compiler_rt_runtime(clang_rt.ubsan
104      SHARED
105      OS ${UBSAN_SUPPORTED_OS}
106      ARCHS ${UBSAN_SUPPORTED_ARCH}
107      OBJECT_LIBS RTUbsan
108                  RTUbsan_standalone
109                  RTSanitizerCommon
110                  RTSanitizerCommonLibc
111                  RTSanitizerCommonCoverage
112                  RTSanitizerCommonSymbolizer
113                  RTInterception
114      LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}
115      PARENT_TARGET ubsan)
116
117    if (NOT APPLE)
118      add_compiler_rt_runtime(clang_rt.ubsan
119        STATIC
120        OS ${UBSAN_SUPPORTED_OS}
121        ARCHS ${UBSAN_SUPPORTED_ARCH}
122        OBJECT_LIBS RTUbsan
123                    RTUbsan_standalone
124                    RTSanitizerCommonNoHooks
125                    RTSanitizerCommonLibcNoHooks
126                    RTSanitizerCommonCoverage
127                    RTSanitizerCommonSymbolizerNoHooks
128                    RTInterception
129        LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}
130        PARENT_TARGET ubsan)
131    endif()
132  endif()
133
134else()
135  # Common parts of UBSan runtime.
136  add_compiler_rt_object_libraries(RTUbsan
137    ARCHS ${UBSAN_COMMON_SUPPORTED_ARCH}
138    SOURCES ${UBSAN_SOURCES}
139    ADDITIONAL_HEADERS ${UBSAN_HEADERS}
140    CFLAGS ${UBSAN_CFLAGS})
141
142  if(SANITIZER_CAN_USE_CXXABI)
143    # C++-specific parts of UBSan runtime. Requires a C++ ABI library.
144    set(UBSAN_CXX_SOURCES ${UBSAN_CXXABI_SOURCES})
145  else()
146    # Dummy target if we don't have C++ ABI library.
147    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/cxx_dummy.cpp "")
148    set(UBSAN_CXX_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/cxx_dummy.cpp)
149  endif()
150
151  add_compiler_rt_object_libraries(RTUbsan_cxx
152    ARCHS ${UBSAN_COMMON_SUPPORTED_ARCH}
153    SOURCES ${UBSAN_CXX_SOURCES}
154    ADDITIONAL_HEADERS ${UBSAN_HEADERS}
155    CFLAGS ${UBSAN_CXXFLAGS})
156
157  if (WIN32)
158    add_compiler_rt_object_libraries(UbsanWeakInterception
159      ${SANITIZER_COMMON_SUPPORTED_OS}
160      ARCHS ${UBSAN_SUPPORTED_ARCH}
161      SOURCES
162        ubsan_win_weak_interception.cpp
163      CFLAGS ${UBSAN_CFLAGS} -DSANITIZER_DYNAMIC
164      DEFS ${UBSAN_COMMON_DEFINITIONS})
165
166    add_compiler_rt_object_libraries(UbsanDllThunk
167      ${SANITIZER_COMMON_SUPPORTED_OS}
168      ARCHS ${UBSAN_SUPPORTED_ARCH}
169      SOURCES
170        ubsan_win_dll_thunk.cpp
171      CFLAGS ${UBSAN_CFLAGS} -DSANITIZER_DLL_THUNK
172      DEFS ${UBSAN_COMMON_DEFINITIONS})
173
174    set(DYNAMIC_RUNTIME_THUNK_CFLAGS "-DSANITIZER_DYNAMIC_RUNTIME_THUNK")
175    if(MSVC)
176      list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-Zl")
177    elseif(CMAKE_C_COMPILER_ID MATCHES Clang)
178      list(APPEND DYNAMIC_RUNTIME_THUNK_CFLAGS "-nodefaultlibs")
179    endif()
180    add_compiler_rt_object_libraries(UbsanDynamicRuntimeThunk
181      ${SANITIZER_COMMON_SUPPORTED_OS}
182      ARCHS ${UBSAN_SUPPORTED_ARCH}
183      SOURCES
184        ubsan_win_dynamic_runtime_thunk.cpp
185      CFLAGS ${UBSAN_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS}
186      DEFS ${UBSAN_COMMON_DEFINITIONS})
187  endif()
188
189  if(COMPILER_RT_HAS_UBSAN)
190    add_compiler_rt_object_libraries(RTUbsan_standalone
191      ARCHS ${UBSAN_SUPPORTED_ARCH}
192      SOURCES ${UBSAN_STANDALONE_SOURCES}
193      ADDITIONAL_HEADERS ${UBSAN_HEADERS}
194      CFLAGS ${UBSAN_STANDALONE_CFLAGS})
195
196    # Standalone UBSan runtimes.
197    add_compiler_rt_runtime(clang_rt.ubsan_standalone
198      STATIC
199      ARCHS ${UBSAN_SUPPORTED_ARCH}
200      SOURCES
201        ubsan_init_standalone_preinit.cpp
202      ADDITIONAL_HEADERS ${UBSAN_HEADERS}
203      OBJECT_LIBS RTSanitizerCommon
204              RTSanitizerCommonLibc
205              RTSanitizerCommonCoverage
206              RTSanitizerCommonSymbolizer
207              RTUbsan
208              RTUbsan_standalone
209              RTInterception
210      CFLAGS ${UBSAN_CFLAGS}
211      PARENT_TARGET ubsan)
212
213    add_compiler_rt_runtime(clang_rt.ubsan_standalone_cxx
214      STATIC
215      ARCHS ${UBSAN_SUPPORTED_ARCH}
216      OBJECT_LIBS RTUbsan_cxx
217      CFLAGS ${UBSAN_CXXFLAGS}
218      PARENT_TARGET ubsan)
219
220    if (COMPILER_RT_HAS_VERSION_SCRIPT)
221      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp "")
222      add_compiler_rt_object_libraries(RTUbsan_dynamic_version_script_dummy
223        ARCHS ${UBSAN_SUPPORTED_ARCH}
224        SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp
225        CFLAGS ${UBSAN_CFLAGS})
226
227      foreach(arch ${UBSAN_SUPPORTED_ARCH})
228        add_sanitizer_rt_version_list(clang_rt.ubsan_standalone-dynamic-${arch}
229                                      LIBS clang_rt.ubsan_standalone-${arch}
230                                           clang_rt.ubsan_standalone_cxx-${arch}
231                                      EXTRA ubsan.syms.extra)
232        set(VERSION_SCRIPT_FLAG
233            -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/clang_rt.ubsan_standalone-dynamic-${arch}.vers)
234        # The Solaris 11.4 linker supports a subset of GNU ld version scripts,
235        # but requires a special option to enable it.
236        if (COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT)
237            list(APPEND VERSION_SCRIPT_FLAG -Wl,-z,gnu-version-script-compat)
238        endif()
239        set_property(SOURCE
240          ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp
241          APPEND PROPERTY
242          OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.ubsan_standalone-dynamic-${arch}.vers)
243
244        add_compiler_rt_runtime(clang_rt.ubsan_standalone
245          SHARED
246          ARCHS ${arch}
247          OBJECT_LIBS RTSanitizerCommon
248                RTSanitizerCommonLibc
249                RTSanitizerCommonCoverage
250                RTSanitizerCommonSymbolizer
251                RTUbsan
252                RTUbsan_cxx
253                RTUbsan_standalone
254                RTInterception
255                RTUbsan_dynamic_version_script_dummy
256          CFLAGS ${UBSAN_CFLAGS}
257          LINK_FLAGS ${UBSAN_LINK_FLAGS} ${VERSION_SCRIPT_FLAG}
258          LINK_LIBS ${UBSAN_DYNAMIC_LIBS}
259          PARENT_TARGET ubsan)
260      endforeach()
261
262      set(ARCHS_FOR_SYMBOLS ${UBSAN_SUPPORTED_ARCH})
263      list(REMOVE_ITEM ARCHS_FOR_SYMBOLS i386)
264      add_sanitizer_rt_symbols(clang_rt.ubsan_standalone
265        ARCHS ${ARCHS_FOR_SYMBOLS}
266        PARENT_TARGET ubsan
267        EXTRA ubsan.syms.extra)
268      add_sanitizer_rt_symbols(clang_rt.ubsan_standalone_cxx
269        ARCHS ${ARCHS_FOR_SYMBOLS}
270        PARENT_TARGET ubsan
271        EXTRA ubsan.syms.extra)
272    endif()
273  endif()
274endif()
275