From 7fa10100d977ac79e359c5b9a299365e954ba341 Mon Sep 17 00:00:00 2001 From: Alexander Sukhikh Date: Thu, 21 Dec 2023 23:36:31 +0300 Subject: [PATCH 1/2] [compiler-rt] Make hwasan work on ohos Issue: https://gitee.com/openharmony/third_party_llvm-project/issues/I7V4BS Signed-off-by: Lighting Artist --- compiler-rt/CMakeLists.txt | 2 +- compiler-rt/lib/hwasan/CMakeLists.txt | 8 +++++++ .../lib/hwasan/hwasan_dynamic_shadow.cpp | 2 +- .../lib/hwasan/hwasan_setjmp_aarch64.S | 7 ++++++ .../sanitizer_linux_libcdep.cpp | 22 +++++++++++++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt index b5160f9a048c..c62103d21c22 100644 --- a/compiler-rt/CMakeLists.txt +++ b/compiler-rt/CMakeLists.txt @@ -799,7 +799,7 @@ if (LINKER_IS_LLD OR LLVM_TOOL_LLD_BUILD) endif() endif() -if(ANDROID) +if(ANDROID OR OHOS) # OHOS_LOCAL set(COMPILER_RT_HAS_LLD TRUE) set(COMPILER_RT_TEST_USE_LLD TRUE) append_list_if(COMPILER_RT_HAS_FUSE_LD_LLD_FLAG -fuse-ld=lld SANITIZER_COMMON_LINK_FLAGS) diff --git a/compiler-rt/lib/hwasan/CMakeLists.txt b/compiler-rt/lib/hwasan/CMakeLists.txt index 086079c7536e..300954110119 100644 --- a/compiler-rt/lib/hwasan/CMakeLists.txt +++ b/compiler-rt/lib/hwasan/CMakeLists.txt @@ -78,6 +78,14 @@ append_list_if(COMPILER_RT_HAS_FFREESTANDING_FLAG -ffreestanding HWASAN_RTL_CFLA # Too many existing bugs, needs cleanup. append_list_if(COMPILER_RT_HAS_WNO_FORMAT -Wno-format HWASAN_RTL_CFLAGS) +# OHOS_LOCAL begin +# OHOS can't use emulated tls with hwasan - +# it leads to infinite recursion when creating new thread. +if(OHOS) + list(APPEND HWASAN_RTL_CFLAGS -fno-emulated-tls) +endif() +#OHOS_LOCAL end + set(HWASAN_DYNAMIC_LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS}) if(ANDROID) diff --git a/compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp b/compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp index 9bf9e7eeaa61..8a70a9e83f16 100644 --- a/compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp +++ b/compiler-rt/lib/hwasan/hwasan_dynamic_shadow.cpp @@ -26,7 +26,7 @@ // 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. -#if SANITIZER_ANDROID || SANITIZER_OHOS +#if SANITIZER_ANDROID // OHOS_LOCAL extern "C" { INTERFACE_ATTRIBUTE void __hwasan_shadow(); diff --git a/compiler-rt/lib/hwasan/hwasan_setjmp_aarch64.S b/compiler-rt/lib/hwasan/hwasan_setjmp_aarch64.S index 0c0abb6de861..5d01c307dc75 100644 --- a/compiler-rt/lib/hwasan/hwasan_setjmp_aarch64.S +++ b/compiler-rt/lib/hwasan/hwasan_setjmp_aarch64.S @@ -89,6 +89,13 @@ ASM_INTERCEPTOR_TRAMPOLINE(sigsetjmp) #if SANITIZER_ANDROID ASM_TRAMPOLINE_ALIAS(sigsetjmp, sigsetjmp) ASM_TRAMPOLINE_ALIAS(setjmp, setjmp_bionic) +// OHOS_LOCAL begin +#elif SANITIZER_OHOS +// musl's setjmp, _setjmp, __setjmp are the same +// also musl's sigsetjmp, __sigsetjmp are the same +ASM_TRAMPOLINE_ALIAS(sigsetjmp, sigsetjmp) +ASM_TRAMPOLINE_ALIAS( __sigsetjmp, sigsetjmp) +ASM_TRAMPOLINE_ALIAS(setjmp, setjmp) #else ASM_TRAMPOLINE_ALIAS(__sigsetjmp, sigsetjmp) #endif diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index 236ca65ec4a6..26c0daf69c05 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -642,10 +642,32 @@ void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size, if (!main) { // If stack and tls intersect, make them non-intersecting. if (*tls_addr > *stk_addr && *tls_addr < *stk_addr + *stk_size) { + // OHOS_LOCAL begin +#ifndef SANITIZER_OHOS if (*stk_addr + *stk_size < *tls_addr + *tls_size) *tls_size = *stk_addr + *stk_size - *tls_addr; *stk_size = *tls_addr - *stk_addr; } +#else + // Always move tls to the end of thread's stack. + // This is how it works before the + // "https://github.com/llvm/llvm-project/commit/9be8f8b34d9b150cd1811e3556fe9d0cd735ae29". + // ^ In the new version if stack and thread intersects, + // then the stack size is reduced. (see the "ifndef" version) + // I didn't find the reason why it is done like that, + // but it breaks unwinding on OHOS (frame pointer considered out of stack bounds and unwinding stops). + // So I've returned previous version for OHOS only. + if (*stk_addr + *stk_size < *tls_addr + *tls_size) { + *tls_size = *tls_addr + *tls_size - *stk_addr - *stk_size; + *tls_addr = *stk_addr + *stk_size; + } + else { + *tls_size = *stk_addr + *stk_size - *tls_addr; + *stk_size = *tls_addr - *stk_addr; + } +#endif + } + // OHOS_LOCAL end } # endif } -- Gitee From 405c9c1d3ba255aeca0ac92a66cd9221524335f9 Mon Sep 17 00:00:00 2001 From: Nikolai Kholiavin Date: Tue, 6 Feb 2024 00:57:23 +0000 Subject: [PATCH 2/2] [TSan][OHOS] Support TSan for OHOS This enables TSan in clang driver for OHOS targets. Testing support is to be added in a subsequent PR. This also disables interceptors on OHOS targets for some of the functions, which are not exported from our musl. Issue: https://gitee.com/openharmony/third_party_llvm-project/issues/I90RVC Signed-off-by: Nikolai Kholiavin Signed-off-by: Lighting Artist --- clang/lib/Driver/ToolChains/OHOS.cpp | 4 ++++ compiler-rt/lib/sanitizer_common/CMakeLists.txt | 6 ++++++ .../lib/sanitizer_common/sanitizer_platform_interceptors.h | 3 ++- compiler-rt/lib/tsan/CMakeLists.txt | 6 ++++++ compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp | 4 ++-- 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp index 449ae8ed0df0..c4c93e42d303 100644 --- a/clang/lib/Driver/ToolChains/OHOS.cpp +++ b/clang/lib/Driver/ToolChains/OHOS.cpp @@ -385,6 +385,8 @@ void OHOS::addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const { } SanitizerMask OHOS::getSupportedSanitizers() const { + const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64; + const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64; SanitizerMask Res = ToolChain::getSupportedSanitizers(); Res |= SanitizerKind::Address; Res |= SanitizerKind::PointerCompare; @@ -401,6 +403,8 @@ SanitizerMask OHOS::getSupportedSanitizers() const { Res |= SanitizerKind::HWAddress; // TODO: kASAN for liteos ?? // TODO: Support TSAN and HWASAN and update mask. + if (IsAArch64 || IsX86_64) + Res |= SanitizerKind::Thread; return Res; } diff --git a/compiler-rt/lib/sanitizer_common/CMakeLists.txt b/compiler-rt/lib/sanitizer_common/CMakeLists.txt index 66f2d259aa5f..ef03b15cf701 100644 --- a/compiler-rt/lib/sanitizer_common/CMakeLists.txt +++ b/compiler-rt/lib/sanitizer_common/CMakeLists.txt @@ -229,6 +229,12 @@ append_list_if(SANITIZER_LIMIT_FRAME_SIZE -Wframe-larger-than=570 append_list_if(COMPILER_RT_HAS_WGLOBAL_CONSTRUCTORS_FLAG -Wglobal-constructors SANITIZER_CFLAGS) +# OHOS_LOCAL begin +if(OHOS) + list(APPEND SANITIZER_CFLAGS -fno-emulated-tls) +endif() +# OHOS_LOCAL end + if(APPLE) set(OS_OPTION OS ${SANITIZER_COMMON_SUPPORTED_OS}) endif() diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index 3737ee58dc40..87ab61077f0a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -458,7 +458,8 @@ #define SANITIZER_INTERCEPT_FOPENCOOKIE SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_SEM \ (SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_SOLARIS) -#define SANITIZER_INTERCEPT_PTHREAD_SETCANCEL SI_POSIX +// OHOS_LOCAL +#define SANITIZER_INTERCEPT_PTHREAD_SETCANCEL (SI_POSIX && !SI_OHOS) #define SANITIZER_INTERCEPT_MINCORE \ (SI_LINUX || SI_NETBSD || SI_FREEBSD || SI_SOLARIS) #define SANITIZER_INTERCEPT_PROCESS_VM_READV SI_LINUX diff --git a/compiler-rt/lib/tsan/CMakeLists.txt b/compiler-rt/lib/tsan/CMakeLists.txt index e192506f0c93..70e9337a1ee4 100644 --- a/compiler-rt/lib/tsan/CMakeLists.txt +++ b/compiler-rt/lib/tsan/CMakeLists.txt @@ -15,6 +15,12 @@ if(COMPILER_RT_TSAN_DEBUG_OUTPUT) list(APPEND TSAN_CFLAGS -DTSAN_DEBUG_OUTPUT=2) endif() +# OHOS_LOCAL begin +if(OHOS) + list(APPEND TSAN_CFLAGS -fno-emulated-tls) +endif() +# OHOS_LOCAL end + # Add the actual runtime library. add_subdirectory(rtl) diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp index 9cab2a372712..d69584ed7802 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp @@ -1121,7 +1121,7 @@ TSAN_INTERCEPTOR(void, pthread_exit, void *retval) { REAL(pthread_exit)(retval); } -#if SANITIZER_LINUX +#if SANITIZER_LINUX && !SANITIZER_OHOS // OHOS_LOCAL TSAN_INTERCEPTOR(int, pthread_tryjoin_np, void *th, void **ret) { SCOPED_INTERCEPTOR_RAW(pthread_tryjoin_np, th, ret); Tid tid = ThreadConsumeTid(thr, pc, (uptr)th); @@ -2938,7 +2938,7 @@ void InitializeInterceptors() { TSAN_INTERCEPT(pthread_join); TSAN_INTERCEPT(pthread_detach); TSAN_INTERCEPT(pthread_exit); - #if SANITIZER_LINUX + #if SANITIZER_LINUX && !SANITIZER_OHOS // OHOS_LOCAL TSAN_INTERCEPT(pthread_tryjoin_np); TSAN_INTERCEPT(pthread_timedjoin_np); #endif -- Gitee