diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp index 449ae8ed0df08cc3bc7d645f69f5e86ec9ced31a..c4c93e42d303cd6764328f648c107f661695e1f8 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/CMakeLists.txt b/compiler-rt/CMakeLists.txt index b5160f9a048cc4e31fc9f359cbf79ee5c34bd299..c62103d21c22b22ae7b516ba006e8034b10842be 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 086079c7536e5d6d2f2dcdd6b69c689f5352ea58..300954110119e9da99580fdce52541b7e790e126 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 9bf9e7eeaa61c2c3f689b11783a10cd9972c00b1..8a70a9e83f16e388d80038afdc69a7ca23024531 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 0c0abb6de861fd60512045a8e1e8098d660f99f6..5d01c307dc758abf6b77286fd37f7bdcfe0ec535 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/CMakeLists.txt b/compiler-rt/lib/sanitizer_common/CMakeLists.txt index 66f2d259aa5fd46bc627f91789435a846f65414f..ef03b15cf70153502bf59d1292bb48f12eca9339 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_linux_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index 236ca65ec4a659a8d9567d5535f021d59628954a..26c0daf69c0523c12666fb27f8867a5c68f2993f 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 } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index 3737ee58dc401a1d40d47251c8940dd5b8130e78..87ab61077f0af5dd0e10c7c88433c3c7428c30e0 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 e192506f0c9358d28ee4cfa21c1cabe16b3aadc2..70e9337a1ee498c55a765108e28e8975a56ee64f 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 9cab2a372712882dc5dfed729df603a0d92387d3..d69584ed7802451e5cef87e9c075950da0dac2a8 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