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_thread.cpp
hwasan_thread_list.cpp
hwasan_type_test.cpp
)
foreach(arch ${HWASAN_SUPPORTED_ARCH})
if(${arch} MATCHES "aarch64")
list(APPEND HWASAN_RTL_SOURCES
hwasan_setjmp_aarch64.S
hwasan_tag_mismatch_aarch64.S)
endif()
if(${arch} MATCHES "riscv64")
list(APPEND HWASAN_RTL_SOURCES
hwasan_setjmp_riscv64.S
hwasan_tag_mismatch_riscv64.S)
endif()
if(${arch} MATCHES "x86_64")
list(APPEND HWASAN_RTL_SOURCES
hwasan_setjmp_x86_64.S)
endif()
endforeach()
set(HWASAN_RTL_CXX_SOURCES
hwasan_new_delete.cpp
)
set(HWASAN_RTL_PREINIT_SOURCES
hwasan_preinit.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
${COMPILER_RT_UNWINDER_LINK_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})
add_compiler_rt_object_libraries(RTHwasan_preinit
ARCHS ${HWASAN_SUPPORTED_ARCH}
SOURCES ${HWASAN_RTL_PREINIT_SOURCES}
ADDITIONAL_HEADERS ${HWASAN_RTL_HEADERS}
CFLAGS ${HWASAN_RTL_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}
RTHwasan_preinit
RTInterception
RTSanitizerCommon
RTSanitizerCommonLibc
RTSanitizerCommonCoverage
RTSanitizerCommonSymbolizer
RTSanitizerCommonSymbolizerInternal
RTLSanCommon
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
RTSanitizerCommonSymbolizerInternal
RTLSanCommon
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_runtime(clang_rt.hwasan-preinit
STATIC
ARCHS ${HWASAN_SUPPORTED_ARCH}
OBJECT_LIBS RTHwasan_preinit
CFLAGS ${HWASAN_RTL_CFLAGS}
PARENT_TARGET hwasan)
add_compiler_rt_resource_file(hwasan_ignorelist hwasan_ignorelist.txt hwasan)
add_subdirectory("scripts")
# if(COMPILER_RT_INCLUDE_TESTS)
# add_subdirectory(tests)
# endif()