[WebAssembly] Implement Address Sanitizer for Emscripten
Summary: This diff enables address sanitizer on Emscripten. On Emscripten, real memory starts at the value passed to --global-base. All memory before this is used as shadow memory, and thus the shadow mapping function is simply dividing by 8. Reviewers: tlively, aheejin, sbc100 Reviewed By: sbc100 Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D63742 llvm-svn: 364468
This commit is contained in:
parent
e15dc95466
commit
9aad997a5a
|
@ -238,7 +238,7 @@ void WebAssembly::AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
|
|||
SanitizerMask WebAssembly::getSupportedSanitizers() const {
|
||||
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
||||
if (getTriple().isOSEmscripten()) {
|
||||
Res |= SanitizerKind::Vptr | SanitizerKind::Leak;
|
||||
Res |= SanitizerKind::Vptr | SanitizerKind::Leak | SanitizerKind::Address;
|
||||
}
|
||||
return Res;
|
||||
}
|
||||
|
|
|
@ -60,3 +60,7 @@
|
|||
// RUN: --sysroot=/foo %s -pthread -mno-atomics 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=PTHREAD_NO_ATOMICS %s
|
||||
// PTHREAD_NO_ATOMICS: invalid argument '-pthread' not allowed with '-mno-atomics'
|
||||
|
||||
// RUN: %clang %s -### -fsanitize=address -target wasm32-unknown-emscripten 2>&1 | FileCheck -check-prefix=CHECK-ASAN-EMSCRIPTEN %s
|
||||
// CHECK-ASAN-EMSCRIPTEN: "-fsanitize=address"
|
||||
// CHECK-ASAN-EMSCRIPTEN: "-fsanitize-address-globals-dead-stripping"
|
||||
|
|
|
@ -109,6 +109,7 @@ static const uint64_t kNetBSD_ShadowOffset64 = 1ULL << 46;
|
|||
static const uint64_t kNetBSDKasan_ShadowOffset64 = 0xdfff900000000000;
|
||||
static const uint64_t kPS4CPU_ShadowOffset64 = 1ULL << 40;
|
||||
static const uint64_t kWindowsShadowOffset32 = 3ULL << 28;
|
||||
static const uint64_t kEmscriptenShadowOffset = 0;
|
||||
|
||||
static const uint64_t kMyriadShadowScale = 5;
|
||||
static const uint64_t kMyriadMemoryOffset32 = 0x80000000ULL;
|
||||
|
@ -433,6 +434,7 @@ static ShadowMapping getShadowMapping(Triple &TargetTriple, int LongSize,
|
|||
bool IsWindows = TargetTriple.isOSWindows();
|
||||
bool IsFuchsia = TargetTriple.isOSFuchsia();
|
||||
bool IsMyriad = TargetTriple.getVendor() == llvm::Triple::Myriad;
|
||||
bool IsEmscripten = TargetTriple.isOSEmscripten();
|
||||
|
||||
ShadowMapping Mapping;
|
||||
|
||||
|
@ -454,6 +456,8 @@ static ShadowMapping getShadowMapping(Triple &TargetTriple, int LongSize,
|
|||
Mapping.Offset = kDynamicShadowSentinel;
|
||||
else if (IsWindows)
|
||||
Mapping.Offset = kWindowsShadowOffset32;
|
||||
else if (IsEmscripten)
|
||||
Mapping.Offset = kEmscriptenShadowOffset;
|
||||
else if (IsMyriad) {
|
||||
uint64_t ShadowOffset = (kMyriadMemoryOffset32 + kMyriadMemorySize32 -
|
||||
(kMyriadMemorySize32 >> Mapping.Scale));
|
||||
|
|
Loading…
Reference in New Issue