diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp --- a/clang/lib/Driver/ToolChains/WebAssembly.cpp +++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp @@ -457,7 +457,10 @@ SanitizerMask WebAssembly::getSupportedSanitizers() const { SanitizerMask Res = ToolChain::getSupportedSanitizers(); if (getTriple().isOSEmscripten()) { - Res |= SanitizerKind::Vptr | SanitizerKind::Leak | SanitizerKind::Address; + Res |= SanitizerKind::Vptr; + Res |= SanitizerKind::Leak; + Res |= SanitizerKind::Address; + Res |= SanitizerKind::Memory; } return Res; } diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -466,6 +466,22 @@ 0x100000000000, // OriginBase }; +// wasm32 Emscripten +static const MemoryMapParams Emscripten_wasm32_MemoryMapParams = { + 0x000080000000, // AndMask + 0, // XorMask (not used) + 0, // ShadowBase (not used) + 0x000040000000, // OriginBase +}; + +// wasm64 Emscripten +static const MemoryMapParams Emscripten_wasm64_MemoryMapParams = { + 0, // AndMask (not used) + 0x500000000000, // XorMask + 0, // ShadowBase (not used) + 0x100000000000, // OriginBase +}; + static const PlatformMemoryMapParams Linux_X86_MemoryMapParams = { &Linux_I386_MemoryMapParams, &Linux_X86_64_MemoryMapParams, @@ -506,6 +522,11 @@ &NetBSD_X86_64_MemoryMapParams, }; +static const PlatformMemoryMapParams Emscripten_wasm_MemoryMapParams = { + &Emscripten_wasm32_MemoryMapParams, + &Emscripten_wasm64_MemoryMapParams, +}; + namespace { /// Instrument functions of a module to detect uninitialized reads. @@ -990,6 +1011,18 @@ report_fatal_error("unsupported architecture"); } break; + case Triple::Emscripten: + switch (TargetTriple.getArch()) { + case Triple::wasm32: + MapParams = Emscripten_wasm_MemoryMapParams.bits32; + break; + case Triple::wasm64: + MapParams = Emscripten_wasm_MemoryMapParams.bits64; + break; + default: + report_fatal_error("unsupported architecture"); + } + break; default: report_fatal_error("unsupported operating system"); }