mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
3544b0e869
When pointer checking is enabled, it's important that every pointer is checked before its value is used. For stores MSan used to generate code that calculates shadow/origin addresses from a pointer before checking it. For userspace this isn't a problem, because the shadow calculation code is quite simple and compiler is able to move it after the check on -O2. But for KMSAN getShadowOriginPtr() creates a runtime call, so we want the check to be performed strictly before that call. Swapping materializeChecks() and materializeStores() resolves the issue: both functions insert code before the given IR location, so the new insertion order guarantees that the code calculating shadow address is between the address check and the memory access. llvm-svn: 337571
54 lines
1.4 KiB
LLVM
54 lines
1.4 KiB
LLVM
; RUN: opt < %s -msan -msan-check-access-address=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 byval argument shadow alignment
|
|
|
|
define <2 x i64> @ByValArgumentShadowLargeAlignment(<2 x i64>* byval %p) sanitize_memory {
|
|
entry:
|
|
%x = load <2 x i64>, <2 x i64>* %p
|
|
ret <2 x i64> %x
|
|
}
|
|
|
|
; CHECK-LABEL: @ByValArgumentShadowLargeAlignment
|
|
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 {{.*}}, i8* align 8 {{.*}}, i64 16, i1 false)
|
|
; CHECK: ret <2 x i64>
|
|
|
|
|
|
define i16 @ByValArgumentShadowSmallAlignment(i16* byval %p) sanitize_memory {
|
|
entry:
|
|
%x = load i16, i16* %p
|
|
ret i16 %x
|
|
}
|
|
|
|
; CHECK-LABEL: @ByValArgumentShadowSmallAlignment
|
|
; CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 2 {{.*}}, i8* align 2 {{.*}}, i64 2, i1 false)
|
|
; CHECK: ret i16
|
|
|
|
|
|
; Check instrumentation of stores. The check must precede the shadow store.
|
|
|
|
define void @Store(i32* nocapture %p, i32 %x) nounwind uwtable sanitize_memory {
|
|
entry:
|
|
store i32 %x, i32* %p, align 4
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: @Store
|
|
; CHECK: load {{.*}} @__msan_param_tls
|
|
; Shadow calculations must happen after the check.
|
|
; CHECK-NOT: xor
|
|
; CHECK: icmp
|
|
; CHECK: br i1
|
|
; CHECK: <label>
|
|
; CHECK: call void @__msan_warning_noreturn
|
|
; CHECK: <label>
|
|
; CHECK: xor
|
|
; CHECK: store
|
|
; CHECK: store i32 %x
|
|
; CHECK: ret void
|
|
|
|
|