193 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; Test for the conservative assembly handling mode used by KMSAN.3; RUN: opt < %s -msan-kernel=1 -msan-check-access-address=0 -msan-handle-asm-conservative=0 -S -passes=msan 2>&1 | FileCheck %s4; RUN: opt < %s -msan-kernel=1 -msan-check-access-address=0 -msan-handle-asm-conservative=1 -S -passes=msan 2>&1 | FileCheck %s -check-prefixes=CONS5 6target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"7target triple = "i386-unknown-linux-gnu"8 9define dso_local i32 @main() sanitize_memory {10; CHECK-LABEL: define dso_local i32 @main(11; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {12; CHECK-NEXT: [[ENTRY:.*:]]13; CHECK-NEXT: [[TMP0:%.*]] = call ptr @__msan_get_context_state()14; CHECK-NEXT: [[PARAM_SHADOW:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 015; CHECK-NEXT: [[RETVAL_SHADOW:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 116; CHECK-NEXT: [[VA_ARG_SHADOW:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 217; CHECK-NEXT: [[VA_ARG_ORIGIN:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 318; CHECK-NEXT: [[VA_ARG_OVERFLOW_SIZE:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 419; CHECK-NEXT: [[PARAM_ORIGIN:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 520; CHECK-NEXT: [[RETVAL_ORIGIN:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 621; CHECK-NEXT: [[TMP18:%.*]] = load i64, ptr [[VA_ARG_OVERFLOW_SIZE]], align 822; CHECK-NEXT: call void @llvm.donothing()23; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 424; CHECK-NEXT: call void @__msan_poison_alloca(ptr [[RETVAL]], i64 4, ptr @[[GLOB0:[0-9]+]])25; CHECK-NEXT: [[BIT:%.*]] = alloca i8, align 126; CHECK-NEXT: call void @__msan_poison_alloca(ptr [[BIT]], i64 1, ptr @[[GLOB1:[0-9]+]])27; CHECK-NEXT: [[VALUE:%.*]] = alloca i64, align 828; CHECK-NEXT: call void @__msan_poison_alloca(ptr [[VALUE]], i64 8, ptr @[[GLOB2:[0-9]+]])29; CHECK-NEXT: [[NR:%.*]] = alloca i64, align 830; CHECK-NEXT: call void @__msan_poison_alloca(ptr [[NR]], i64 8, ptr @[[GLOB3:[0-9]+]])31; CHECK-NEXT: [[ADDR:%.*]] = alloca ptr, align 832; CHECK-NEXT: call void @__msan_poison_alloca(ptr [[ADDR]], i64 8, ptr @[[GLOB4:[0-9]+]])33; CHECK-NEXT: [[TMP1:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_store_4(ptr [[RETVAL]])34; CHECK-NEXT: [[TMP2:%.*]] = extractvalue { ptr, ptr } [[TMP1]], 035; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { ptr, ptr } [[TMP1]], 136; CHECK-NEXT: store i32 0, ptr [[TMP2]], align 437; CHECK-NEXT: store i32 0, ptr [[RETVAL]], align 438; CHECK-NEXT: [[TMP4:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_store_8(ptr [[VALUE]])39; CHECK-NEXT: [[TMP5:%.*]] = extractvalue { ptr, ptr } [[TMP4]], 040; CHECK-NEXT: [[TMP6:%.*]] = extractvalue { ptr, ptr } [[TMP4]], 141; CHECK-NEXT: store i64 0, ptr [[TMP5]], align 842; CHECK-NEXT: store i64 2, ptr [[VALUE]], align 843; CHECK-NEXT: [[TMP7:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_store_8(ptr [[NR]])44; CHECK-NEXT: [[TMP8:%.*]] = extractvalue { ptr, ptr } [[TMP7]], 045; CHECK-NEXT: [[TMP9:%.*]] = extractvalue { ptr, ptr } [[TMP7]], 146; CHECK-NEXT: store i64 0, ptr [[TMP8]], align 847; CHECK-NEXT: store i64 0, ptr [[NR]], align 848; CHECK-NEXT: [[TMP10:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_store_8(ptr [[ADDR]])49; CHECK-NEXT: [[TMP11:%.*]] = extractvalue { ptr, ptr } [[TMP10]], 050; CHECK-NEXT: [[TMP12:%.*]] = extractvalue { ptr, ptr } [[TMP10]], 151; CHECK-NEXT: store i64 0, ptr [[TMP11]], align 852; CHECK-NEXT: store ptr [[VALUE]], ptr [[ADDR]], align 853; CHECK-NEXT: [[TMP13:%.*]] = load i64, ptr [[NR]], align 854; CHECK-NEXT: [[TMP14:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_load_8(ptr [[NR]])55; CHECK-NEXT: [[TMP15:%.*]] = extractvalue { ptr, ptr } [[TMP14]], 056; CHECK-NEXT: [[TMP16:%.*]] = extractvalue { ptr, ptr } [[TMP14]], 157; CHECK-NEXT: [[_MSLD:%.*]] = load i64, ptr [[TMP15]], align 858; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 859; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSLD]], 060; CHECK-NEXT: br i1 [[_MSCMP]], label %[[BB19:.*]], label %[[BB20:.*]], !prof [[PROF1:![0-9]+]]61; CHECK: [[BB19]]:62; CHECK-NEXT: call void @__msan_warning(i32 [[TMP17]]) #[[ATTR2:[0-9]+]]63; CHECK-NEXT: br label %[[BB20]]64; CHECK: [[BB20]]:65; CHECK-NEXT: call void asm "btsq $2, $166; CHECK-NEXT: [[TMP20:%.*]] = load i8, ptr [[BIT]], align 167; CHECK-NEXT: [[TMP21:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_load_1(ptr [[BIT]])68; CHECK-NEXT: [[TMP22:%.*]] = extractvalue { ptr, ptr } [[TMP21]], 069; CHECK-NEXT: [[TMP23:%.*]] = extractvalue { ptr, ptr } [[TMP21]], 170; CHECK-NEXT: [[_MSLD1:%.*]] = load i8, ptr [[TMP22]], align 171; CHECK-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 472; CHECK-NEXT: [[_MSPROP:%.*]] = trunc i8 [[_MSLD1]] to i173; CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP20]] to i174; CHECK-NEXT: br i1 [[_MSPROP]], label %[[BB26:.*]], label %[[BB27:.*]], !prof [[PROF1]]75; CHECK: [[BB26]]:76; CHECK-NEXT: call void @__msan_warning(i32 [[TMP24]]) #[[ATTR2]]77; CHECK-NEXT: br label %[[BB27]]78; CHECK: [[BB27]]:79; CHECK-NEXT: br i1 [[TOBOOL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]80; CHECK: [[IF_THEN]]:81; CHECK-NEXT: store i32 0, ptr [[RETVAL_SHADOW]], align 882; CHECK-NEXT: ret i32 083; CHECK: [[IF_ELSE]]:84; CHECK-NEXT: store i32 0, ptr [[RETVAL_SHADOW]], align 885; CHECK-NEXT: ret i32 186;87; CONS-LABEL: define dso_local i32 @main(88; CONS-SAME: ) #[[ATTR0:[0-9]+]] {89; CONS-NEXT: [[ENTRY:.*:]]90; CONS-NEXT: [[TMP0:%.*]] = call ptr @__msan_get_context_state()91; CONS-NEXT: [[PARAM_SHADOW:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 092; CONS-NEXT: [[RETVAL_SHADOW:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 193; CONS-NEXT: [[VA_ARG_SHADOW:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 294; CONS-NEXT: [[VA_ARG_ORIGIN:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 395; CONS-NEXT: [[VA_ARG_OVERFLOW_SIZE:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 496; CONS-NEXT: [[PARAM_ORIGIN:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 597; CONS-NEXT: [[RETVAL_ORIGIN:%.*]] = getelementptr { [100 x i64], [100 x i64], [100 x i64], [100 x i64], i64, [200 x i32], i32, i32 }, ptr [[TMP0]], i32 0, i32 698; CONS-NEXT: [[TMP18:%.*]] = load i64, ptr [[VA_ARG_OVERFLOW_SIZE]], align 899; CONS-NEXT: call void @llvm.donothing()100; CONS-NEXT: [[RETVAL:%.*]] = alloca i32, align 4101; CONS-NEXT: call void @__msan_poison_alloca(ptr [[RETVAL]], i64 4, ptr @[[GLOB0:[0-9]+]])102; CONS-NEXT: [[BIT:%.*]] = alloca i8, align 1103; CONS-NEXT: call void @__msan_poison_alloca(ptr [[BIT]], i64 1, ptr @[[GLOB1:[0-9]+]])104; CONS-NEXT: [[VALUE:%.*]] = alloca i64, align 8105; CONS-NEXT: call void @__msan_poison_alloca(ptr [[VALUE]], i64 8, ptr @[[GLOB2:[0-9]+]])106; CONS-NEXT: [[NR:%.*]] = alloca i64, align 8107; CONS-NEXT: call void @__msan_poison_alloca(ptr [[NR]], i64 8, ptr @[[GLOB3:[0-9]+]])108; CONS-NEXT: [[ADDR:%.*]] = alloca ptr, align 8109; CONS-NEXT: call void @__msan_poison_alloca(ptr [[ADDR]], i64 8, ptr @[[GLOB4:[0-9]+]])110; CONS-NEXT: [[TMP1:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_store_4(ptr [[RETVAL]])111; CONS-NEXT: [[TMP2:%.*]] = extractvalue { ptr, ptr } [[TMP1]], 0112; CONS-NEXT: [[TMP3:%.*]] = extractvalue { ptr, ptr } [[TMP1]], 1113; CONS-NEXT: store i32 0, ptr [[TMP2]], align 4114; CONS-NEXT: store i32 0, ptr [[RETVAL]], align 4115; CONS-NEXT: [[TMP4:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_store_8(ptr [[VALUE]])116; CONS-NEXT: [[TMP5:%.*]] = extractvalue { ptr, ptr } [[TMP4]], 0117; CONS-NEXT: [[TMP6:%.*]] = extractvalue { ptr, ptr } [[TMP4]], 1118; CONS-NEXT: store i64 0, ptr [[TMP5]], align 8119; CONS-NEXT: store i64 2, ptr [[VALUE]], align 8120; CONS-NEXT: [[TMP7:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_store_8(ptr [[NR]])121; CONS-NEXT: [[TMP8:%.*]] = extractvalue { ptr, ptr } [[TMP7]], 0122; CONS-NEXT: [[TMP9:%.*]] = extractvalue { ptr, ptr } [[TMP7]], 1123; CONS-NEXT: store i64 0, ptr [[TMP8]], align 8124; CONS-NEXT: store i64 0, ptr [[NR]], align 8125; CONS-NEXT: [[TMP10:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_store_8(ptr [[ADDR]])126; CONS-NEXT: [[TMP11:%.*]] = extractvalue { ptr, ptr } [[TMP10]], 0127; CONS-NEXT: [[TMP12:%.*]] = extractvalue { ptr, ptr } [[TMP10]], 1128; CONS-NEXT: store i64 0, ptr [[TMP11]], align 8129; CONS-NEXT: store ptr [[VALUE]], ptr [[ADDR]], align 8130; CONS-NEXT: [[TMP13:%.*]] = load i64, ptr [[NR]], align 8131; CONS-NEXT: [[TMP14:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_load_8(ptr [[NR]])132; CONS-NEXT: [[TMP15:%.*]] = extractvalue { ptr, ptr } [[TMP14]], 0133; CONS-NEXT: [[TMP16:%.*]] = extractvalue { ptr, ptr } [[TMP14]], 1134; CONS-NEXT: [[_MSLD:%.*]] = load i64, ptr [[TMP15]], align 8135; CONS-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 8136; CONS-NEXT: call void @__msan_instrument_asm_store(ptr [[BIT]], i64 1)137; CONS-NEXT: call void @__msan_instrument_asm_store(ptr [[ADDR]], i64 8)138; CONS-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSLD]], 0139; CONS-NEXT: br i1 [[_MSCMP]], label %[[BB19:.*]], label %[[BB20:.*]], !prof [[PROF1:![0-9]+]]140; CONS: [[BB19]]:141; CONS-NEXT: call void @__msan_warning(i32 [[TMP17]]) #[[ATTR2:[0-9]+]]142; CONS-NEXT: br label %[[BB20]]143; CONS: [[BB20]]:144; CONS-NEXT: call void asm "btsq $2, $1145; CONS-NEXT: [[TMP20:%.*]] = load i8, ptr [[BIT]], align 1146; CONS-NEXT: [[TMP21:%.*]] = call { ptr, ptr } @__msan_metadata_ptr_for_load_1(ptr [[BIT]])147; CONS-NEXT: [[TMP22:%.*]] = extractvalue { ptr, ptr } [[TMP21]], 0148; CONS-NEXT: [[TMP23:%.*]] = extractvalue { ptr, ptr } [[TMP21]], 1149; CONS-NEXT: [[_MSLD1:%.*]] = load i8, ptr [[TMP22]], align 1150; CONS-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP23]], align 4151; CONS-NEXT: [[_MSPROP:%.*]] = trunc i8 [[_MSLD1]] to i1152; CONS-NEXT: [[TOBOOL:%.*]] = trunc i8 [[TMP20]] to i1153; CONS-NEXT: br i1 [[_MSPROP]], label %[[BB26:.*]], label %[[BB27:.*]], !prof [[PROF1]]154; CONS: [[BB26]]:155; CONS-NEXT: call void @__msan_warning(i32 [[TMP24]]) #[[ATTR2]]156; CONS-NEXT: br label %[[BB27]]157; CONS: [[BB27]]:158; CONS-NEXT: br i1 [[TOBOOL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]159; CONS: [[IF_THEN]]:160; CONS-NEXT: store i32 0, ptr [[RETVAL_SHADOW]], align 8161; CONS-NEXT: ret i32 0162; CONS: [[IF_ELSE]]:163; CONS-NEXT: store i32 0, ptr [[RETVAL_SHADOW]], align 8164; CONS-NEXT: ret i32 1165;166entry:167 %retval = alloca i32, align 4168 %bit = alloca i8, align 1169 %value = alloca i64, align 8170 %nr = alloca i64, align 8171 %addr = alloca ptr, align 8172 store i32 0, ptr %retval, align 4173 store i64 2, ptr %value, align 8174 store i64 0, ptr %nr, align 8175 store ptr %value, ptr %addr, align 8176 %0 = load i64, ptr %nr, align 8177 call void asm "btsq $2, $1; setc $0", "=*qm,=*m,Ir,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i8) %bit, ptr elementtype(ptr) %addr, i64 %0)178 %1 = load i8, ptr %bit, align 1179 %tobool = trunc i8 %1 to i1180 br i1 %tobool, label %if.then, label %if.else181 182if.then: ; preds = %entry183 ret i32 0184 185if.else: ; preds = %entry186 ret i32 1187}188;.189; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575}190;.191; CONS: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575}192;.193