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