[clang] [llvm] [clang] Support ASan on WASI (PR #139014)
Yuta Saito via llvm-commits
llvm-commits at lists.llvm.org
Wed May 7 21:02:19 PDT 2025
https://github.com/kateinoigakukun created https://github.com/llvm/llvm-project/pull/139014
I'm working on porting ASan to Wasm/WASI targets, and this is the first part of the change sets. I'll post runtime changes later.
This change makes `-fsanitize=address` available for WASI target by replicating what we do for Emscripten because they share the same memory model.
>From d7f0e0bc05a00c2ea5c8a85a641d5f7fa9c410ee Mon Sep 17 00:00:00 2001
From: Yuta Saito <kateinoigakukun at gmail.com>
Date: Tue, 29 Apr 2025 02:15:48 +0000
Subject: [PATCH] [clang] Support ASan on WASI
This change makes `-fsanitize=address` available for WASI target by
replicating what we do for Emscripten because they share the same
memory model.
---
clang/lib/Driver/ToolChains/WebAssembly.cpp | 7 ++++++-
llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | 8 ++++----
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp
index cd12f2ae5a6de..9fcc33728c1ad 100644
--- a/clang/lib/Driver/ToolChains/WebAssembly.cpp
+++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp
@@ -545,8 +545,13 @@ void WebAssembly::AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
SanitizerMask WebAssembly::getSupportedSanitizers() const {
SanitizerMask Res = ToolChain::getSupportedSanitizers();
if (getTriple().isOSEmscripten()) {
- Res |= SanitizerKind::Vptr | SanitizerKind::Leak | SanitizerKind::Address;
+ Res |= SanitizerKind::Vptr | SanitizerKind::Leak;
}
+
+ if (getTriple().isOSEmscripten() || getTriple().isOSWASI()) {
+ Res |= SanitizerKind::Address;
+ }
+
// -fsanitize=function places two words before the function label, which are
// -unsupported.
Res &= ~SanitizerKind::Function;
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index c1dba77c3532b..840a5e3f31dfd 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -118,7 +118,7 @@ static const uint64_t kNetBSD_ShadowOffset64 = 1ULL << 46;
static const uint64_t kNetBSDKasan_ShadowOffset64 = 0xdfff900000000000;
static const uint64_t kPS_ShadowOffset64 = 1ULL << 40;
static const uint64_t kWindowsShadowOffset32 = 3ULL << 28;
-static const uint64_t kEmscriptenShadowOffset = 0;
+static const uint64_t kWebAssemblyShadowOffset = 0;
// The shadow memory space is dynamically allocated.
static const uint64_t kWindowsShadowOffset64 = kDynamicShadowSentinel;
@@ -499,9 +499,9 @@ static ShadowMapping getShadowMapping(const Triple &TargetTriple, int LongSize,
bool IsRISCV64 = TargetTriple.getArch() == Triple::riscv64;
bool IsWindows = TargetTriple.isOSWindows();
bool IsFuchsia = TargetTriple.isOSFuchsia();
- bool IsEmscripten = TargetTriple.isOSEmscripten();
bool IsAMDGPU = TargetTriple.isAMDGPU();
bool IsHaiku = TargetTriple.isOSHaiku();
+ bool IsWasm = TargetTriple.isWasm();
ShadowMapping Mapping;
@@ -525,8 +525,8 @@ static ShadowMapping getShadowMapping(const Triple &TargetTriple, int LongSize,
Mapping.Offset = kDynamicShadowSentinel;
else if (IsWindows)
Mapping.Offset = kWindowsShadowOffset32;
- else if (IsEmscripten)
- Mapping.Offset = kEmscriptenShadowOffset;
+ else if (IsWasm)
+ Mapping.Offset = kWebAssemblyShadowOffset;
else
Mapping.Offset = kDefaultShadowOffset32;
} else { // LongSize == 64
More information about the llvm-commits
mailing list