; KMSAN instrumentation tests ; RUN: opt < %s -msan -msan-kernel=1 -S | FileCheck %s -check-prefixes=CHECK 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" ; Check the instrumentation prologue. define void @Empty() nounwind uwtable sanitize_memory { entry: ret void } ; CHECK-LABEL: @Empty ; CHECK: entry: ; CHECK: @__msan_get_context_state() ; %param_shadow: ; CHECK: getelementptr {{.*}} i32 0, i32 0 ; %retval_shadow: ; CHECK: getelementptr {{.*}} i32 0, i32 1 ; %va_arg_shadow: ; CHECK: getelementptr {{.*}} i32 0, i32 2 ; %va_arg_origin: ; CHECK: getelementptr {{.*}} i32 0, i32 3 ; %va_arg_overflow_size: ; CHECK: getelementptr {{.*}} i32 0, i32 4 ; %param_origin: ; CHECK: getelementptr {{.*}} i32 0, i32 5 ; %retval_origin: ; CHECK: getelementptr {{.*}} i32 0, i32 6 ; CHECK: entry.split: ; Check instrumentation of stores define void @Store1(i8* nocapture %p, i8 %x) nounwind uwtable sanitize_memory { entry: store i8 %x, i8* %p ret void } ; CHECK-LABEL: @Store1 ; CHECK-LABEL: entry: ; CHECK: @__msan_get_context_state() ; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0 ; CHECK-LABEL: entry.split: ; CHECK: [[BASE2:%[0-9]+]] = ptrtoint {{.*}} [[PARAM_SHADOW]] ; CHECK: [[BASE:%[0-9]+]] = ptrtoint {{.*}} [[PARAM_SHADOW]] ; CHECK: [[SHADOW:%[a-z0-9_]+]] = inttoptr {{.*}} [[BASE]] ; Load the shadow of %p and check it ; CHECK: load i64, i64* [[SHADOW]] ; CHECK: icmp ; CHECK: br i1 ; CHECK-LABEL: