[msan] Make -msan-check-constant-shadow a bit stronger.

Allow (under the experimental flag) non-Instructions to participate in MSan checks.

llvm-svn: 220601
This commit is contained in:
Evgeniy Stepanov 2014-10-24 23:34:15 +00:00
parent 5a52e6dc9e
commit d337a59db5
2 changed files with 25 additions and 3 deletions

View File

@ -1062,9 +1062,16 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
/// UMR warning in runtime if the value is not fully defined.
void insertShadowCheck(Value *Val, Instruction *OrigIns) {
assert(Val);
Instruction *Shadow = dyn_cast_or_null<Instruction>(getShadow(Val));
if (!Shadow) return;
Instruction *Origin = dyn_cast_or_null<Instruction>(getOrigin(Val));
Value *Shadow, *Origin;
if (ClCheckConstantShadow) {
Shadow = getShadow(Val);
if (!Shadow) return;
Origin = getOrigin(Val);
} else {
Shadow = dyn_cast_or_null<Instruction>(getShadow(Val));
if (!Shadow) return;
Origin = dyn_cast_or_null<Instruction>(getOrigin(Val));
}
insertShadowCheck(Shadow, Origin, OrigIns);
}

View File

@ -0,0 +1,15 @@
; RUN: opt < %s -msan -msan-check-constant-shadow=1 -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Test that returning a literal undef from main() triggers an MSan warning.
define i32 @main() nounwind uwtable sanitize_memory {
entry:
ret i32 undef
}
; CHECK-LABEL: @main
; CHECK: call void @__msan_warning_noreturn
; CHECK: ret i32 undef