tangyouling created this revision. tangyouling added reviewers: Sanitizers, vitalybuka, SixWeining, xen0n, xry111, MaskRay, XiaodongLoong, lixing-star. Herald added subscribers: Enna1, StephenFan, s.egerton, simoncook. Herald added a project: All. tangyouling requested review of this revision. Herald added subscribers: cfe-commits, pcwang-thead. Herald added projects: clang, Sanitizers.
This patch enabled lsan for loongarch64 with 47-bit VMA layout. Also don't hardcode the page size in `leak_check_segv.cpp`. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D139686 Files: clang/lib/Driver/ToolChains/Linux.cpp clang/test/Driver/fsanitize.c compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake compiler-rt/lib/lsan/lsan_common.cpp compiler-rt/lib/lsan/lsan_common.h compiler-rt/test/asan/TestCases/Linux/leak_check_segv.cpp compiler-rt/test/asan/lit.cfg.py compiler-rt/test/lsan/TestCases/swapcontext.cpp compiler-rt/test/lsan/TestCases/use_registers.cpp compiler-rt/test/lsan/lit.common.cfg.py
Index: compiler-rt/test/lsan/lit.common.cfg.py =================================================================== --- compiler-rt/test/lsan/lit.common.cfg.py +++ compiler-rt/test/lsan/lit.common.cfg.py @@ -74,9 +74,9 @@ config.substitutions.append( ("%clangxx_lsan ", build_invocation(clang_lsan_cxxflags)) ) # LeakSanitizer tests are currently supported on -# Android{aarch64, x86, x86_64}, x86-64 Linux, PowerPC64 Linux, arm Linux, mips64 Linux, s390x Linux and x86_64 Darwin. +# Android{aarch64, x86, x86_64}, x86-64 Linux, PowerPC64 Linux, arm Linux, mips64 Linux, s390x Linux, loongarch64 Linux and x86_64 Darwin. supported_android = config.android and config.target_arch in ['x86_64', 'i386', 'aarch64'] and 'android-thread-properties-api' in config.available_features -supported_linux = (not config.android) and config.host_os == 'Linux' and config.host_arch in ['aarch64', 'x86_64', 'ppc64', 'ppc64le', 'mips64', 'riscv64', 'arm', 'armhf', 'armv7l', 's390x'] +supported_linux = (not config.android) and config.host_os == 'Linux' and config.host_arch in ['aarch64', 'x86_64', 'ppc64', 'ppc64le', 'mips64', 'riscv64', 'arm', 'armhf', 'armv7l', 's390x', 'loongarch64'] supported_darwin = config.host_os == 'Darwin' and config.target_arch in ['x86_64'] supported_netbsd = config.host_os == 'NetBSD' and config.target_arch in ['x86_64', 'i386'] if not (supported_android or supported_linux or supported_darwin or supported_netbsd): Index: compiler-rt/test/lsan/TestCases/use_registers.cpp =================================================================== --- compiler-rt/test/lsan/TestCases/use_registers.cpp +++ compiler-rt/test/lsan/TestCases/use_registers.cpp @@ -43,6 +43,8 @@ "mov x14, %0" : : "r"(p)); +#elif defined(__loongarch_lp64) + asm("move $s8, %0" : : "r"(p)); #elif defined(__powerpc__) asm("mr 30, %0" : Index: compiler-rt/test/lsan/TestCases/swapcontext.cpp =================================================================== --- compiler-rt/test/lsan/TestCases/swapcontext.cpp +++ compiler-rt/test/lsan/TestCases/swapcontext.cpp @@ -5,7 +5,7 @@ // RUN: %env_lsan_opts= %run %t 2>&1 // RUN: %env_lsan_opts= not %run %t foo 2>&1 | FileCheck %s // Missing 'getcontext' and 'makecontext' on Android. -// UNSUPPORTED: arm,aarch64,powerpc64,android +// UNSUPPORTED: arm,aarch64,loongarch64,powerpc64,android #include "sanitizer_common/sanitizer_ucontext.h" #include <stdio.h> Index: compiler-rt/test/asan/lit.cfg.py =================================================================== --- compiler-rt/test/asan/lit.cfg.py +++ compiler-rt/test/asan/lit.cfg.py @@ -202,7 +202,7 @@ # Turn on leak detection on 64-bit Linux. leak_detection_android = config.android and 'android-thread-properties-api' in config.available_features and (config.target_arch in ['x86_64', 'i386', 'i686', 'aarch64']) -leak_detection_linux = (config.host_os == 'Linux') and (not config.android) and (config.target_arch in ['x86_64', 'i386', 'riscv64']) +leak_detection_linux = (config.host_os == 'Linux') and (not config.android) and (config.target_arch in ['x86_64', 'i386', 'riscv64', 'loongarch64']) leak_detection_mac = (config.host_os == 'Darwin') and (config.apple_platform == 'osx') leak_detection_netbsd = (config.host_os == 'NetBSD') and (config.target_arch in ['x86_64', 'i386']) if leak_detection_android or leak_detection_linux or leak_detection_mac or leak_detection_netbsd: Index: compiler-rt/test/asan/TestCases/Linux/leak_check_segv.cpp =================================================================== --- compiler-rt/test/asan/TestCases/Linux/leak_check_segv.cpp +++ compiler-rt/test/asan/TestCases/Linux/leak_check_segv.cpp @@ -1,18 +1,24 @@ // Test that SIGSEGV during leak checking does not crash the process. // RUN: %clangxx_asan -O1 %s -o %t && not %run %t 2>&1 | FileCheck %s // REQUIRES: leak-detection -#include <stdlib.h> +#include <sanitizer/lsan_interface.h> #include <stdio.h> +#include <stdlib.h> #include <sys/mman.h> -#include <sanitizer/lsan_interface.h> +#include <unistd.h> char data[10 * 1024 * 1024]; +static uintptr_t GetPageSize() { return sysconf(_SC_PAGESIZE); } + int main() { void *p = malloc(10 * 1024 * 1024); + const unsigned long kPageSize = GetPageSize(); // surprise-surprise! - mprotect((void*)(((unsigned long)p + 4095) & ~4095), 16 * 1024, PROT_NONE); - mprotect((void*)(((unsigned long)data + 4095) & ~4095), 16 * 1024, PROT_NONE); + mprotect((void *)(((unsigned long)p + kPageSize - 1) & ~(kPageSize - 1)), + 16 * 1024, PROT_NONE); + mprotect((void *)(((unsigned long)data + kPageSize - 1) & ~(kPageSize - 1)), + 16 * 1024, PROT_NONE); __lsan_do_leak_check(); fprintf(stderr, "DONE\n"); } Index: compiler-rt/lib/lsan/lsan_common.h =================================================================== --- compiler-rt/lib/lsan/lsan_common.h +++ compiler-rt/lib/lsan/lsan_common.h @@ -42,6 +42,8 @@ # define CAN_SANITIZE_LEAKS 1 #elif defined(__arm__) && SANITIZER_LINUX # define CAN_SANITIZE_LEAKS 1 +#elif SANITIZER_LOONGARCH64 && SANITIZER_LINUX +# define CAN_SANITIZE_LEAKS 1 #elif SANITIZER_RISCV64 && SANITIZER_LINUX # define CAN_SANITIZE_LEAKS 1 #elif SANITIZER_NETBSD || SANITIZER_FUCHSIA Index: compiler-rt/lib/lsan/lsan_common.cpp =================================================================== --- compiler-rt/lib/lsan/lsan_common.cpp +++ compiler-rt/lib/lsan/lsan_common.cpp @@ -277,6 +277,8 @@ # elif defined(__aarch64__) // Accept up to 48 bit VMA. return ((p >> 48) == 0); +# elif defined(__loongarch_lp64) + return ((p >> 47) == 0); # else return true; # endif Index: compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake =================================================================== --- compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake +++ compiler-rt/cmake/Modules/AllSupportedArchDefs.cmake @@ -52,7 +52,7 @@ set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64}) else() set(ALL_LSAN_SUPPORTED_ARCH ${X86} ${X86_64} ${MIPS64} ${ARM64} ${ARM32} - ${PPC64} ${S390X} ${RISCV64} ${HEXAGON}) + ${PPC64} ${S390X} ${RISCV64} ${HEXAGON} ${LOONGARCH64}) endif() set(ALL_MSAN_SUPPORTED_ARCH ${X86_64} ${MIPS64} ${ARM64} ${PPC64} ${S390X}) set(ALL_HWASAN_SUPPORTED_ARCH ${X86_64} ${ARM64}) Index: clang/test/Driver/fsanitize.c =================================================================== --- clang/test/Driver/fsanitize.c +++ clang/test/Driver/fsanitize.c @@ -430,6 +430,12 @@ // RUN: %clang --target=riscv64-linux-gnu -fsanitize=address,leak -fno-sanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANA-SANL-NO-SANA-RISCV64 // CHECK-SANA-SANL-NO-SANA-RISCV64: "-fsanitize=leak" +// RUN: %clang --target=loongarch64-unknown-linux-gnu -fsanitize=leak %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANL-LOONGARCH64 +// CHECK-SANL-LOONGARCH64: "-fsanitize=leak" + +// RUN: %clang --target=loongarch64-unknown-linux-gnu -fsanitize=address,leak -fno-sanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANA-SANL-NO-SANA-LOONGARCH64 +// CHECK-SANA-SANL-NO-SANA-LOONGARCH64: "-fsanitize=leak" + // RUN: %clang --target=x86_64-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MSAN // CHECK-MSAN: "-fno-assume-sane-operator-new" // RUN: %clang --target=x86_64-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -766,7 +766,7 @@ if (IsX86_64 || IsMIPS64 || IsAArch64) Res |= SanitizerKind::DataFlow; if (IsX86_64 || IsMIPS64 || IsAArch64 || IsX86 || IsArmArch || IsPowerPC64 || - IsRISCV64 || IsSystemZ || IsHexagon) + IsRISCV64 || IsSystemZ || IsHexagon || IsLoongArch64) Res |= SanitizerKind::Leak; if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64 || IsSystemZ || IsLoongArch64)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits