257 lines · plain
1# Build for the undefined behavior sanitizer runtime support library.2 3set(UBSAN_SOURCES4 ubsan_diag.cpp5 ubsan_init.cpp6 ubsan_flags.cpp7 ubsan_handlers.cpp8 ubsan_monitor.cpp9 ubsan_value.cpp10 )11 12set(UBSAN_STANDALONE_SOURCES13 ubsan_diag_standalone.cpp14 ubsan_init_standalone.cpp15 ubsan_signals_standalone.cpp16 )17 18set(UBSAN_CXXABI_SOURCES19 ubsan_handlers_cxx.cpp20 ubsan_type_hash.cpp21 ubsan_type_hash_itanium.cpp22 ubsan_type_hash_win.cpp23 )24 25set(UBSAN_HEADERS26 ubsan_checks.inc27 ubsan_diag.h28 ubsan_flags.h29 ubsan_flags.inc30 ubsan_handlers.h31 ubsan_handlers_cxx.h32 ubsan_init.h33 ubsan_interface.inc34 ubsan_monitor.h35 ubsan_platform.h36 ubsan_signals_standalone.h37 ubsan_type_hash.h38 ubsan_value.h39 )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_LIBS64 ${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(RTUbsan86 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_standalone95 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.ubsan105 SHARED106 OS ${UBSAN_SUPPORTED_OS}107 ARCHS ${UBSAN_SUPPORTED_ARCH}108 OBJECT_LIBS RTUbsan109 RTUbsan_standalone110 RTSanitizerCommon111 RTSanitizerCommonLibc112 RTSanitizerCommonCoverage113 RTSanitizerCommonSymbolizer114 RTInterception115 LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS}116 PARENT_TARGET ubsan)117 118 if (NOT APPLE)119 add_compiler_rt_runtime(clang_rt.ubsan120 STATIC121 OS ${UBSAN_SUPPORTED_OS}122 ARCHS ${UBSAN_SUPPORTED_ARCH}123 OBJECT_LIBS RTUbsan124 RTUbsan_standalone125 RTSanitizerCommonNoHooks126 RTSanitizerCommonLibcNoHooks127 RTSanitizerCommonCoverage128 RTSanitizerCommonSymbolizerNoHooks129 RTInterception130 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(RTUbsan138 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_cxx153 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(UbsanRuntimeThunk161 ${SANITIZER_COMMON_SUPPORTED_OS}162 ARCHS ${UBSAN_SUPPORTED_ARCH}163 SOURCES164 ubsan_win_runtime_thunk.cpp165 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_standalone171 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_standalone178 STATIC179 ARCHS ${UBSAN_SUPPORTED_ARCH}180 SOURCES181 ubsan_init_standalone_preinit.cpp182 ADDITIONAL_HEADERS ${UBSAN_HEADERS}183 OBJECT_LIBS RTSanitizerCommon184 RTSanitizerCommonLibc185 RTSanitizerCommonCoverage186 RTSanitizerCommonSymbolizer187 RTSanitizerCommonSymbolizerInternal188 RTUbsan189 RTUbsan_standalone190 RTInterception191 CFLAGS ${UBSAN_CFLAGS}192 PARENT_TARGET ubsan)193 194 add_compiler_rt_runtime(clang_rt.ubsan_standalone_cxx195 STATIC196 ARCHS ${UBSAN_SUPPORTED_ARCH}197 OBJECT_LIBS RTUbsan_cxx198 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_dummy204 ARCHS ${UBSAN_SUPPORTED_ARCH}205 SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp206 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_FLAG214 -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(SOURCE221 ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp222 APPEND PROPERTY223 OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/clang_rt.ubsan_standalone-dynamic-${arch}.vers)224 225 add_compiler_rt_runtime(clang_rt.ubsan_standalone226 SHARED227 ARCHS ${arch}228 OBJECT_LIBS RTSanitizerCommon229 RTSanitizerCommonLibc230 RTSanitizerCommonCoverage231 RTSanitizerCommonSymbolizer232 RTSanitizerCommonSymbolizerInternal233 RTUbsan234 RTUbsan_cxx235 RTUbsan_standalone236 RTInterception237 RTUbsan_dynamic_version_script_dummy238 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_standalone247 ARCHS ${ARCHS_FOR_SYMBOLS}248 PARENT_TARGET ubsan249 EXTRA ubsan.syms.extra)250 add_sanitizer_rt_symbols(clang_rt.ubsan_standalone_cxx251 ARCHS ${ARCHS_FOR_SYMBOLS}252 PARENT_TARGET ubsan253 EXTRA ubsan.syms.extra)254 endif()255 endif()256endif()257