xref: /aosp_15_r20/external/llvm/test/Instrumentation/AddressSanitizer/lifetime.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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