xref: /llvm-project/compiler-rt/lib/ubsan/CMakeLists.txt (revision 1de228fa9bf07c118294b53e3da37ab2b5ff1fd4)
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_list_if(MSVC /Zl UBSAN_CFLAGS)
45append_rtti_flag(OFF 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)
52
53set(UBSAN_CXXFLAGS ${SANITIZER_COMMON_CFLAGS})
54append_rtti_flag(ON UBSAN_CXXFLAGS)
55
56# Silence warnings in system headers with MSVC.
57if(NOT CLANG_CL)
58  append_list_if(COMPILER_RT_HAS_EXTERNAL_FLAG "/experimental:external;/external:W0;/external:anglebrackets" UBSAN_CXXFLAGS)
59endif()
60
61set(UBSAN_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS})
62
63set(UBSAN_DYNAMIC_LIBS
64  ${COMPILER_RT_UNWINDER_LINK_LIBS}
65  ${SANITIZER_CXX_ABI_LIBRARIES}
66  ${SANITIZER_COMMON_LINK_LIBS})
67
68append_list_if(COMPILER_RT_HAS_LIBDL dl UBSAN_DYNAMIC_LIBS)
69append_list_if(COMPILER_RT_HAS_LIBLOG log UBSAN_DYNAMIC_LIBS)
70append_list_if(COMPILER_RT_HAS_LIBRT rt UBSAN_DYNAMIC_LIBS)
71append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread UBSAN_DYNAMIC_LIBS)
72if (COMPILER_RT_ENABLE_INTERNAL_SYMBOLIZER)
73  append_list_if(COMPILER_RT_HAS_LIBM m UBSAN_DYNAMIC_LIBS)
74endif()
75
76add_compiler_rt_component(ubsan)
77
78if(APPLE)
79  set(UBSAN_COMMON_SOURCES ${UBSAN_SOURCES})
80  if(SANITIZER_CAN_USE_CXXABI)
81    list(APPEND UBSAN_COMMON_SOURCES ${UBSAN_CXXABI_SOURCES})
82  endif()
83
84  # Common parts of UBSan runtime.
85  add_compiler_rt_object_libraries(RTUbsan
86    OS ${SANITIZER_COMMON_SUPPORTED_OS}
87    ARCHS ${UBSAN_COMMON_SUPPORTED_ARCH}
88    SOURCES ${UBSAN_COMMON_SOURCES}
89    ADDITIONAL_HEADERS ${UBSAN_HEADERS}
90    CFLAGS ${UBSAN_CXXFLAGS})
91
92  if(COMPILER_RT_HAS_UBSAN)
93    # Initializer of standalone UBSan runtime.
94    add_compiler_rt_object_libraries(RTUbsan_standalone
95      OS ${UBSAN_SUPPORTED_OS}
96      ARCHS ${UBSAN_SUPPORTED_ARCH}
97      SOURCES ${UBSAN_STANDALONE_SOURCES}
98      ADDITIONAL_HEADERS ${UBSAN_HEADERS}
99      CFLAGS ${UBSAN_STANDALONE_CFLAGS})
100
101    add_weak_symbols("ubsan" WEAK_SYMBOL_LINK_FLAGS)
102    add_weak_symbols("sanitizer_common" WEAK_SYMBOL_LINK_FLAGS)
103
104    add_compiler_rt_runtime(clang_rt.ubsan
105      SHARED
106      OS ${UBSAN_SUPPORTED_OS}
107      ARCHS ${UBSAN_SUPPORTED_ARCH}
108      OBJECT_LIBS RTUbsan
109                  RTUbsan_standalone
110                  RTSanitizerCommon
111                  RTSanitizerCommonLibc
112                  RTSanitizerCommonCoverage
113                  RTSanitizerCommonSymbolizer
114                  RTInterception
115      LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}
116      PARENT_TARGET ubsan)
117
118    if (NOT APPLE)
119      add_compiler_rt_runtime(clang_rt.ubsan
120        STATIC
121        OS ${UBSAN_SUPPORTED_OS}
122        ARCHS ${UBSAN_SUPPORTED_ARCH}
123        OBJECT_LIBS RTUbsan
124                    RTUbsan_standalone
125                    RTSanitizerCommonNoHooks
126                    RTSanitizerCommonLibcNoHooks
127                    RTSanitizerCommonCoverage
128                    RTSanitizerCommonSymbolizerNoHooks
129                    RTInterception
130        LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}
131        PARENT_TARGET ubsan)
132    endif()
133  endif()
134
135else()
136  # Common parts of UBSan runtime.
137  add_compiler_rt_object_libraries(RTUbsan
138    ARCHS ${UBSAN_COMMON_SUPPORTED_ARCH}
139    SOURCES ${UBSAN_SOURCES}
140    ADDITIONAL_HEADERS ${UBSAN_HEADERS}
141    CFLAGS ${UBSAN_CFLAGS})
142
143  if(SANITIZER_CAN_USE_CXXABI)
144    # C++-specific parts of UBSan runtime. Requires a C++ ABI library.
145    set(UBSAN_CXX_SOURCES ${UBSAN_CXXABI_SOURCES})
146  else()
147    # Dummy target if we don't have C++ ABI library.
148    file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/cxx_dummy.cpp "")
149    set(UBSAN_CXX_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/cxx_dummy.cpp)
150  endif()
151
152  add_compiler_rt_object_libraries(RTUbsan_cxx
153    ARCHS ${UBSAN_COMMON_SUPPORTED_ARCH}
154    SOURCES ${UBSAN_CXX_SOURCES}
155    ADDITIONAL_HEADERS ${UBSAN_HEADERS}
156    CFLAGS ${UBSAN_CXXFLAGS})
157
158  if (WIN32)
159    set(RUNTIME_THUNK_CFLAGS -DSANITIZER_DYNAMIC_RUNTIME_THUNK -DSANITIZER_STATIC_RUNTIME_THUNK)
160    add_compiler_rt_object_libraries(UbsanRuntimeThunk
161      ${SANITIZER_COMMON_SUPPORTED_OS}
162      ARCHS ${UBSAN_SUPPORTED_ARCH}
163      SOURCES
164        ubsan_win_runtime_thunk.cpp
165      CFLAGS ${UBSAN_CFLAGS} ${DYNAMIC_RUNTIME_THUNK_CFLAGS}
166      DEFS ${UBSAN_COMMON_DEFINITIONS})
167  endif()
168
169  if(COMPILER_RT_HAS_UBSAN)
170    add_compiler_rt_object_libraries(RTUbsan_standalone
171      ARCHS ${UBSAN_SUPPORTED_ARCH}
172      SOURCES ${UBSAN_STANDALONE_SOURCES}
173      ADDITIONAL_HEADERS ${UBSAN_HEADERS}
174      CFLAGS ${UBSAN_STANDALONE_CFLAGS})
175
176    # Standalone UBSan runtimes.
177    add_compiler_rt_runtime(clang_rt.ubsan_standalone
178      STATIC
179      ARCHS ${UBSAN_SUPPORTED_ARCH}
180      SOURCES
181        ubsan_init_standalone_preinit.cpp
182      ADDITIONAL_HEADERS ${UBSAN_HEADERS}
183      OBJECT_LIBS RTSanitizerCommon
184              RTSanitizerCommonLibc
185              RTSanitizerCommonCoverage
186              RTSanitizerCommonSymbolizer
187              RTSanitizerCommonSymbolizerInternal
188              RTUbsan
189              RTUbsan_standalone
190              RTInterception
191      CFLAGS ${UBSAN_CFLAGS}
192      PARENT_TARGET ubsan)
193
194    add_compiler_rt_runtime(clang_rt.ubsan_standalone_cxx
195      STATIC
196      ARCHS ${UBSAN_SUPPORTED_ARCH}
197      OBJECT_LIBS RTUbsan_cxx
198      CFLAGS ${UBSAN_CXXFLAGS}
199      PARENT_TARGET ubsan)
200
201    if (COMPILER_RT_HAS_VERSION_SCRIPT)
202      file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp "")
203      add_compiler_rt_object_libraries(RTUbsan_dynamic_version_script_dummy
204        ARCHS ${UBSAN_SUPPORTED_ARCH}
205        SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp
206        CFLAGS ${UBSAN_CFLAGS})
207
208      foreach(arch ${UBSAN_SUPPORTED_ARCH})
209        add_sanitizer_rt_version_list(clang_rt.ubsan_standalone-dynamic-${arch}
210                                      LIBS clang_rt.ubsan_standalone-${arch}
211                                           clang_rt.ubsan_standalone_cxx-${arch}
212                                      EXTRA ubsan.syms.extra)
213        set(VERSION_SCRIPT_FLAG
214            -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/clang_rt.ubsan_standalone-dynamic-${arch}.vers)
215        # The Solaris 11.4 linker supports a subset of GNU ld version scripts,
216        # but requires a special option to enable it.
217        if (COMPILER_RT_HAS_GNU_VERSION_SCRIPT_COMPAT)
218            list(APPEND VERSION_SCRIPT_FLAG -Wl,-z,gnu-version-script-compat)
219        endif()
220        set_property(SOURCE
221          ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp
222          APPEND PROPERTY
223          OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.ubsan_standalone-dynamic-${arch}.vers)
224
225        add_compiler_rt_runtime(clang_rt.ubsan_standalone
226          SHARED
227          ARCHS ${arch}
228          OBJECT_LIBS RTSanitizerCommon
229                RTSanitizerCommonLibc
230                RTSanitizerCommonCoverage
231                RTSanitizerCommonSymbolizer
232                RTSanitizerCommonSymbolizerInternal
233                RTUbsan
234                RTUbsan_cxx
235                RTUbsan_standalone
236                RTInterception
237                RTUbsan_dynamic_version_script_dummy
238          CFLAGS ${UBSAN_CFLAGS}
239          LINK_FLAGS ${UBSAN_LINK_FLAGS} ${VERSION_SCRIPT_FLAG}
240          LINK_LIBS ${UBSAN_DYNAMIC_LIBS}
241          PARENT_TARGET ubsan)
242      endforeach()
243
244      set(ARCHS_FOR_SYMBOLS ${UBSAN_SUPPORTED_ARCH})
245      list(REMOVE_ITEM ARCHS_FOR_SYMBOLS i386)
246      add_sanitizer_rt_symbols(clang_rt.ubsan_standalone
247        ARCHS ${ARCHS_FOR_SYMBOLS}
248        PARENT_TARGET ubsan
249        EXTRA ubsan.syms.extra)
250      add_sanitizer_rt_symbols(clang_rt.ubsan_standalone_cxx
251        ARCHS ${ARCHS_FOR_SYMBOLS}
252        PARENT_TARGET ubsan
253        EXTRA ubsan.syms.extra)
254    endif()
255  endif()
256endif()
257