| include_directories(..) |
| |
| # Runtime library sources and build flags. |
| set(HWASAN_RTL_SOURCES |
| hwasan.cpp |
| hwasan_allocator.cpp |
| hwasan_allocation_functions.cpp |
| hwasan_dynamic_shadow.cpp |
| hwasan_exceptions.cpp |
| hwasan_fuchsia.cpp |
| hwasan_globals.cpp |
| hwasan_interceptors.cpp |
| hwasan_interceptors_vfork.S |
| hwasan_linux.cpp |
| hwasan_memintrinsics.cpp |
| hwasan_poisoning.cpp |
| hwasan_report.cpp |
| hwasan_setjmp_aarch64.S |
| hwasan_setjmp_x86_64.S |
| hwasan_tag_mismatch_aarch64.S |
| hwasan_thread.cpp |
| hwasan_thread_list.cpp |
| hwasan_type_test.cpp |
| ) |
| |
| set(HWASAN_RTL_CXX_SOURCES |
| hwasan_new_delete.cpp |
| ) |
| |
| set(HWASAN_RTL_HEADERS |
| hwasan.h |
| hwasan_allocator.h |
| hwasan_dynamic_shadow.h |
| hwasan_flags.h |
| hwasan_flags.inc |
| hwasan_globals.h |
| hwasan_interface_internal.h |
| hwasan_malloc_bisect.h |
| hwasan_mapping.h |
| hwasan_poisoning.h |
| hwasan_report.h |
| hwasan_thread.h |
| hwasan_thread_list.h |
| ) |
| |
| set(HWASAN_DEFINITIONS) |
| append_list_if(COMPILER_RT_HWASAN_WITH_INTERCEPTORS HWASAN_WITH_INTERCEPTORS=1 HWASAN_DEFINITIONS) |
| |
| if(FUCHSIA) |
| # Set this explicitly on Fuchsia, otherwise the default value is set to HWASAN_WITH_INTERCEPTORS. |
| list(APPEND HWASAN_DEFINITIONS HWASAN_REPLACE_OPERATORS_NEW_AND_DELETE=1) |
| endif() |
| |
| set(HWASAN_RTL_CFLAGS ${SANITIZER_COMMON_CFLAGS}) |
| append_rtti_flag(OFF HWASAN_RTL_CFLAGS) |
| append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC HWASAN_RTL_CFLAGS) |
| # Prevent clang from generating libc calls. |
| append_list_if(COMPILER_RT_HAS_FFREESTANDING_FLAG -ffreestanding HWASAN_RTL_CFLAGS) |
| |
| # Too many existing bugs, needs cleanup. |
| append_list_if(COMPILER_RT_HAS_WNO_FORMAT -Wno-format HWASAN_RTL_CFLAGS) |
| |
| set(HWASAN_DYNAMIC_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}) |
| |
| if(ANDROID) |
| # Put most Sanitizer shared libraries in the global group. For more details, see |
| # android-changes-for-ndk-developers.md#changes-to-library-search-order |
| if (COMPILER_RT_HAS_Z_GLOBAL) |
| list(APPEND HWASAN_DYNAMIC_LINK_FLAGS -Wl,-z,global) |
| endif() |
| endif() |
| |
| set(HWASAN_DYNAMIC_CFLAGS ${HWASAN_RTL_CFLAGS}) |
| append_list_if(COMPILER_RT_HAS_FTLS_MODEL_INITIAL_EXEC |
| -ftls-model=initial-exec HWASAN_DYNAMIC_CFLAGS) |
| append_list_if(MSVC /DEBUG HWASAN_DYNAMIC_LINK_FLAGS) |
| |
| set(HWASAN_DYNAMIC_LIBS ${SANITIZER_CXX_ABI_LIBRARIES} ${SANITIZER_COMMON_LINK_LIBS}) |
| |
| append_list_if(COMPILER_RT_HAS_LIBDL dl HWASAN_DYNAMIC_LIBS) |
| append_list_if(COMPILER_RT_HAS_LIBRT rt HWASAN_DYNAMIC_LIBS) |
| append_list_if(COMPILER_RT_HAS_LIBM m HWASAN_DYNAMIC_LIBS) |
| append_list_if(COMPILER_RT_HAS_LIBPTHREAD pthread HWASAN_DYNAMIC_LIBS) |
| |
| # Static runtime library. |
| add_compiler_rt_component(hwasan) |
| |
| add_compiler_rt_object_libraries(RTHwasan |
| ARCHS ${HWASAN_SUPPORTED_ARCH} |
| SOURCES ${HWASAN_RTL_SOURCES} |
| ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS} |
| CFLAGS ${HWASAN_RTL_CFLAGS} |
| DEFS ${HWASAN_DEFINITIONS}) |
| add_compiler_rt_object_libraries(RTHwasan_cxx |
| ARCHS ${HWASAN_SUPPORTED_ARCH} |
| SOURCES ${HWASAN_RTL_CXX_SOURCES} |
| ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS} |
| CFLAGS ${HWASAN_RTL_CFLAGS} |
| DEFS ${HWASAN_DEFINITIONS}) |
| add_compiler_rt_object_libraries(RTHwasan_dynamic |
| ARCHS ${HWASAN_SUPPORTED_ARCH} |
| SOURCES ${HWASAN_RTL_SOURCES} ${HWASAN_RTL_CXX_SOURCES} |
| ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS} |
| CFLAGS ${HWASAN_DYNAMIC_CFLAGS} |
| DEFS ${HWASAN_DEFINITIONS}) |
| |
| file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp "") |
| add_compiler_rt_object_libraries(RTHwasan_dynamic_version_script_dummy |
| ARCHS ${HWASAN_SUPPORTED_ARCH} |
| SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp |
| CFLAGS ${HWASAN_DYNAMIC_CFLAGS} |
| DEFS ${HWASAN_DEFINITIONS}) |
| |
| # If use_aliases is TRUE, adds the HWASan runtime built with alias support. |
| # Otherwise adds the runtime without alias support. |
| function(add_hwasan_runtimes arch use_aliases) |
| set(hwasan_object_lib RTHwasan) |
| set(hwasan_object_dyn_lib RTHwasan_dynamic) |
| set(hwasan_runtime clang_rt.hwasan) |
| set(hwasan_rtl_flags ${HWASAN_RTL_CFLAGS}) |
| set(hwasan_dyn_flags ${HWASAN_DYNAMIC_CFLAGS}) |
| if(use_aliases) |
| list(APPEND hwasan_rtl_flags -DHWASAN_ALIASING_MODE) |
| list(APPEND hwasan_dyn_flags -DHWASAN_ALIASING_MODE) |
| add_compiler_rt_object_libraries(RTHwasanAliases |
| ARCHS ${arch} |
| SOURCES ${HWASAN_RTL_SOURCES} |
| ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS} |
| CFLAGS ${hwasan_rtl_flags} |
| DEFS ${HWASAN_DEFINITIONS}) |
| add_compiler_rt_object_libraries(RTHwasanAliases_dynamic |
| ARCHS ${arch} |
| SOURCES ${HWASAN_RTL_SOURCES} ${HWASAN_RTL_CXX_SOURCES} |
| ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS} |
| CFLAGS ${hwasan_dyn_flags} |
| DEFS ${HWASAN_DEFINITIONS}) |
| |
| set(hwasan_object_lib RTHwasanAliases) |
| set(hwasan_object_dyn_lib RTHwasanAliases_dynamic) |
| set(hwasan_runtime clang_rt.hwasan_aliases) |
| endif() |
| add_compiler_rt_runtime(${hwasan_runtime} |
| STATIC |
| ARCHS ${arch} |
| OBJECT_LIBS ${hwasan_object_lib} |
| RTInterception |
| RTSanitizerCommon |
| RTSanitizerCommonLibc |
| RTSanitizerCommonCoverage |
| RTSanitizerCommonSymbolizer |
| RTUbsan |
| CFLAGS ${hwasan_rtl_flags} |
| PARENT_TARGET hwasan) |
| add_compiler_rt_runtime(${hwasan_runtime}_cxx |
| STATIC |
| ARCHS ${arch} |
| OBJECT_LIBS RTHwasan_cxx |
| RTUbsan_cxx |
| CFLAGS ${hwasan_rtl_flags} |
| PARENT_TARGET hwasan) |
| |
| if (UNIX) |
| add_sanitizer_rt_version_list(${hwasan_runtime}-dynamic-${arch} |
| LIBS ${hwasan_runtime}-${arch} ${hwasan_runtime}_cxx-${arch} |
| EXTRA hwasan.syms.extra) |
| set(VERSION_SCRIPT_FLAG |
| -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${hwasan_runtime}-dynamic-${arch}.vers) |
| set_property(SOURCE |
| ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp |
| APPEND PROPERTY |
| OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${hwasan_runtime}-dynamic-${arch}.vers) |
| else() |
| set(VERSION_SCRIPT_FLAG) |
| endif() |
| |
| |
| add_compiler_rt_runtime(${hwasan_runtime} |
| SHARED |
| ARCHS ${arch} |
| OBJECT_LIBS |
| ${hwasan_object_dyn_lib} |
| RTInterception |
| RTSanitizerCommon |
| RTSanitizerCommonLibc |
| RTSanitizerCommonCoverage |
| RTSanitizerCommonSymbolizer |
| RTUbsan |
| RTUbsan_cxx |
| # The only purpose of RTHWAsan_dynamic_version_script_dummy is to |
| # carry a dependency of the shared runtime on the version script. |
| # Replacing it with a straightforward |
| # add_dependencies(clang_rt.asan-dynamic-${arch} clang_rt.asan-dynamic-${arch}-version-list) |
| # generates an order-only dependency in ninja. |
| RTHwasan_dynamic_version_script_dummy |
| CFLAGS ${hwasan_dyn_flags} |
| LINK_FLAGS ${HWASAN_DYNAMIC_LINK_FLAGS} |
| ${VERSION_SCRIPT_FLAG} |
| LINK_LIBS ${HWASAN_DYNAMIC_LIBS} |
| DEFS ${ASAN_DYNAMIC_DEFINITIONS} |
| PARENT_TARGET hwasan) |
| |
| if(SANITIZER_USE_SYMBOLS) |
| add_sanitizer_rt_symbols(${hwasan_runtime} |
| ARCHS ${arch} |
| EXTRA hwasan.syms.extra) |
| add_sanitizer_rt_symbols(${hwasan_runtime}_cxx |
| ARCHS ${arch} |
| EXTRA hwasan.syms.extra) |
| add_dependencies(hwasan ${hwasan_runtime}-${arch}-symbols |
| ${hwasan_runtime}_cxx-${arch}-symbols) |
| endif() |
| endfunction() |
| |
| foreach(arch ${HWASAN_SUPPORTED_ARCH}) |
| add_hwasan_runtimes(${arch} FALSE) |
| if(${arch} MATCHES "x86_64") |
| add_hwasan_runtimes(${arch} TRUE) |
| endif() |
| endforeach() |
| |
| add_compiler_rt_resource_file(hwasan_ignorelist hwasan_ignorelist.txt hwasan) |
| |
| add_subdirectory("scripts") |
| |
| # if(COMPILER_RT_INCLUDE_TESTS) |
| # add_subdirectory(tests) |
| # endif() |