diff options
Diffstat (limited to 'llvm/test/Instrumentation/MemorySanitizer/msan_x86_bts_asm.ll')
| -rw-r--r-- | llvm/test/Instrumentation/MemorySanitizer/msan_x86_bts_asm.ll | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/llvm/test/Instrumentation/MemorySanitizer/msan_x86_bts_asm.ll b/llvm/test/Instrumentation/MemorySanitizer/msan_x86_bts_asm.ll index 7240e1086da..c9e6f1afe21 100644 --- a/llvm/test/Instrumentation/MemorySanitizer/msan_x86_bts_asm.ll +++ b/llvm/test/Instrumentation/MemorySanitizer/msan_x86_bts_asm.ll @@ -1,6 +1,6 @@ ; Test for the conservative assembly handling mode used by KMSAN. -; RUN: opt < %s -msan -msan-check-access-address=0 -msan-handle-asm-conservative=0 -S | FileCheck -check-prefixes=CHECK,CHECK-NONCONS %s -; RUN: opt < %s -msan -msan-check-access-address=0 -msan-handle-asm-conservative=1 -S | FileCheck -check-prefixes=CHECK,CHECK-CONS %s +; RUN: opt < %s -msan -msan-kernel=1 -msan-check-access-address=0 -msan-handle-asm-conservative=0 -S | FileCheck -check-prefixes=CHECK,CHECK-NONCONS %s +; RUN: opt < %s -msan -msan-kernel=1 -msan-check-access-address=0 -msan-handle-asm-conservative=1 -S | FileCheck -check-prefixes=CHECK,CHECK-CONS %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -52,9 +52,16 @@ if.else: ; preds = %entry ret i32 1 } +; %nr is first poisoned, then unpoisoned (written to). Need to optimize this in the future. +; CHECK: [[NRC1:%.*]] = bitcast i64* %nr to i8* +; CHECK: call void @__msan_poison_alloca(i8* [[NRC1]]{{.*}}) +; CHECK: [[NRC2:%.*]] = bitcast i64* %nr to i8* +; CHECK: call { i8*, i32* } @__msan_metadata_ptr_for_store_8(i8* [[NRC2]]) + ; Hooks for inputs usually go before the assembly statement. But here we have none, ; because %nr is passed by value. However we check %nr for being initialized. -; CHECK-CONS: [[NRC:%.*]] = ptrtoint i64* %nr to i64 +; CHECK-CONS: [[NRC3:%.*]] = bitcast i64* %nr to i8* +; CHECK-CONS: call { i8*, i32* } @__msan_metadata_ptr_for_load_8(i8* [[NRC3]]) ; In the conservative mode, call the store hooks for %bit and %addr: ; CHECK-CONS: call void @__msan_instrument_asm_store(i8* %bit, i64 1) @@ -62,14 +69,17 @@ if.else: ; preds = %entry ; CHECK-CONS: call void @__msan_instrument_asm_store(i8* [[ADDR8S]], i64 8) ; Landing pad for the %nr check above. -; CHECK-CONS: call void @__msan_warning_noreturn() +; CHECK-CONS: call void @__msan_warning ; CHECK: call void asm "btsq $2, $1; setc $0" ; Calculating the shadow offset of %bit. -; CHECK: [[PTR:%.*]] = ptrtoint {{.*}} %bit to i64 -; CHECK: [[SH_NUM:%.*]] = xor i64 [[PTR]] -; CHECK: [[SHADOW:%.*]] = inttoptr i64 [[SH_NUM]] {{.*}} +; CHECKz: [[PTR:%.*]] = ptrtoint {{.*}} %bit to i64 +; CHECKz: [[SH_NUM:%.*]] = xor i64 [[PTR]] +; CHECKz: [[SHADOW:%.*]] = inttoptr i64 [[SH_NUM]] {{.*}} + +; CHECK: [[META:%.*]] = call {{.*}} @__msan_metadata_ptr_for_load_1(i8* %bit) +; CHECK: [[SHADOW:%.*]] = extractvalue { i8*, i32* } [[META]], 0 ; Now load the shadow value for the boolean. ; CHECK: [[MSLD:%.*]] = load {{.*}} [[SHADOW]] @@ -81,5 +91,5 @@ if.else: ; preds = %entry ; If yes, raise a warning. ; CHECK: <label>:[[IFTRUE]] -; CHECK: call void @__msan_warning_noreturn() +; CHECK: call void @__msan_warning |

