[NewPM] Port Msan
Summary:
Keeping msan a function pass requires replacing the module level initialization:
That means, don't define a ctor function which calls __msan_init, instead just
declare the init function at the first access, and add that to the global ctors
list.
Changes:
- Pull the actual sanitizer and the wrapper pass apart.
- Add a newpm msan pass. The function pass inserts calls to runtime
library functions, for which it inserts declarations as necessary.
- Update tests.
Caveats:
- There is one test that I dropped, because it specifically tested the
definition of the ctor.
Reviewers: chandlerc, fedor.sergeev, leonardchan, vitalybuka
Subscribers: sdardis, nemanjai, javed.absar, hiraditya, kbarton, bollu, atanasyan, jsji
Differential Revision: https://reviews.llvm.org/D55647
llvm-svn: 350305
2019-01-03 13:42:44 +00:00
|
|
|
; RUN: opt < %s -msan-check-access-address=0 -msan-check-constant-shadow=1 \
|
|
|
|
; RUN: -msan-track-origins=1 -S -passes=msan 2>&1 | FileCheck %s
|
2015-01-20 15:21:35 +00:00
|
|
|
; RUN: opt < %s -msan -msan-check-access-address=0 -msan-check-constant-shadow=1 -msan-track-origins=1 -S | FileCheck %s
|
2014-10-24 23:34:15 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2015-01-20 15:21:35 +00:00
|
|
|
; main() is special: it inserts check for the return value
|
2014-10-24 23:34:15 +00:00
|
|
|
define i32 @main() nounwind uwtable sanitize_memory {
|
|
|
|
entry:
|
|
|
|
ret i32 undef
|
|
|
|
}
|
|
|
|
|
|
|
|
; CHECK-LABEL: @main
|
[MSAN] Pass Origin by parameter to __msan_warning functions
Summary:
Normally, the Origin is passed over TLS, which seems like it introduces unnecessary overhead. It's in the (extremely) cold path though, so the only overhead is in code size.
But with eager-checks, calls to __msan_warning functions are extremely common, so this becomes a useful optimization.
This can save ~5% code size.
Reviewers: eugenis, vitalybuka
Reviewed By: eugenis, vitalybuka
Subscribers: hiraditya, #sanitizers, llvm-commits
Tags: #sanitizers, #llvm
Differential Revision: https://reviews.llvm.org/D81700
2020-06-15 15:17:00 -07:00
|
|
|
; CHECK: call void @__msan_warning_with_origin_noreturn
|
2014-10-24 23:34:15 +00:00
|
|
|
; CHECK: ret i32 undef
|
2015-01-20 15:21:35 +00:00
|
|
|
|
|
|
|
|
|
|
|
; This function stores known initialized value.
|
|
|
|
; Expect 2 stores: one for the shadow (0), one for the value (42), but no origin.
|
|
|
|
define void @StoreConstant(i32* nocapture %p) nounwind uwtable sanitize_memory {
|
|
|
|
entry:
|
|
|
|
store i32 42, i32* %p, align 4
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; CHECK-LABEL: @StoreConstant
|
|
|
|
; CHECK-NOT: store i32
|
|
|
|
; CHECK: store i32 0,
|
|
|
|
; CHECK-NOT: store i32
|
|
|
|
; CHECK: store i32 42,
|
|
|
|
; CHECK-NOT: store i32
|
|
|
|
; CHECK: ret void
|
|
|
|
|
|
|
|
|
|
|
|
; This function stores known uninitialized value.
|
|
|
|
; Expect 3 stores: shadow, value and origin.
|
|
|
|
; Expect no icmp(s): everything here is unconditional.
|
|
|
|
define void @StoreUndef(i32* nocapture %p) nounwind uwtable sanitize_memory {
|
|
|
|
entry:
|
|
|
|
store i32 undef, i32* %p, align 4
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; CHECK-LABEL: @StoreUndef
|
|
|
|
; CHECK-NOT: icmp
|
|
|
|
; CHECK: store i32
|
|
|
|
; CHECK-NOT: icmp
|
|
|
|
; CHECK: store i32
|
|
|
|
; CHECK-NOT: icmp
|
|
|
|
; CHECK: store i32
|
|
|
|
; CHECK-NOT: icmp
|
|
|
|
; CHECK: ret void
|