1 ; Test hanlding of llvm.lifetime intrinsics. 2 ; RUN: opt < %s -asan -asan-check-lifetime -S | FileCheck %s 3 4 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" 5 target triple = "x86_64-unknown-linux-gnu" 6 7 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind 8 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind 9 10 define void @lifetime_no_size() sanitize_address { 11 entry: 12 %i = alloca i32, align 4 13 %i.ptr = bitcast i32* %i to i8* 14 call void @llvm.lifetime.start(i64 -1, i8* %i.ptr) 15 call void @llvm.lifetime.end(i64 -1, i8* %i.ptr) 16 17 ; Check that lifetime with no size are ignored. 18 ; CHECK: @lifetime_no_size 19 ; CHECK-NOT: @__asan_poison_stack_memory 20 ; CHECK-NOT: @__asan_unpoison_stack_memory 21 ; CHECK: ret void 22 ret void 23 } 24 25 ; Generic case of lifetime analysis. 26 define void @lifetime() sanitize_address { 27 ; CHECK: @lifetime 28 29 ; Regular variable lifetime intrinsics. 30 %i = alloca i32, align 4 31 %i.ptr = bitcast i32* %i to i8* 32 call void @llvm.lifetime.start(i64 3, i8* %i.ptr) 33 ; Memory is unpoisoned at llvm.lifetime.start 34 ; CHECK: %[[VAR:[^ ]*]] = ptrtoint i32* %{{[^ ]+}} to i64 35 ; CHECK-NEXT: call void @__asan_unpoison_stack_memory(i64 %[[VAR]], i64 3) 36 call void @llvm.lifetime.end(i64 4, i8* %i.ptr) 37 call void @llvm.lifetime.end(i64 2, i8* %i.ptr) 38 ; Memory is poisoned at every call to llvm.lifetime.end 39 ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 4) 40 ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 2) 41 42 ; Lifetime intrinsics for array. 43 %arr = alloca [10 x i32], align 16 44 %arr.ptr = bitcast [10 x i32]* %arr to i8* 45 call void @llvm.lifetime.start(i64 40, i8* %arr.ptr) 46 ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 40) 47 call void @llvm.lifetime.end(i64 40, i8* %arr.ptr) 48 ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 40) 49 50 ; One more lifetime start/end for the same variable %i. 51 call void @llvm.lifetime.start(i64 4, i8* %i.ptr) 52 ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 4) 53 call void @llvm.lifetime.end(i64 4, i8* %i.ptr) 54 ; CHECK: call void @__asan_poison_stack_memory(i64 %{{[^ ]+}}, i64 4) 55 56 ; Memory is unpoisoned at function exit (only once). 57 ; CHECK: call void @__asan_unpoison_stack_memory(i64 %{{[^ ]+}}, i64 {{.*}}) 58 ; CHECK-NOT: @__asan_unpoison_stack_memory 59 ; CHECK: ret void 60 ret void 61 } 62 63 ; Check that arguments of lifetime may come from phi nodes. 64 define void @phi_args(i1 %x) sanitize_address { 65 ; CHECK: @phi_args 66 67 entry: 68 %i = alloca i64, align 4 69 %i.ptr = bitcast i64* %i to i8* 70 call void @llvm.lifetime.start(i64 8, i8* %i.ptr) 71 ; CHECK: __asan_unpoison_stack_memory 72 br i1 %x, label %bb0, label %bb1 73 74 bb0: 75 %i.ptr2 = bitcast i64* %i to i8* 76 br label %bb1 77 78 bb1: 79 %i.phi = phi i8* [ %i.ptr, %entry ], [ %i.ptr2, %bb0 ] 80 call void @llvm.lifetime.end(i64 8, i8* %i.phi) 81 ; CHECK: __asan_poison_stack_memory 82 ; CHECK: ret void 83 ret void 84 } 85