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