Author: Thurston Dang Date: 2025-06-24T15:52:53-07:00 New Revision: ded97817c5f465aaea9f923d6ec247c8ace0f0c2
URL: https://github.com/llvm/llvm-project/commit/ded97817c5f465aaea9f923d6ec247c8ace0f0c2 DIFF: https://github.com/llvm/llvm-project/commit/ded97817c5f465aaea9f923d6ec247c8ace0f0c2.diff LOG: Revert "[msan] Automatically print shadow for failing outlined checks (#145107)" This reverts commit 1b71ea411a9d36705663b1724ececbdfec7cc98c. Added: Modified: compiler-rt/lib/msan/msan.cpp compiler-rt/lib/msan/msan_interface_internal.h llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp llvm/test/Instrumentation/MemorySanitizer/with-call-type-size.ll Removed: compiler-rt/test/msan/msan_print_shadow_on_outlined_check.cpp ################################################################################ diff --git a/compiler-rt/lib/msan/msan.cpp b/compiler-rt/lib/msan/msan.cpp index 67879e37fad5e..a3c0c2e485af3 100644 --- a/compiler-rt/lib/msan/msan.cpp +++ b/compiler-rt/lib/msan/msan.cpp @@ -352,38 +352,16 @@ void __sanitizer::BufferedStackTrace::UnwindImpl( using namespace __msan; -// N.B. Only [shadow, shadow+size) is defined. shadow is *not* a pointer into -// an MSan shadow region. -static void print_shadow_value(void *shadow, u64 size) { - Printf("Shadow value (%llu byte%s):", size, size == 1 ? "" : "s"); - for (unsigned int i = 0; i < size; i++) { - if (i % 4 == 0) - Printf(" "); - - unsigned char x = ((unsigned char *)shadow)[i]; - Printf("%x%x", x >> 4, x & 0xf); - } - Printf("\n"); - Printf( - "Caveat: the shadow value does not necessarily directly correspond to a " - "single user variable. The correspondence is stronger, but not always " - "perfect, when origin tracking is enabled.\n"); - Printf("\n"); -} - -#define MSAN_MAYBE_WARNING(type, size) \ - void __msan_maybe_warning_##size(type s, u32 o) { \ - GET_CALLER_PC_BP; \ - \ - if (UNLIKELY(s)) { \ - if (Verbosity() >= 1) \ - print_shadow_value((void *)(&s), sizeof(s)); \ - PrintWarningWithOrigin(pc, bp, o); \ - if (__msan::flags()->halt_on_error) { \ - Printf("Exiting\n"); \ - Die(); \ - } \ - } \ +#define MSAN_MAYBE_WARNING(type, size) \ + void __msan_maybe_warning_##size(type s, u32 o) { \ + GET_CALLER_PC_BP; \ + if (UNLIKELY(s)) { \ + PrintWarningWithOrigin(pc, bp, o); \ + if (__msan::flags()->halt_on_error) { \ + Printf("Exiting\n"); \ + Die(); \ + } \ + } \ } MSAN_MAYBE_WARNING(u8, 1) @@ -391,30 +369,6 @@ MSAN_MAYBE_WARNING(u16, 2) MSAN_MAYBE_WARNING(u32, 4) MSAN_MAYBE_WARNING(u64, 8) -// N.B. Only [shadow, shadow+size) is defined. shadow is *not* a pointer into -// an MSan shadow region. -void __msan_maybe_warning_N(void *shadow, u64 size, u32 o) { - GET_CALLER_PC_BP; - - bool allZero = true; - for (unsigned int i = 0; i < size; i++) { - if (((char *)shadow)[i]) { - allZero = false; - break; - } - } - - if (UNLIKELY(!allZero)) { - if (Verbosity() >= 1) - print_shadow_value(shadow, size); - PrintWarningWithOrigin(pc, bp, o); - if (__msan::flags()->halt_on_error) { - Printf("Exiting\n"); - Die(); - } - } -} - #define MSAN_MAYBE_STORE_ORIGIN(type, size) \ void __msan_maybe_store_origin_##size(type s, void *p, u32 o) { \ if (UNLIKELY(s)) { \ diff --git a/compiler-rt/lib/msan/msan_interface_internal.h b/compiler-rt/lib/msan/msan_interface_internal.h index 75425b98166a9..c2eead13c20cf 100644 --- a/compiler-rt/lib/msan/msan_interface_internal.h +++ b/compiler-rt/lib/msan/msan_interface_internal.h @@ -60,8 +60,6 @@ SANITIZER_INTERFACE_ATTRIBUTE void __msan_maybe_warning_4(u32 s, u32 o); SANITIZER_INTERFACE_ATTRIBUTE void __msan_maybe_warning_8(u64 s, u32 o); -SANITIZER_INTERFACE_ATTRIBUTE -void __msan_maybe_warning_N(void *shadow, u64 size, u32 o); SANITIZER_INTERFACE_ATTRIBUTE void __msan_maybe_store_origin_1(u8 s, void *p, u32 o); diff --git a/compiler-rt/test/msan/msan_print_shadow_on_outlined_check.cpp b/compiler-rt/test/msan/msan_print_shadow_on_outlined_check.cpp deleted file mode 100644 index 3ecb1277f23cc..0000000000000 --- a/compiler-rt/test/msan/msan_print_shadow_on_outlined_check.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// RUN: %clangxx_msan -fsanitize-recover=memory -mllvm -msan-instrumentation-with-call-threshold=0 -g %s -o %t \ -// RUN: && not env MSAN_OPTIONS=verbosity=1 %run %t 2>&1 | FileCheck %s - -#include <ctype.h> -#include <stdio.h> - -#include <sanitizer/msan_interface.h> - -int main(int argc, char *argv[]) { - long double a; - printf("a: %Lf\n", a); - // CHECK: Shadow value (16 bytes): ffffffff ffffffff ffff0000 00000000 - - unsigned long long b; - printf("b: %llu\n", b); - // CHECK: Shadow value (8 bytes): ffffffff ffffffff - - char *p = (char *)(&b); - p[2] = 36; - printf("b: %lld\n", b); - // CHECK: Shadow value (8 bytes): ffff00ff ffffffff - - b = b << 8; - printf("b: %lld\n", b); - __msan_print_shadow(&b, sizeof(b)); - // CHECK: Shadow value (8 bytes): 00ffff00 ffffffff - - unsigned int c; - printf("c: %u\n", c); - // CHECK: Shadow value (4 bytes): ffffffff - - // Converted to boolean - if (c) { - // CHECK: Shadow value (1 byte): 01 - printf("Hello\n"); - } - - return 0; -} diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index a6f9992383cd3..3941bed37ebaf 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -665,7 +665,6 @@ class MemorySanitizer { // These arrays are indexed by log2(AccessSize). FunctionCallee MaybeWarningFn[kNumberOfAccessSizes]; - FunctionCallee MaybeWarningVarSizeFn; FunctionCallee MaybeStoreOriginFn[kNumberOfAccessSizes]; /// Run-time helper that generates a new origin value for a stack @@ -940,9 +939,7 @@ void MemorySanitizer::createUserspaceApi(Module &M, MaybeWarningFn[AccessSizeIndex] = M.getOrInsertFunction( FunctionName, TLI.getAttrList(C, {0, 1}, /*Signed=*/false), IRB.getVoidTy(), IRB.getIntNTy(AccessSize * 8), IRB.getInt32Ty()); - MaybeWarningVarSizeFn = M.getOrInsertFunction( - "__msan_maybe_warning_N", TLI.getAttrList(C, {}, /*Signed=*/false), - IRB.getVoidTy(), PtrTy, IRB.getInt64Ty(), IRB.getInt32Ty()); + FunctionName = "__msan_maybe_store_origin_" + itostr(AccessSize); MaybeStoreOriginFn[AccessSizeIndex] = M.getOrInsertFunction( FunctionName, TLI.getAttrList(C, {0, 2}, /*Signed=*/false), @@ -1251,6 +1248,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { // Constants likely will be eliminated by follow-up passes. if (isa<Constant>(V)) return false; + ++SplittableBlocksCount; return ClInstrumentationWithCallThreshold >= 0 && SplittableBlocksCount > ClInstrumentationWithCallThreshold; @@ -1449,32 +1447,18 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { const DataLayout &DL = F.getDataLayout(); TypeSize TypeSizeInBits = DL.getTypeSizeInBits(ConvertedShadow->getType()); unsigned SizeIndex = TypeSizeToSizeIndex(TypeSizeInBits); - if (instrumentWithCalls(ConvertedShadow) && !MS.CompileKernel) { + if (instrumentWithCalls(ConvertedShadow) && + SizeIndex < kNumberOfAccessSizes && !MS.CompileKernel) { + FunctionCallee Fn = MS.MaybeWarningFn[SizeIndex]; // ZExt cannot convert between vector and scalar ConvertedShadow = convertShadowToScalar(ConvertedShadow, IRB); Value *ConvertedShadow2 = IRB.CreateZExt(ConvertedShadow, IRB.getIntNTy(8 * (1 << SizeIndex))); - - if (SizeIndex < kNumberOfAccessSizes) { - FunctionCallee Fn = MS.MaybeWarningFn[SizeIndex]; - CallBase *CB = IRB.CreateCall( - Fn, - {ConvertedShadow2, - MS.TrackOrigins && Origin ? Origin : (Value *)IRB.getInt32(0)}); - CB->addParamAttr(0, Attribute::ZExt); - CB->addParamAttr(1, Attribute::ZExt); - } else { - FunctionCallee Fn = MS.MaybeWarningVarSizeFn; - Value *ShadowAlloca = IRB.CreateAlloca(ConvertedShadow2->getType(), 0u); - IRB.CreateStore(ConvertedShadow2, ShadowAlloca); - unsigned ShadowSize = DL.getTypeAllocSize(ConvertedShadow2->getType()); - CallBase *CB = IRB.CreateCall( - Fn, - {ShadowAlloca, ConstantInt::get(IRB.getInt64Ty(), ShadowSize), - MS.TrackOrigins && Origin ? Origin : (Value *)IRB.getInt32(0)}); - CB->addParamAttr(1, Attribute::ZExt); - CB->addParamAttr(2, Attribute::ZExt); - } + CallBase *CB = IRB.CreateCall( + Fn, {ConvertedShadow2, + MS.TrackOrigins && Origin ? Origin : (Value *)IRB.getInt32(0)}); + CB->addParamAttr(0, Attribute::ZExt); + CB->addParamAttr(1, Attribute::ZExt); } else { Value *Cmp = convertToBool(ConvertedShadow, IRB, "_mscmp"); Instruction *CheckTerm = SplitBlockAndInsertIfThen( diff --git a/llvm/test/Instrumentation/MemorySanitizer/with-call-type-size.ll b/llvm/test/Instrumentation/MemorySanitizer/with-call-type-size.ll index 3b1ab3364b310..0b81e5682062a 100644 --- a/llvm/test/Instrumentation/MemorySanitizer/with-call-type-size.ll +++ b/llvm/test/Instrumentation/MemorySanitizer/with-call-type-size.ll @@ -73,30 +73,13 @@ define <4 x i32> @test64(<4 x i32> %vec, i64 %idx, i32 %x) sanitize_memory { ; CHECK: call void @__msan_maybe_warning_8(i64 zeroext %{{.*}}, i32 zeroext 0) ; CHECK: ret <4 x i32> -; Type size too large => use variable-size handler. +; Type size too large => inline check. define <4 x i32> @test65(<4 x i32> %vec, i65 %idx, i32 %x) sanitize_memory { %vec1 = insertelement <4 x i32> %vec, i32 %x, i65 %idx ret <4 x i32> %vec1 } ; CHECK-LABEL: @test65( -; CHECK: %[[A:.*]] = zext i65 %1 to i128 -; CHECK: call void @__msan_maybe_warning_N(ptr %{{.*}}, i64 zeroext 16, i32 zeroext 0) -; CHECK: ret <4 x i32> - -define <4 x i32> @test128(<4 x i32> %vec, i128 %idx, i32 %x) sanitize_memory { - %vec1 = insertelement <4 x i32> %vec, i32 %x, i128 %idx - ret <4 x i32> %vec1 -} -; CHECK-LABEL: @test128( -; CHECK: call void @__msan_maybe_warning_N(ptr %{{.*}}, i64 zeroext 16, i32 zeroext 0) -; CHECK: ret <4 x i32> - -define <4 x i32> @test256(<4 x i32> %vec, i256 %idx, i32 %x) sanitize_memory { - %vec1 = insertelement <4 x i32> %vec, i32 %x, i256 %idx - ret <4 x i32> %vec1 -} -; CHECK-LABEL: @test256( -; CHECK: call void @__msan_maybe_warning_N(ptr %{{.*}}, i64 zeroext 32, i32 zeroext 0) +; CHECK: call void @__msan_warning_noreturn ; CHECK: ret <4 x i32> define <4 x i32> @testUndef(<4 x i32> %vec, i32 %x) sanitize_memory { _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits