1*9880d681SAndroid Build Coastguard Worker; Test hanlding of llvm.lifetime intrinsics. 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -asan -asan-module -asan-use-after-scope -asan-use-after-return=0 -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -asan -asan-module -asan-use-after-scope -asan-use-after-return=0 -asan-instrument-allocas=0 -S | FileCheck %s --check-prefix=CHECK-NO-DYNAMIC 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workertarget 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" 6*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.lifetime.start(i64, i8* nocapture) nounwind 9*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.lifetime.end(i64, i8* nocapture) nounwind 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine void @lifetime_no_size() sanitize_address { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker %i = alloca i32, align 4 14*9880d681SAndroid Build Coastguard Worker %i.ptr = bitcast i32* %i to i8* 15*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 -1, i8* %i.ptr) 16*9880d681SAndroid Build Coastguard Worker store volatile i8 0, i8* %i.ptr 17*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.end(i64 -1, i8* %i.ptr) 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; Check that lifetime with no size are ignored. 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @lifetime_no_size() 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @__asan_poison_stack_memory 22*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @__asan_unpoison_stack_memory 23*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 24*9880d681SAndroid Build Coastguard Worker ret void 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; Generic case of lifetime analysis. 28*9880d681SAndroid Build Coastguard Workerdefine void @lifetime() sanitize_address { 29*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: define void @lifetime() 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker ; Regular variable lifetime intrinsics. 32*9880d681SAndroid Build Coastguard Worker %i = alloca i32, align 4 33*9880d681SAndroid Build Coastguard Worker %i.ptr = bitcast i32* %i to i8* 34*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 3, i8* %i.ptr) 35*9880d681SAndroid Build Coastguard Worker store volatile i8 0, i8* %i.ptr 36*9880d681SAndroid Build Coastguard Worker ; Memory is unpoisoned at llvm.lifetime.start 37*9880d681SAndroid Build Coastguard Worker ; CHECK: %[[VAR:[^ ]*]] = ptrtoint i32* %{{[^ ]+}} to i64 38*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: call void @__asan_unpoison_stack_memory(i64 %[[VAR]], i64 3) 39*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.end(i64 4, i8* %i.ptr) 40*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.end(i64 2, i8* %i.ptr) 41*9880d681SAndroid Build Coastguard Worker ; Memory is poisoned at every call to llvm.lifetime.end 42*9880d681SAndroid Build Coastguard Worker ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 4) 43*9880d681SAndroid Build Coastguard Worker ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 2) 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker ; Lifetime intrinsics for array. 46*9880d681SAndroid Build Coastguard Worker %arr = alloca [10 x i32], align 16 47*9880d681SAndroid Build Coastguard Worker %arr.ptr = bitcast [10 x i32]* %arr to i8* 48*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 40, i8* %arr.ptr) 49*9880d681SAndroid Build Coastguard Worker store volatile i8 0, i8* %arr.ptr 50*9880d681SAndroid Build Coastguard Worker ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 40) 51*9880d681SAndroid Build Coastguard Worker ; CHECK-NO-DYNAMIC-NOT: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 40) 52*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.end(i64 40, i8* %arr.ptr) 53*9880d681SAndroid Build Coastguard Worker ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 40) 54*9880d681SAndroid Build Coastguard Worker ; CHECK-NO-DYNAMIC-NOT: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 40) 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker ; One more lifetime start/end for the same variable %i. 57*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 4, i8* %i.ptr) 58*9880d681SAndroid Build Coastguard Worker store volatile i8 0, i8* %i.ptr 59*9880d681SAndroid Build Coastguard Worker ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 4) 60*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.end(i64 4, i8* %i.ptr) 61*9880d681SAndroid Build Coastguard Worker ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 4) 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker ; Memory is unpoisoned at function exit (only once). 64*9880d681SAndroid Build Coastguard Worker ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 {{.*}}) 65*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: @__asan_unpoison_stack_memory 66*9880d681SAndroid Build Coastguard Worker ; CHECK: ret void 67*9880d681SAndroid Build Coastguard Worker ret void 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; Check that arguments of lifetime may come from phi nodes. 71*9880d681SAndroid Build Coastguard Workerdefine void @phi_args(i1 %x) sanitize_address { 72*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: define void @phi_args(i1 %x) 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker %i = alloca i64, align 4 76*9880d681SAndroid Build Coastguard Worker %i.ptr = bitcast i64* %i to i8* 77*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 8, i8* %i.ptr) 78*9880d681SAndroid Build Coastguard Worker store volatile i8 0, i8* %i.ptr 79*9880d681SAndroid Build Coastguard Worker ; CHECK: __asan_unpoison_stack_memory 80*9880d681SAndroid Build Coastguard Worker br i1 %x, label %bb0, label %bb1 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerbb0: 83*9880d681SAndroid Build Coastguard Worker %i.ptr2 = bitcast i64* %i to i8* 84*9880d681SAndroid Build Coastguard Worker br label %bb1 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerbb1: 87*9880d681SAndroid Build Coastguard Worker %i.phi = phi i8* [ %i.ptr, %entry ], [ %i.ptr2, %bb0 ] 88*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.end(i64 8, i8* %i.phi) 89*9880d681SAndroid Build Coastguard Worker ; CHECK: __asan_poison_stack_memory 90*9880d681SAndroid Build Coastguard Worker ; CHECK: ret void 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine void @zero_sized(i64 %a) #0 { 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @zero_sized(i64 %a) 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerentry: 98*9880d681SAndroid Build Coastguard Worker %a.addr = alloca i64, align 8 99*9880d681SAndroid Build Coastguard Worker %b = alloca [0 x i8], align 1 100*9880d681SAndroid Build Coastguard Worker store i64 %a, i64* %a.addr, align 8 101*9880d681SAndroid Build Coastguard Worker %0 = bitcast [0 x i8]* %b to i8* 102*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 0, i8* %0) #2 103*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: call void @__asan_unpoison_stack_memory 104*9880d681SAndroid Build Coastguard Worker %1 = bitcast [0 x i8]* %b to i8* 105*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.end(i64 0, i8* %1) #2 106*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: call void @__asan_poison_stack_memory 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker ret void 109*9880d681SAndroid Build Coastguard Worker} 110