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_riscv64.S hwasan_setjmp_x86_64.S hwasan_tag_mismatch_aarch64.S hwasan_tag_mismatch_riscv64.S hwasan_thread.cpp hwasan_thread_list.cpp hwasan_type_test.cpp ) 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()