Remove top-level Clang -fsanitize= flags for optional ASan features.
[oota-llvm.git] / test / Instrumentation / AddressSanitizer / lifetime.ll
1 ; Test hanlding of llvm.lifetime intrinsics.
2 ; RUN: opt < %s -asan -asan-module -asan-check-lifetime -asan-use-after-return=0 -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-LABEL: define void @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-LABEL: define void @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-LABEL: define void @phi_args(i1 %x)
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 }