leonardchan updated this revision to Diff 345931. leonardchan added a comment.
Update to some feedback from first round of reviews. Minor refactoring of code that can be shared between the linux and fuchsia implementations. Still need to discuss refactoring the hwasan threads implementation. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D91466/new/ https://reviews.llvm.org/D91466 Files: clang/cmake/caches/Fuchsia-stage2.cmake compiler-rt/cmake/config-ix.cmake compiler-rt/lib/hwasan/CMakeLists.txt compiler-rt/lib/hwasan/hwasan.cpp compiler-rt/lib/hwasan/hwasan.h compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp compiler-rt/lib/hwasan/hwasan_fuchsia.cpp compiler-rt/lib/hwasan/hwasan_interceptors.cpp compiler-rt/lib/hwasan/hwasan_interface_internal.h compiler-rt/lib/hwasan/hwasan_linux.cpp compiler-rt/lib/hwasan/hwasan_poisoning.cpp compiler-rt/lib/hwasan/hwasan_thread.cpp compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_fuchsia.h compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp
Index: compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp =================================================================== --- compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp +++ compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp @@ -54,6 +54,10 @@ return false; } +// This is mainly used by hwasan for online symbolization. This isn't needed +// since hwasan can always just dump stack frames for offline symbolization. +bool Symbolizer::SymbolizeFrame(uptr addr, FrameInfo *info) { return false; } + // This is used in some places for suppression checking, which we // don't really support for Fuchsia. It's also used in UBSan to // identify a PC location to a function name, so we always fill in Index: compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_fuchsia.h =================================================================== --- /dev/null +++ compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_fuchsia.h @@ -0,0 +1,25 @@ +//===-- sanitizer_platform_limits_fuchsia.h -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file is a part of Sanitizer common code. +// +// Sizes and layouts of platform-specific Fuchsia data structures. +//===----------------------------------------------------------------------===// + +#ifndef SANITIZER_PLATFORM_LIMITS_FUCHSIA_H +#define SANITIZER_PLATFORM_LIMITS_FUCHSIA_H + +#if SANITIZER_FUCHSIA + +namespace __sanitizer { +struct __sanitizer_struct_mallinfo {}; +} // namespace __sanitizer + +#endif // SANITIZER_FUCHSIA + +#endif Index: compiler-rt/lib/hwasan/hwasan_thread.cpp =================================================================== --- compiler-rt/lib/hwasan/hwasan_thread.cpp +++ compiler-rt/lib/hwasan/hwasan_thread.cpp @@ -51,12 +51,18 @@ // ScopedTaggingDisable needs GetCurrentThread to be set up. ScopedTaggingDisabler disabler; +#if !SANITIZER_FUCHSIA uptr tls_size; uptr stack_size; GetThreadStackAndTls(IsMainThread(), &stack_bottom_, &stack_size, &tls_begin_, &tls_size); stack_top_ = stack_bottom_ + stack_size; tls_end_ = tls_begin_ + tls_size; +#else + __sanitizer::GetThreadStackTopAndBottom(true, &stack_top_, + &stack_bottom_); + tls_end_ = tls_begin_ = 0; +#endif if (stack_bottom_) { int local; Index: compiler-rt/lib/hwasan/hwasan_poisoning.cpp =================================================================== --- compiler-rt/lib/hwasan/hwasan_poisoning.cpp +++ compiler-rt/lib/hwasan/hwasan_poisoning.cpp @@ -22,6 +22,10 @@ uptr TagMemoryAligned(uptr p, uptr size, tag_t tag) { CHECK(IsAligned(p, kShadowAlignment)); CHECK(IsAligned(size, kShadowAlignment)); +#if SANITIZER_FUCHSIA + __sanitizer_fill_shadow(p, size, tag, + common_flags()->clear_shadow_mmap_threshold); +#else uptr shadow_start = MemToShadow(p); uptr shadow_size = MemToShadowSize(size); @@ -40,6 +44,7 @@ } else { internal_memset((void *)shadow_start, tag, shadow_size); } +#endif return AddTagToPointer(p, tag); } Index: compiler-rt/lib/hwasan/hwasan_linux.cpp =================================================================== --- compiler-rt/lib/hwasan/hwasan_linux.cpp +++ compiler-rt/lib/hwasan/hwasan_linux.cpp @@ -242,18 +242,6 @@ return p >= kHighMemStart || (p >= kLowMemStart && p <= kLowMemEnd); } -static void HwasanAtExit(void) { - if (common_flags()->print_module_map) - DumpProcessMap(); - if (flags()->print_stats && (flags()->atexit || hwasan_report_count > 0)) - ReportStats(); - if (hwasan_report_count > 0) { - // ReportAtExitStatistics(); - if (common_flags()->exitcode) - internal__exit(common_flags()->exitcode); - } -} - void InstallAtExitHandler() { atexit(HwasanAtExit); } @@ -338,14 +326,6 @@ return hwasanThreadList().GetThreadByBufferAddress((uptr)R->Next()); } -struct AccessInfo { - uptr addr; - uptr size; - bool is_store; - bool is_load; - bool recover; -}; - static AccessInfo GetAccessInfo(siginfo_t *info, ucontext_t *uc) { // Access type is passed in a platform dependent way (see below) and encoded // as 0xXY, where X&1 is 1 for store, 0 for load, and X&2 is 1 if the error is @@ -396,28 +376,6 @@ return AccessInfo{addr, size, is_store, !is_store, recover}; } -static void HandleTagMismatch(AccessInfo ai, uptr pc, uptr frame, - ucontext_t *uc, uptr *registers_frame = nullptr) { - InternalMmapVector<BufferedStackTrace> stack_buffer(1); - BufferedStackTrace *stack = stack_buffer.data(); - stack->Reset(); - stack->Unwind(pc, frame, uc, common_flags()->fast_unwind_on_fatal); - - // The second stack frame contains the failure __hwasan_check function, as - // we have a stack frame for the registers saved in __hwasan_tag_mismatch that - // we wish to ignore. This (currently) only occurs on AArch64, as x64 - // implementations use SIGTRAP to implement the failure, and thus do not go - // through the stack saver. - if (registers_frame && stack->trace && stack->size > 0) { - stack->trace++; - stack->size--; - } - - bool fatal = flags()->halt_on_error || !ai.recover; - ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store, fatal, - registers_frame); -} - static bool HwasanOnSIGTRAP(int signo, siginfo_t *info, ucontext_t *uc) { AccessInfo ai = GetAccessInfo(info, uc); if (!ai.is_store && !ai.is_load) @@ -457,20 +415,7 @@ // rest of the mismatch handling code (C++). void __hwasan_tag_mismatch4(uptr addr, uptr access_info, uptr *registers_frame, size_t outsize) { - __hwasan::AccessInfo ai; - ai.is_store = access_info & 0x10; - ai.is_load = !ai.is_store; - ai.recover = access_info & 0x20; - ai.addr = addr; - if ((access_info & 0xf) == 0xf) - ai.size = outsize; - else - ai.size = 1 << (access_info & 0xf); - - __hwasan::HandleTagMismatch(ai, (uptr)__builtin_return_address(0), - (uptr)__builtin_frame_address(0), nullptr, - registers_frame); - __builtin_unreachable(); + __hwasan::HwasanTagMismatch(addr, access_info, registers_frame, outsize); } #endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD Index: compiler-rt/lib/hwasan/hwasan_interface_internal.h =================================================================== --- compiler-rt/lib/hwasan/hwasan_interface_internal.h +++ compiler-rt/lib/hwasan/hwasan_interface_internal.h @@ -15,6 +15,7 @@ #define HWASAN_INTERFACE_INTERNAL_H #include "sanitizer_common/sanitizer_internal_defs.h" +#include "sanitizer_common/sanitizer_platform_limits_fuchsia.h" #include "sanitizer_common/sanitizer_platform_limits_posix.h" #include <link.h> Index: compiler-rt/lib/hwasan/hwasan_interceptors.cpp =================================================================== --- compiler-rt/lib/hwasan/hwasan_interceptors.cpp +++ compiler-rt/lib/hwasan/hwasan_interceptors.cpp @@ -21,6 +21,7 @@ #include "hwasan_thread.h" #include "hwasan_poisoning.h" #include "hwasan_report.h" +#include "sanitizer_common/sanitizer_platform_limits_fuchsia.h" #include "sanitizer_common/sanitizer_platform_limits_posix.h" #include "sanitizer_common/sanitizer_allocator.h" #include "sanitizer_common/sanitizer_allocator_interface.h" @@ -303,6 +304,7 @@ #endif // HWASAN_WITH_INTERCEPTORS && __aarch64__ +#if HWASAN_WITH_INTERCEPTORS static void BeforeFork() { StackDepotLockAll(); } @@ -318,6 +320,7 @@ AfterFork(); return pid; } +#endif // HWASAN_WITH_INTERCEPTORS namespace __hwasan { @@ -334,9 +337,9 @@ static int inited = 0; CHECK_EQ(inited, 0); +#if HWASAN_WITH_INTERCEPTORS INTERCEPT_FUNCTION(fork); -#if HWASAN_WITH_INTERCEPTORS #if defined(__linux__) INTERCEPT_FUNCTION(vfork); #endif // __linux__ Index: compiler-rt/lib/hwasan/hwasan_fuchsia.cpp =================================================================== --- /dev/null +++ compiler-rt/lib/hwasan/hwasan_fuchsia.cpp @@ -0,0 +1,120 @@ +//===-- hwasan_fuchsia.cpp --------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file is a part of HWAddressSanitizer and contains Fuchsia-specific +/// code. +/// +//===----------------------------------------------------------------------===// + +#include "sanitizer_common/sanitizer_fuchsia.h" +#if SANITIZER_FUCHSIA + +#include "hwasan.h" +#include "hwasan_interface_internal.h" +#include "hwasan_thread.h" +#include "hwasan_report.h" +#include "hwasan_thread_list.h" + +SANITIZER_INTERFACE_ATTRIBUTE +THREADLOCAL uptr __hwasan_tls; + +namespace __hwasan { + +uptr kHighMemEnd; +uptr kHighMemBeg; +uptr kAliasRegionStart = 0; // Always 0 on non-x86. + +bool InitShadow() { + __hwasan_shadow_memory_dynamic_address = 0; + + // This initializes __sanitizer::ShadowBounds. + kHighMemEnd = GetMaxUserVirtualAddress(); + kHighMemBeg = __sanitizer::ShadowBounds.shadow_limit; + + CHECK_EQ(kHighMemEnd, __sanitizer::ShadowBounds.memory_limit - 1); + CHECK_EQ(kHighMemBeg, __sanitizer::ShadowBounds.shadow_limit); + CHECK_NE(kHighMemBeg, 0); + + return true; +} + +void InitThreads() { + uptr alloc_size = UINT64_C(1) << kShadowBaseAlignment; + uptr thread_start = reinterpret_cast<uptr>( + MmapAlignedOrDieOnFatalError(alloc_size, alloc_size, __func__)); + InitThreadList(thread_start, thread_start + alloc_size); +} + +void InitPrctl() {} + +bool MemIsApp(uptr p) { + CHECK(GetTagFromPointer(p) == 0); + return kHighMemBeg <= p && p <= kHighMemEnd; +} + +void InstallAtExitHandler() {} + +// ---------------------- TSD ---------------- {{{ + +extern "C" { +void __sanitizer_thread_start_hook(void *hook, thrd_t self) { + hwasanThreadList().CreateCurrentThread()->InitRandomState(); +} + +void __sanitizer_thread_exit_hook(void *hook, thrd_t self) { + Thread *t = GetCurrentThread(); + // Make sure that signal handler can not see a stale current thread pointer. + atomic_signal_fence(memory_order_seq_cst); + if (t) + hwasanThreadList().ReleaseThread(t); +} + +void __sanitizer_exit() { + __hwasan::HwasanAtExit(); +} +} // extern "C" + +void HwasanTSDInit() {} +void HwasanTSDThreadInit() {} + +static THREADLOCAL uptr __hwasan_tls; + +uptr *GetCurrentThreadLongPtr() { + return &__hwasan_tls; +} + +void AndroidTestTlsSlot() {} + +Thread *GetCurrentThread() { + uptr *ThreadLongPtr = GetCurrentThreadLongPtr(); + if (UNLIKELY(*ThreadLongPtr == 0)) + return nullptr; + auto *R = (StackAllocationsRingBuffer *)ThreadLongPtr; + return hwasanThreadList().GetThreadByBufferAddress((uptr)R->Next()); +} + +// Entry point stub for interoperability between __hwasan_tag_mismatch (ASM) and +// the rest of the mismatch handling code (C++). +extern "C" void __hwasan_tag_mismatch4(uptr addr, uptr access_info, + uptr *registers_frame, size_t outsize) { + __hwasan::HwasanTagMismatch(addr, access_info, registers_frame, outsize); +} + +static void OnStackUnwind(const SignalContext &sig, const void *, + BufferedStackTrace *stack) { + stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context, + common_flags()->fast_unwind_on_fatal); +} + +// TODO: Do we need this? +void HwasanOnDeadlySignal(int signo, void *info, void *context) {} + +} // namespace __hwasan + +#endif // SANITIZER_FUCHSIA Index: compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp =================================================================== --- compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp +++ compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp @@ -21,7 +21,9 @@ #include "hwasan_mapping.h" #include "hwasan_thread_list.h" #include "sanitizer_common/sanitizer_common.h" +#if SANITIZER_POSIX #include "sanitizer_common/sanitizer_posix.h" +#endif // The code in this file needs to run in an unrelocated binary. It should not // access any external symbol, including its own non-hidden globals. @@ -113,6 +115,14 @@ } } // namespace __hwasan +#elif SANITIZER_FUCHSIA + +namespace __hwasan { + +void InitShadowGOT() {} + +} // namespace __hwasan + #else namespace __hwasan { Index: compiler-rt/lib/hwasan/hwasan.h =================================================================== --- compiler-rt/lib/hwasan/hwasan.h +++ compiler-rt/lib/hwasan/hwasan.h @@ -138,6 +138,7 @@ void HwasanTSDInit(); void HwasanTSDThreadInit(); +void HwasanAtExit(void); void HwasanOnDeadlySignal(int signo, void *info, void *context); @@ -147,6 +148,21 @@ void AndroidTestTlsSlot(); +// This is a compiler-generated struct that can be shared between hwasan +// implementations. +struct AccessInfo { + uptr addr; + uptr size; + bool is_store; + bool is_load; + bool recover; +}; + +void HandleTagMismatch(AccessInfo ai, uptr pc, uptr frame, + void *uc, uptr *registers_frame = nullptr); +void HwasanTagMismatch(uptr addr, uptr access_info, + uptr *registers_frame, size_t outsize); + } // namespace __hwasan #define HWASAN_MALLOC_HOOK(ptr, size) \ Index: compiler-rt/lib/hwasan/hwasan.cpp =================================================================== --- compiler-rt/lib/hwasan/hwasan.cpp +++ compiler-rt/lib/hwasan/hwasan.cpp @@ -180,6 +180,58 @@ void UpdateMemoryUsage() {} #endif +void HwasanAtExit(void) { + if (common_flags()->print_module_map) + DumpProcessMap(); + if (flags()->print_stats && (flags()->atexit || hwasan_report_count > 0)) + ReportStats(); + if (hwasan_report_count > 0) { + // ReportAtExitStatistics(); + if (common_flags()->exitcode) + internal__exit(common_flags()->exitcode); + } +} + +void HandleTagMismatch(AccessInfo ai, uptr pc, uptr frame, + void *uc, uptr *registers_frame) { + InternalMmapVector<BufferedStackTrace> stack_buffer(1); + BufferedStackTrace *stack = stack_buffer.data(); + stack->Reset(); + stack->Unwind(pc, frame, uc, common_flags()->fast_unwind_on_fatal); + + // The second stack frame contains the failure __hwasan_check function, as + // we have a stack frame for the registers saved in __hwasan_tag_mismatch that + // we wish to ignore. This (currently) only occurs on AArch64, as x64 + // implementations use SIGTRAP to implement the failure, and thus do not go + // through the stack saver. + if (registers_frame && stack->trace && stack->size > 0) { + stack->trace++; + stack->size--; + } + + bool fatal = flags()->halt_on_error || !ai.recover; + ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store, fatal, + registers_frame); +} + +void HwasanTagMismatch(uptr addr, uptr access_info, + uptr *registers_frame, size_t outsize) { + AccessInfo ai; + ai.is_store = access_info & 0x10; + ai.is_load = !ai.is_store; + ai.recover = access_info & 0x20; + ai.addr = addr; + if ((access_info & 0xf) == 0xf) + ai.size = outsize; + else + ai.size = 1 << (access_info & 0xf); + + HandleTagMismatch(ai, (uptr)__builtin_return_address(0), + (uptr)__builtin_frame_address(0), nullptr, + registers_frame); + __builtin_unreachable(); +} + } // namespace __hwasan using namespace __hwasan; Index: compiler-rt/lib/hwasan/CMakeLists.txt =================================================================== --- compiler-rt/lib/hwasan/CMakeLists.txt +++ compiler-rt/lib/hwasan/CMakeLists.txt @@ -6,6 +6,7 @@ hwasan_allocator.cpp hwasan_dynamic_shadow.cpp hwasan_exceptions.cpp + hwasan_fuchsia.cpp hwasan_globals.cpp hwasan_interceptors.cpp hwasan_interceptors_vfork.S @@ -41,7 +42,11 @@ ) set(HWASAN_DEFINITIONS) -append_list_if(COMPILER_RT_HWASAN_WITH_INTERCEPTORS HWASAN_WITH_INTERCEPTORS=1 HWASAN_DEFINITIONS) +if (NOT FUCHSIA) + append_list_if(COMPILER_RT_HWASAN_WITH_INTERCEPTORS HWASAN_WITH_INTERCEPTORS=1 HWASAN_DEFINITIONS) +else() + 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) Index: compiler-rt/cmake/config-ix.cmake =================================================================== --- compiler-rt/cmake/config-ix.cmake +++ compiler-rt/cmake/config-ix.cmake @@ -702,7 +702,7 @@ endif() if (COMPILER_RT_HAS_SANITIZER_COMMON AND HWASAN_SUPPORTED_ARCH AND - OS_NAME MATCHES "Linux|Android") + OS_NAME MATCHES "Linux|Android|Fuchsia") set(COMPILER_RT_HAS_HWASAN TRUE) else() set(COMPILER_RT_HAS_HWASAN FALSE) Index: clang/cmake/caches/Fuchsia-stage2.cmake =================================================================== --- clang/cmake/caches/Fuchsia-stage2.cmake +++ clang/cmake/caches/Fuchsia-stage2.cmake @@ -237,7 +237,37 @@ list(APPEND RUNTIME_BUILD_ID_LINK "${target}-unknown-fuchsia") endforeach() - set(LLVM_RUNTIME_MULTILIBS "asan;noexcept;asan+noexcept;relative-vtables;relative-vtables+noexcept;relative-vtables+asan;relative-vtables+asan+noexcept" CACHE STRING "") + # HWAsan + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan_LLVM_BUILD_COMPILER_RT OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan_LLVM_USE_SANITIZER "HWAddress" CACHE STRING "") + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan_LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan_LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS OFF CACHE BOOL "") + + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan_LLVM_BUILD_COMPILER_RT OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan_LLVM_USE_SANITIZER "HWAddress" CACHE STRING "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan_LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan_LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan_CMAKE_CXX_FLAGS "${RUNTIMES_${target}-unknown-fuchsia+relative-vtables+hwasan_CMAKE_CXX_FLAGS} -Xclang -fexperimental-relative-c++-abi-vtables" CACHE STRING "") + + # HWASan+noexcept + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan+noexcept_LLVM_BUILD_COMPILER_RT OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan+noexcept_LLVM_USE_SANITIZER "HWAddress" CACHE STRING "") + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan+noexcept_LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan+noexcept_LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan+noexcept_LIBCXXABI_ENABLE_EXCEPTIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+hwasan+noexcept_LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "") + + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan+noexcept_LLVM_BUILD_COMPILER_RT OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan+noexcept_LLVM_USE_SANITIZER "HWAddress" CACHE STRING "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan+noexcept_LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan+noexcept_LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan+noexcept_LIBCXXABI_ENABLE_EXCEPTIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan+noexcept_LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "") + set(RUNTIMES_aarch64-unknown-fuchsia+relative-vtables+hwasan+noexcept_CMAKE_CXX_FLAGS "${RUNTIMES_${target}-unknown-fuchsia+relative-vtables+hwasan+noexcept_CMAKE_CXX_FLAGS} -Xclang -fexperimental-relative-c++-abi-vtables" CACHE STRING "") + + set(LLVM_RUNTIME_MULTILIBS + "asan;noexcept;asan+noexcept;relative-vtables;relative-vtables+noexcept;relative-vtables+asan;relative-vtables+asan+noexcept;hwasan;hwasan+noexcept;relative-vtables+hwasan;relative-vtables+hwasan+noexcept" CACHE STRING "") + set(LLVM_RUNTIME_MULTILIB_asan_TARGETS "x86_64-unknown-fuchsia;aarch64-unknown-fuchsia" CACHE STRING "") set(LLVM_RUNTIME_MULTILIB_noexcept_TARGETS "x86_64-unknown-fuchsia;aarch64-unknown-fuchsia" CACHE STRING "") set(LLVM_RUNTIME_MULTILIB_asan+noexcept_TARGETS "x86_64-unknown-fuchsia;aarch64-unknown-fuchsia" CACHE STRING "") @@ -245,6 +275,10 @@ set(LLVM_RUNTIME_MULTILIB_relative-vtables+noexcept_TARGETS "x86_64-unknown-fuchsia;aarch64-unknown-fuchsia" CACHE STRING "") set(LLVM_RUNTIME_MULTILIB_relative-vtables+asan_TARGETS "x86_64-unknown-fuchsia;aarch64-unknown-fuchsia" CACHE STRING "") set(LLVM_RUNTIME_MULTILIB_relative-vtables+asan+noexcept_TARGETS "x86_64-unknown-fuchsia;aarch64-unknown-fuchsia" CACHE STRING "") + set(LLVM_RUNTIME_MULTILIB_hwasan_TARGETS "aarch64-unknown-fuchsia" CACHE STRING "") + set(LLVM_RUNTIME_MULTILIB_hwasan+noexcept_TARGETS "aarch64-unknown-fuchsia" CACHE STRING "") + set(LLVM_RUNTIME_MULTILIB_relative-vtables+hwasan_TARGETS "aarch64-unknown-fuchsia" CACHE STRING "") + set(LLVM_RUNTIME_MULTILIB_relative-vtables+hwasan+noexcept_TARGETS "aarch64-unknown-fuchsia" CACHE STRING "") endif() set(LLVM_BUILTIN_TARGETS "${BUILTIN_TARGETS}" CACHE STRING "")
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits