[llvm-branch-commits] [llvm] ded9781 - Revert "[msan] Automatically print shadow for failing outlined checks (#145107)"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jun 24 15:52:55 PDT 2025
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 {
More information about the llvm-branch-commits
mailing list