[llvm-branch-commits] [compiler-rt] Backport AArch64 sanitizer fixes to 21.x. (PR #157848)
Michał Górny via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Sep 10 05:36:35 PDT 2025
https://github.com/mgorny created https://github.com/llvm/llvm-project/pull/157848
Backport the following commits to 21.x branch:
- 19cfc30
- 4485a3f
- 6beb6f3
>From 2501aaaee3b7fb020db234d20fb1d84b140d00f8 Mon Sep 17 00:00:00 2001
From: Peter Collingbourne <pcc at google.com>
Date: Thu, 14 Aug 2025 12:24:12 -0700
Subject: [PATCH 1/3] compiler-rt: Make the tests pass on AArch64 and with page
size != 4096.
This makes the tests pass on my AArch64 machine with 16K pages.
Not sure why some of the AArch64-specific test failures don't seem to
occur on sanitizer-aarch64-linux. I could also reproduce them by running
buildbot_cmake.sh on my machine.
Pull Request: https://github.com/llvm/llvm-project/pull/153860
---
compiler-rt/lib/gwp_asan/tests/basic.cpp | 11 ++++++-----
.../lib/gwp_asan/tests/never_allocated.cpp | 10 ++++++----
.../asan/TestCases/Linux/release_to_os_test.cpp | 1 +
compiler-rt/test/cfi/cross-dso/lit.local.cfg.py | 4 ++++
compiler-rt/test/lit.common.cfg.py | 17 +++++++++++++++++
compiler-rt/test/msan/dtls_test.c | 1 +
.../TestCases/Linux/odd_stack_size.cpp | 1 +
.../TestCases/Linux/release_to_os_test.cpp | 3 +++
.../TestCases/Linux/resize_tls_dynamic.cpp | 3 +++
.../TestCases/Linux/tls_get_addr.c | 3 +++
10 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/compiler-rt/lib/gwp_asan/tests/basic.cpp b/compiler-rt/lib/gwp_asan/tests/basic.cpp
index 88e7ed14a5c2f..7d36a2ee1f947 100644
--- a/compiler-rt/lib/gwp_asan/tests/basic.cpp
+++ b/compiler-rt/lib/gwp_asan/tests/basic.cpp
@@ -65,11 +65,12 @@ TEST_F(DefaultGuardedPoolAllocator, NonPowerOfTwoAlignment) {
// Added multi-page slots? You'll need to expand this test.
TEST_F(DefaultGuardedPoolAllocator, TooBigForSinglePageSlots) {
- EXPECT_EQ(nullptr, GPA.allocate(0x1001, 0));
- EXPECT_EQ(nullptr, GPA.allocate(0x1001, 1));
- EXPECT_EQ(nullptr, GPA.allocate(0x1001, 0x1000));
- EXPECT_EQ(nullptr, GPA.allocate(1, 0x2000));
- EXPECT_EQ(nullptr, GPA.allocate(0, 0x2000));
+ size_t PageSize = sysconf(_SC_PAGESIZE);
+ EXPECT_EQ(nullptr, GPA.allocate(PageSize + 1, 0));
+ EXPECT_EQ(nullptr, GPA.allocate(PageSize + 1, 1));
+ EXPECT_EQ(nullptr, GPA.allocate(PageSize + 1, PageSize));
+ EXPECT_EQ(nullptr, GPA.allocate(1, 2 * PageSize));
+ EXPECT_EQ(nullptr, GPA.allocate(0, 2 * PageSize));
}
TEST_F(CustomGuardedPoolAllocator, AllocAllSlots) {
diff --git a/compiler-rt/lib/gwp_asan/tests/never_allocated.cpp b/compiler-rt/lib/gwp_asan/tests/never_allocated.cpp
index 2f695b4379861..37a4b384e4ac0 100644
--- a/compiler-rt/lib/gwp_asan/tests/never_allocated.cpp
+++ b/compiler-rt/lib/gwp_asan/tests/never_allocated.cpp
@@ -13,8 +13,10 @@
#include "gwp_asan/tests/harness.h"
TEST_P(BacktraceGuardedPoolAllocatorDeathTest, NeverAllocated) {
+ size_t PageSize = sysconf(_SC_PAGESIZE);
+
SCOPED_TRACE("");
- void *Ptr = GPA.allocate(0x1000);
+ void *Ptr = GPA.allocate(PageSize);
GPA.deallocate(Ptr);
std::string DeathNeedle =
@@ -23,7 +25,7 @@ TEST_P(BacktraceGuardedPoolAllocatorDeathTest, NeverAllocated) {
// Trigger a guard page in a completely different slot that's never allocated.
// Previously, there was a bug that this would result in nullptr-dereference
// in the posix crash handler.
- char *volatile NeverAllocatedPtr = static_cast<char *>(Ptr) + 0x3000;
+ char *volatile NeverAllocatedPtr = static_cast<char *>(Ptr) + 3 * PageSize;
if (!Recoverable) {
EXPECT_DEATH(*NeverAllocatedPtr = 0, DeathNeedle);
return;
@@ -37,8 +39,8 @@ TEST_P(BacktraceGuardedPoolAllocatorDeathTest, NeverAllocated) {
GetOutputBuffer().clear();
for (size_t i = 0; i < 100; ++i) {
*NeverAllocatedPtr = 0;
- *(NeverAllocatedPtr + 0x2000) = 0;
- *(NeverAllocatedPtr + 0x3000) = 0;
+ *(NeverAllocatedPtr + 2 * PageSize) = 0;
+ *(NeverAllocatedPtr + 3 * PageSize) = 0;
ASSERT_TRUE(GetOutputBuffer().empty());
}
diff --git a/compiler-rt/test/asan/TestCases/Linux/release_to_os_test.cpp b/compiler-rt/test/asan/TestCases/Linux/release_to_os_test.cpp
index 3e28ffde46ab6..dc3ead9e8436c 100644
--- a/compiler-rt/test/asan/TestCases/Linux/release_to_os_test.cpp
+++ b/compiler-rt/test/asan/TestCases/Linux/release_to_os_test.cpp
@@ -6,6 +6,7 @@
// RUN: %env_asan_opts=allocator_release_to_os_interval_ms=-1 %run %t force 2>&1 | FileCheck %s --check-prefix=FORCE_RELEASE
// REQUIRES: x86_64-target-arch
+// REQUIRES: page-size-4096
#include <algorithm>
#include <assert.h>
diff --git a/compiler-rt/test/cfi/cross-dso/lit.local.cfg.py b/compiler-rt/test/cfi/cross-dso/lit.local.cfg.py
index dceb7cde7218b..5f5486af3779f 100644
--- a/compiler-rt/test/cfi/cross-dso/lit.local.cfg.py
+++ b/compiler-rt/test/cfi/cross-dso/lit.local.cfg.py
@@ -12,3 +12,7 @@ def getRoot(config):
# Android O (API level 26) has support for cross-dso cfi in libdl.so.
if config.android and "android-26" not in config.available_features:
config.unsupported = True
+
+# The runtime library only supports 4K pages.
+if "page-size-4096" not in config.available_features:
+ config.unsupported = True
diff --git a/compiler-rt/test/lit.common.cfg.py b/compiler-rt/test/lit.common.cfg.py
index f5576ce0e013d..13ae9e7753001 100644
--- a/compiler-rt/test/lit.common.cfg.py
+++ b/compiler-rt/test/lit.common.cfg.py
@@ -965,6 +965,23 @@ def is_windows_lto_supported():
else:
config.available_features.add("memprof-shadow-scale-3")
+
+def target_page_size():
+ try:
+ proc = subprocess.Popen(
+ f"{emulator or ''} python3",
+ shell=True,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ )
+ out, err = proc.communicate(b'import os; print(os.sysconf("SC_PAGESIZE"))')
+ return int(out)
+ except:
+ return 4096
+
+
+config.available_features.add(f"page-size-{target_page_size()}")
+
if config.expensive_checks:
config.available_features.add("expensive_checks")
diff --git a/compiler-rt/test/msan/dtls_test.c b/compiler-rt/test/msan/dtls_test.c
index 3c384256147a0..0e49ac9feb9fe 100644
--- a/compiler-rt/test/msan/dtls_test.c
+++ b/compiler-rt/test/msan/dtls_test.c
@@ -11,6 +11,7 @@
// Reports use-of-uninitialized-value, not analyzed
XFAIL: target={{.*netbsd.*}}
+ XFAIL: aarch64-target-arch
*/
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 9d7d46b462a88..cc76804aed210 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
@@ -1,4 +1,5 @@
// RUN: %clangxx -O1 %s -o %t && %run %t
+// REQUIRES: page-size-4096
// UNSUPPORTED: android
// Fail on powerpc64 bots with:
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 0fa77200bf1cc..c7a5534696361 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
@@ -11,6 +11,9 @@
// FIXME: This mode uses 32bit allocator without purge.
// UNSUPPORTED: hwasan-aliasing
+// Page size is hardcoded below, but test still fails even if not hardcoded.
+// REQUIRES: page-size-4096
+
#include <algorithm>
#include <assert.h>
#include <fcntl.h>
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/resize_tls_dynamic.cpp b/compiler-rt/test/sanitizer_common/TestCases/Linux/resize_tls_dynamic.cpp
index c288e1d69baf9..3e9ff924a3c4a 100644
--- a/compiler-rt/test/sanitizer_common/TestCases/Linux/resize_tls_dynamic.cpp
+++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/resize_tls_dynamic.cpp
@@ -11,6 +11,9 @@
// FIXME: Investigate
// UNSUPPORTED: target=powerpc64{{.*}}
+// Fails because AArch64 uses TLSDESC instead of __tls_get_addr.
+// UNSUPPORTED: aarch64-target-arch
+
#include <string.h>
#ifndef BUILD_DSO
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Linux/tls_get_addr.c b/compiler-rt/test/sanitizer_common/TestCases/Linux/tls_get_addr.c
index 0aff6039ac4e8..a4a4f64ed3706 100644
--- a/compiler-rt/test/sanitizer_common/TestCases/Linux/tls_get_addr.c
+++ b/compiler-rt/test/sanitizer_common/TestCases/Linux/tls_get_addr.c
@@ -13,6 +13,9 @@
// FIXME: Fails for unknown reasons.
// UNSUPPORTED: powerpc64le-target-arch
+// Fails because AArch64 uses TLSDESC instead of __tls_get_addr.
+// UNSUPPORTED: aarch64-target-arch
+
#ifndef BUILD_SO
# include <assert.h>
# include <dlfcn.h>
>From 0ccd35b8105a43b776c679f8969c48d9977cfa96 Mon Sep 17 00:00:00 2001
From: Peter Collingbourne <peter at pcc.me.uk>
Date: Fri, 15 Aug 2025 16:29:33 -0700
Subject: [PATCH 2/3] Switch dtls_test.c from XFAIL to UNSUPPORTED on aarch64.
It passes on some buildbots, so we can't expect failure.
---
compiler-rt/test/msan/dtls_test.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/compiler-rt/test/msan/dtls_test.c b/compiler-rt/test/msan/dtls_test.c
index 0e49ac9feb9fe..6daaab0ae0b8d 100644
--- a/compiler-rt/test/msan/dtls_test.c
+++ b/compiler-rt/test/msan/dtls_test.c
@@ -11,7 +11,7 @@
// Reports use-of-uninitialized-value, not analyzed
XFAIL: target={{.*netbsd.*}}
- XFAIL: aarch64-target-arch
+ UNSUPPORTED: aarch64-target-arch
*/
>From 395a9c0f1c4e91893371f254bbbe4e4149670a3d Mon Sep 17 00:00:00 2001
From: Peter Collingbourne <peter at pcc.me.uk>
Date: Fri, 15 Aug 2025 13:43:16 -0700
Subject: [PATCH 3/3] dfsan: Fix test with gcc 15.
With gcc 15 we end up emitting a reference to the
std::__glibcxx_assert_fail function because of this change:
https://github.com/gcc-mirror/gcc/commit/361d230fd7800a7e749aba8ed020f54f5c26d504
combined with assertion checks in the std::atomic implementation.
This reference is undefined with dfsan causing the test to fail. Fix it
by defining the macro that disables assertions.
Pull Request: https://github.com/llvm/llvm-project/pull/153873
---
compiler-rt/test/dfsan/atomic.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/compiler-rt/test/dfsan/atomic.cpp b/compiler-rt/test/dfsan/atomic.cpp
index 22ee323c752f8..73e1cbd17a7cd 100644
--- a/compiler-rt/test/dfsan/atomic.cpp
+++ b/compiler-rt/test/dfsan/atomic.cpp
@@ -1,9 +1,12 @@
-// RUN: %clangxx_dfsan %s -fno-exceptions -o %t && %run %t
-// RUN: %clangxx_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 %s -fno-exceptions -o %t && %run %t
+// RUN: %clangxx_dfsan %s -fno-exceptions -D_GLIBCXX_NO_ASSERTIONS -o %t && %run %t
+// RUN: %clangxx_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 %s -fno-exceptions -D_GLIBCXX_NO_ASSERTIONS -o %t && %run %t
//
// Use -fno-exceptions to turn off exceptions to avoid instrumenting
// __cxa_begin_catch, std::terminate and __gxx_personality_v0.
//
+// Use -D_GLIBCXX_NO_ASSERTIONS to avoid depending on
+// std::__glibcxx_assert_fail with gcc >= 15.
+//
// TODO: Support builtin atomics. For example, https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
// DFSan instrumentation pass cannot identify builtin callsites yet.
More information about the llvm-branch-commits
mailing list