From 0bce68310dc0ff6a09ec2cf5c3ae32400c631324 Mon Sep 17 00:00:00 2001 From: zhanglimin Date: Tue, 12 Sep 2023 09:51:16 +0800 Subject: [PATCH 1/5] [sanitizer][msan] VarArgHelper for loongarch64 This patch adds support for variadic argument for loongarch64, which is based on MIPS64. And `check-msan` all pass. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D158587 (cherry picked from commit ec42c78cc43ac1e8364e5a0941aa5fc91b813dd3) --- compiler-rt/test/msan/signal_stress_test.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/compiler-rt/test/msan/signal_stress_test.cpp b/compiler-rt/test/msan/signal_stress_test.cpp index aade0f1f4051..043393fce6de 100644 --- a/compiler-rt/test/msan/signal_stress_test.cpp +++ b/compiler-rt/test/msan/signal_stress_test.cpp @@ -5,9 +5,6 @@ // Reported deadly signal due to stack-overflow // XFAIL: target={{.*netbsd.*}} -// VarArg implementation on LoongArch isn't supported yet. -// UNSUPPORTED: target=loongarch{{.*}} - #include #include #include -- 2.20.1 From faa4482d1f713331a4ac4b0a58ea9804f6c32371 Mon Sep 17 00:00:00 2001 From: Ami-zhang <96056515+Ami-zhang@users.noreply.github.com> Date: Thu, 28 Sep 2023 15:40:42 +0800 Subject: [PATCH 2/5] [CFI] Allow LoongArch (#67314) Enable icall tests on loongarch64 and `check-cfi` all pass. (cherry picked from commit adb555ea369a3a989a9db619c784aa76cccdb823) --- compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake | 2 +- compiler-rt/lib/cfi/cfi.cpp | 4 ++++ compiler-rt/test/cfi/cross-dso/icall/dlopen.cpp | 11 +++++++++-- compiler-rt/test/cfi/cross-dso/icall/lit.local.cfg.py | 2 +- compiler-rt/test/cfi/icall/lit.local.cfg.py | 2 +- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake b/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake index d14745ef9d13..9b0a4655cd65 100644 --- a/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake +++ b/compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake @@ -73,7 +73,7 @@ set(ALL_UBSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${RISCV64} set(ALL_SAFESTACK_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM64} ${MIPS32} ${MIPS64} ${HEXAGON} ${LOONGARCH64}) set(ALL_CFI_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${MIPS64} - ${HEXAGON}) + ${HEXAGON} ${LOONGARCH64}) set(ALL_SCUDO_STANDALONE_SUPPORTED_ARCH ${X86} ${X86_64} ${ARM32} ${ARM64} ${MIPS32} ${MIPS64} ${PPC64} ${HEXAGON} ${LOONGARCH64} ${RISCV64}) if(APPLE) diff --git a/compiler-rt/lib/cfi/cfi.cpp b/compiler-rt/lib/cfi/cfi.cpp index 22f0b175dd87..ad1c91623514 100644 --- a/compiler-rt/lib/cfi/cfi.cpp +++ b/compiler-rt/lib/cfi/cfi.cpp @@ -51,7 +51,11 @@ using namespace __sanitizer; namespace __cfi { +#if SANITIZER_LOONGARCH64 +#define kCfiShadowLimitsStorageSize 16384 // 16KiB on loongarch64 per page +#else #define kCfiShadowLimitsStorageSize 4096 // 1 page +#endif // Lets hope that the data segment is mapped with 4K pages. // The pointer to the cfi shadow region is stored at the start of this page. // The rest of the page is unused and re-mapped read-only. diff --git a/compiler-rt/test/cfi/cross-dso/icall/dlopen.cpp b/compiler-rt/test/cfi/cross-dso/icall/dlopen.cpp index c9674c3fb412..d04f7ba5dd0e 100644 --- a/compiler-rt/test/cfi/cross-dso/icall/dlopen.cpp +++ b/compiler-rt/test/cfi/cross-dso/icall/dlopen.cpp @@ -53,6 +53,13 @@ struct A { virtual void f(); }; +// The page size of LoongArch is 16KiB, aligned to the memory page size. +#ifdef __loongarch__ +# define PAGESIZE 16384 +#else +# define PAGESIZE 4096 +#endif + #ifdef SHARED_LIB #include "../../utils.h" @@ -66,13 +73,13 @@ extern "C" void *create_B() { return (void *)(new B()); } -extern "C" __attribute__((aligned(4096))) void do_nothing() {} +extern "C" __attribute__((aligned(PAGESIZE))) void do_nothing() {} #else void A::f() {} -static const int kCodeAlign = 4096; +static const int kCodeAlign = PAGESIZE; static const int kCodeSize = 4096; static char saved_code[kCodeSize]; static char *real_start; diff --git a/compiler-rt/test/cfi/cross-dso/icall/lit.local.cfg.py b/compiler-rt/test/cfi/cross-dso/icall/lit.local.cfg.py index 749c265bbf1c..6e64199ed5c5 100644 --- a/compiler-rt/test/cfi/cross-dso/icall/lit.local.cfg.py +++ b/compiler-rt/test/cfi/cross-dso/icall/lit.local.cfg.py @@ -1,3 +1,3 @@ # The cfi-icall checker is only supported on x86 and x86_64 for now. -if config.root.host_arch not in ["x86", "x86_64"]: +if config.root.host_arch not in ["x86", "x86_64", "loongarch64"]: config.unsupported = True diff --git a/compiler-rt/test/cfi/icall/lit.local.cfg.py b/compiler-rt/test/cfi/icall/lit.local.cfg.py index 749c265bbf1c..6e64199ed5c5 100644 --- a/compiler-rt/test/cfi/icall/lit.local.cfg.py +++ b/compiler-rt/test/cfi/icall/lit.local.cfg.py @@ -1,3 +1,3 @@ # The cfi-icall checker is only supported on x86 and x86_64 for now. -if config.root.host_arch not in ["x86", "x86_64"]: +if config.root.host_arch not in ["x86", "x86_64", "loongarch64"]: config.unsupported = True -- 2.20.1 From c1b7fb975564f8d372b7af81e90519c47935d1b7 Mon Sep 17 00:00:00 2001 From: Ami-zhang Date: Fri, 27 Oct 2023 16:52:10 +0800 Subject: [PATCH 3/5] [test][compiler-rt] Mark several tests as UNSUPPORTED on LoongArch (#69699) (cherry picked from commit 75b0a99668cef7abaf36e09c41bb1eb91234bbf3) --- compiler-rt/test/fuzzer/exit_on_src_pos.test | 2 ++ .../test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp | 2 ++ .../sanitizer_common/TestCases/Linux/release_to_os_test.cpp | 2 +- compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/compiler-rt/test/fuzzer/exit_on_src_pos.test b/compiler-rt/test/fuzzer/exit_on_src_pos.test index 541e0c4c6e42..020424e2d9fd 100644 --- a/compiler-rt/test/fuzzer/exit_on_src_pos.test +++ b/compiler-rt/test/fuzzer/exit_on_src_pos.test @@ -6,6 +6,8 @@ # Test does not complete on Armv7 Thumb build bot UNSUPPORTED: target=thumb{{.*}} +# Timeout on loongarch64 machine +UNSUPPORTED: target=loongarch64{{.*}} RUN: %cpp_compiler -O0 %S/SimpleTest.cpp -o %t-SimpleTest.exe -mllvm -use-unknown-locations=Disable RUN: %cpp_compiler -O0 %S/ShrinkControlFlowTest.cpp -o %t-ShrinkControlFlowTest.exe diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp index fc31212b7f18..9d7d46b462a8 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp @@ -5,6 +5,8 @@ // AddressSanitizer: CHECK failed: asan_thread.cpp:315 "((AddrIsInStack((uptr)&local))) != (0)" // https://lab.llvm.org/buildbot/#/builders/18/builds/8162 // UNSUPPORTED: target=powerpc64{{.*}} +/// Occasionally fail on loongarch64 machine +// UNSUPPORTED: target=loongarch64{{.*}} #include #include diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/release_to_os_test.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/release_to_os_test.cpp index 67351a916441..0fa77200bf1c 100644 --- a/compiler-rt/test/sanitizer_common/TestCases/Linux/release_to_os_test.cpp +++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/release_to_os_test.cpp @@ -3,7 +3,7 @@ // Temporarily disable test // UNSUPPORTED: tsan -// UNSUPPORTED: target=powerpc64{{.*}} +// UNSUPPORTED: target={{(powerpc64|loongarch64).*}} // Not needed, no allocator. // UNSUPPORTED: ubsan diff --git a/compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp b/compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp index 3065981a2c9a..0ee8aaa755d5 100644 --- a/compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp +++ b/compiler-rt/test/xray/TestCases/Posix/fdr-mode.cpp @@ -19,6 +19,8 @@ // RUN: rm fdr-logging-test-* // RUN: rm fdr-unwrite-test-* // UNSUPPORTED: target=powerpc64le-{{.*}} +/// TODO: FDR logging arg1 handler(__xray_ArgLoggerEntry) hasn't implemented yet on LoongArch +// UNSUPPORTED: target=loongarch64{{.*}} // REQUIRES: built-in-llvm-tree #include "xray/xray_log_interface.h" -- 2.20.1 From 6ff7bf14a7bbb438f58fc20dd56a2adf157022f3 Mon Sep 17 00:00:00 2001 From: abner chenc Date: Thu, 28 Dec 2023 18:54:35 +0800 Subject: [PATCH 4/5] [tsan] Add support for linux/loongarch64 in lib/tsan/go/buildgo.sh (#72819) Co-authored-by: Xiaolin Zhao (cherry picked from commit 9d3fbf97bef3f19da4e0a047f017b8142f59b3fd) --- compiler-rt/lib/tsan/go/buildgo.sh | 2 ++ compiler-rt/lib/tsan/rtl/tsan_platform.h | 32 +++++++++++++++++++ .../lib/tsan/rtl/tsan_platform_linux.cpp | 8 ++++- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/compiler-rt/lib/tsan/go/buildgo.sh b/compiler-rt/lib/tsan/go/buildgo.sh index 0bd59368cc46..78ba41a0bdc6 100755 --- a/compiler-rt/lib/tsan/go/buildgo.sh +++ b/compiler-rt/lib/tsan/go/buildgo.sh @@ -10,6 +10,8 @@ if [ "`uname -a | grep Linux`" != "" ]; then HOST_GOARCH="amd64" elif [ "`uname -a | grep aarch64`" != "" ]; then HOST_GOARCH="arm64" + elif [ "`uname -a | grep loongarch64`" != "" ]; then + HOST_GOARCH="loong64" elif [ "`uname -a | grep -i mips64`" != "" ]; then if [ "`lscpu | grep -i Little`" != "" ]; then HOST_GOARCH="mips64le" diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform.h b/compiler-rt/lib/tsan/rtl/tsan_platform.h index f0cdaf48eaa3..48dd56d15751 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_platform.h +++ b/compiler-rt/lib/tsan/rtl/tsan_platform.h @@ -558,6 +558,35 @@ struct MappingGoAarch64 { static const uptr kShadowAdd = 0x200000000000ull; }; +/* Go on linux/loongarch64 (47-bit VMA) +0000 0000 1000 - 0000 1000 0000: executable +0000 1000 0000 - 00c0 0000 0000: - +00c0 0000 0000 - 00e0 0000 0000: heap +00e0 0000 0000 - 2000 0000 0000: - +2000 0000 0000 - 2800 0000 0000: shadow +2800 0000 0000 - 3000 0000 0000: - +3000 0000 0000 - 3200 0000 0000: metainfo (memory blocks and sync objects) +3200 0000 0000 - 8000 0000 0000: - +*/ +struct MappingGoLoongArch64_47 { + static const uptr kMetaShadowBeg = 0x300000000000ull; + static const uptr kMetaShadowEnd = 0x320000000000ull; + static const uptr kShadowBeg = 0x200000000000ull; + static const uptr kShadowEnd = 0x280000000000ull; + static const uptr kLoAppMemBeg = 0x000000001000ull; + static const uptr kLoAppMemEnd = 0x00e000000000ull; + static const uptr kMidAppMemBeg = 0; + static const uptr kMidAppMemEnd = 0; + static const uptr kHiAppMemBeg = 0; + static const uptr kHiAppMemEnd = 0; + static const uptr kHeapMemBeg = 0; + static const uptr kHeapMemEnd = 0; + static const uptr kVdsoBeg = 0; + static const uptr kShadowMsk = 0; + static const uptr kShadowXor = 0; + static const uptr kShadowAdd = 0x200000000000ull; +}; + /* Go on linux/mips64 (47-bit VMA) 0000 0000 1000 - 0000 1000 0000: executable @@ -633,6 +662,8 @@ ALWAYS_INLINE auto SelectMapping(Arg arg) { return Func::template Apply(arg); # elif defined(__aarch64__) return Func::template Apply(arg); +# elif defined(__loongarch_lp64) + return Func::template Apply(arg); # elif SANITIZER_WINDOWS return Func::template Apply(arg); # else @@ -692,6 +723,7 @@ void ForEachMapping() { Func::template Apply(); Func::template Apply(); Func::template Apply(); + Func::template Apply(); Func::template Apply(); Func::template Apply(); } diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp index 384a443c16b0..3f4a3760794f 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp @@ -238,7 +238,13 @@ void InitializePlatformEarly() { Printf("FATAL: Found %zd - Supported 47\n", vmaSize); Die(); } -# endif +# else + if (vmaSize != 47) { + Printf("FATAL: ThreadSanitizer: unsupported VMA range\n"); + Printf("FATAL: Found %zd - Supported 47\n", vmaSize); + Die(); + } +# endif #elif defined(__powerpc64__) # if !SANITIZER_GO if (vmaSize != 44 && vmaSize != 46 && vmaSize != 47) { -- 2.20.1 From ffa86e49836d567aa6b817563d1e4b99dc5f21c7 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 26 Mar 2024 14:09:39 -0700 Subject: [PATCH 5/5] [tsan] Refine fstat{,64} interceptors (#86625) In glibc versions before 2.33. `libc_nonshared.a` defines `__fxstat/__fxstat64` but there is no `fstat/fstat64`. glibc 2.33 added `fstat/fstat64` and obsoleted `__fxstat/__fxstat64`. Ports added after 2.33 do not provide `__fxstat/__fxstat64`, so our `fstat/fstat64` interceptors using `__fxstat/__fxstat64` interceptors would lead to runtime failures on such ports (LoongArch and certain RISC-V ports). Similar to https://reviews.llvm.org/D118423, refine the conditions that we define fstat{,64} interceptors. `fstat` is supported by musl/*BSD while `fstat64` is glibc only. (cherry picked from commit d5224b73ccd09a6759759791f58426b6acd4a2e2) --- .../lib/tsan/rtl/tsan_interceptors_posix.cpp | 43 ++++++++----------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp index 177e338bf282..622afc90a577 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp @@ -14,6 +14,7 @@ #include "sanitizer_common/sanitizer_atomic.h" #include "sanitizer_common/sanitizer_errno.h" +#include "sanitizer_common/sanitizer_glibc_version.h" #include "sanitizer_common/sanitizer_libc.h" #include "sanitizer_common/sanitizer_linux.h" #include "sanitizer_common/sanitizer_platform_limits_netbsd.h" @@ -1595,47 +1596,40 @@ TSAN_INTERCEPTOR(int, __fxstat, int version, int fd, void *buf) { FdAccess(thr, pc, fd); return REAL(__fxstat)(version, fd, buf); } -#define TSAN_MAYBE_INTERCEPT___FXSTAT TSAN_INTERCEPT(__fxstat) + +TSAN_INTERCEPTOR(int, __fxstat64, int version, int fd, void *buf) { + SCOPED_TSAN_INTERCEPTOR(__fxstat64, version, fd, buf); + if (fd > 0) + FdAccess(thr, pc, fd); + return REAL(__fxstat64)(version, fd, buf); +} +#define TSAN_MAYBE_INTERCEPT___FXSTAT TSAN_INTERCEPT(__fxstat); TSAN_INTERCEPT(__fxstat64) #else #define TSAN_MAYBE_INTERCEPT___FXSTAT #endif +#if !SANITIZER_GLIBC || __GLIBC_PREREQ(2, 33) TSAN_INTERCEPTOR(int, fstat, int fd, void *buf) { -#if SANITIZER_GLIBC - SCOPED_TSAN_INTERCEPTOR(__fxstat, 0, fd, buf); - if (fd > 0) - FdAccess(thr, pc, fd); - return REAL(__fxstat)(0, fd, buf); -#else SCOPED_TSAN_INTERCEPTOR(fstat, fd, buf); if (fd > 0) FdAccess(thr, pc, fd); return REAL(fstat)(fd, buf); -#endif -} - -#if SANITIZER_GLIBC -TSAN_INTERCEPTOR(int, __fxstat64, int version, int fd, void *buf) { - SCOPED_TSAN_INTERCEPTOR(__fxstat64, version, fd, buf); - if (fd > 0) - FdAccess(thr, pc, fd); - return REAL(__fxstat64)(version, fd, buf); } -#define TSAN_MAYBE_INTERCEPT___FXSTAT64 TSAN_INTERCEPT(__fxstat64) +# define TSAN_MAYBE_INTERCEPT_FSTAT TSAN_INTERCEPT(fstat) #else -#define TSAN_MAYBE_INTERCEPT___FXSTAT64 +# define TSAN_MAYBE_INTERCEPT_FSTAT #endif -#if SANITIZER_GLIBC +#if __GLIBC_PREREQ(2, 33) TSAN_INTERCEPTOR(int, fstat64, int fd, void *buf) { - SCOPED_TSAN_INTERCEPTOR(__fxstat64, 0, fd, buf); + SCOPED_TSAN_INTERCEPTOR(fstat64, fd, buf); if (fd > 0) FdAccess(thr, pc, fd); - return REAL(__fxstat64)(0, fd, buf); + return REAL(fstat64)(fd, buf); } -#define TSAN_MAYBE_INTERCEPT_FSTAT64 TSAN_INTERCEPT(fstat64) +# define TSAN_MAYBE_INTERCEPT_FSTAT64 TSAN_INTERCEPT(fstat64) #else -#define TSAN_MAYBE_INTERCEPT_FSTAT64 +# define TSAN_MAYBE_INTERCEPT_FSTAT64 #endif TSAN_INTERCEPTOR(int, open, const char *name, int oflag, ...) { @@ -2929,10 +2923,9 @@ void InitializeInterceptors() { TSAN_INTERCEPT(pthread_once); - TSAN_INTERCEPT(fstat); TSAN_MAYBE_INTERCEPT___FXSTAT; + TSAN_MAYBE_INTERCEPT_FSTAT; TSAN_MAYBE_INTERCEPT_FSTAT64; - TSAN_MAYBE_INTERCEPT___FXSTAT64; TSAN_INTERCEPT(open); TSAN_MAYBE_INTERCEPT_OPEN64; TSAN_INTERCEPT(creat); -- 2.20.1