blob: 9c4d416a1eff6c9b327128659333e140b5de23bf [file] [log] [blame]
Chandler Carruth663943e2012-07-16 08:56:46 +00001; Test basic address sanitizer instrumentation.
2;
Alexander Potapenko7aafd312014-03-20 11:16:34 +00003; RUN: opt < %s -asan -asan-module -S | FileCheck %s
Chandler Carruth663943e2012-07-16 08:56:46 +00004
5target 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"
6target triple = "x86_64-unknown-linux-gnu"
Ismail Pazarbasi09c37092015-05-07 21:40:46 +00007; CHECK: @llvm.global_ctors = {{.*}}@asan.module_ctor
Chandler Carruth663943e2012-07-16 08:56:46 +00008
Kostya Serebryanycf880b92013-02-26 06:58:09 +00009define i32 @test_load(i32* %a) sanitize_address {
Alexey Samsonov62a8e062014-07-16 18:11:31 +000010; CHECK-LABEL: @test_load
Chandler Carruth663943e2012-07-16 08:56:46 +000011; CHECK-NOT: load
12; CHECK: %[[LOAD_ADDR:[^ ]*]] = ptrtoint i32* %a to i64
13; CHECK: lshr i64 %[[LOAD_ADDR]], 3
Kostya Serebryanye2e32b32013-02-12 11:14:24 +000014; CHECK: {{or|add}}
Chandler Carruth663943e2012-07-16 08:56:46 +000015; CHECK: %[[LOAD_SHADOW_PTR:[^ ]*]] = inttoptr
David Blaikiea79ac142015-02-27 21:17:42 +000016; CHECK: %[[LOAD_SHADOW:[^ ]*]] = load i8, i8* %[[LOAD_SHADOW_PTR]]
Chandler Carruth663943e2012-07-16 08:56:46 +000017; CHECK: icmp ne i8
Kostya Serebryanyad238522014-09-02 21:46:51 +000018; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}!prof ![[PROF:[0-9]+]]
Chandler Carruth663943e2012-07-16 08:56:46 +000019;
Chandler Carruth663943e2012-07-16 08:56:46 +000020; First instrumentation block refines the shadow test.
21; CHECK: and i64 %[[LOAD_ADDR]], 7
22; CHECK: add i64 %{{.*}}, 3
23; CHECK: trunc i64 %{{.*}} to i8
24; CHECK: icmp sge i8 %{{.*}}, %[[LOAD_SHADOW]]
25; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
26;
Kostya Serebryanyf02c6062012-07-20 09:54:50 +000027; The crash block reports the error.
28; CHECK: call void @__asan_report_load4(i64 %[[LOAD_ADDR]])
29; CHECK: unreachable
30;
Kostya Serebryanybf479712012-08-14 14:05:50 +000031; The actual load.
David Blaikiea79ac142015-02-27 21:17:42 +000032; CHECK: %tmp1 = load i32, i32* %a
Kostya Serebryanybf479712012-08-14 14:05:50 +000033; CHECK: ret i32 %tmp1
34
Kostya Serebryanyf02c6062012-07-20 09:54:50 +000035
Chandler Carruth663943e2012-07-16 08:56:46 +000036
37entry:
David Blaikiea79ac142015-02-27 21:17:42 +000038 %tmp1 = load i32, i32* %a, align 4
Chandler Carruth663943e2012-07-16 08:56:46 +000039 ret i32 %tmp1
40}
41
Kostya Serebryanycf880b92013-02-26 06:58:09 +000042define void @test_store(i32* %a) sanitize_address {
Alexey Samsonov62a8e062014-07-16 18:11:31 +000043; CHECK-LABEL: @test_store
Chandler Carruth663943e2012-07-16 08:56:46 +000044; CHECK-NOT: store
45; CHECK: %[[STORE_ADDR:[^ ]*]] = ptrtoint i32* %a to i64
46; CHECK: lshr i64 %[[STORE_ADDR]], 3
Kostya Serebryanye2e32b32013-02-12 11:14:24 +000047; CHECK: {{or|add}}
Chandler Carruth663943e2012-07-16 08:56:46 +000048; CHECK: %[[STORE_SHADOW_PTR:[^ ]*]] = inttoptr
David Blaikiea79ac142015-02-27 21:17:42 +000049; CHECK: %[[STORE_SHADOW:[^ ]*]] = load i8, i8* %[[STORE_SHADOW_PTR]]
Chandler Carruth663943e2012-07-16 08:56:46 +000050; CHECK: icmp ne i8
51; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
52;
Chandler Carruth663943e2012-07-16 08:56:46 +000053; First instrumentation block refines the shadow test.
54; CHECK: and i64 %[[STORE_ADDR]], 7
55; CHECK: add i64 %{{.*}}, 3
56; CHECK: trunc i64 %{{.*}} to i8
57; CHECK: icmp sge i8 %{{.*}}, %[[STORE_SHADOW]]
58; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
59;
Kostya Serebryanyf02c6062012-07-20 09:54:50 +000060; The crash block reports the error.
61; CHECK: call void @__asan_report_store4(i64 %[[STORE_ADDR]])
62; CHECK: unreachable
63;
Kostya Serebryanybf479712012-08-14 14:05:50 +000064; The actual load.
65; CHECK: store i32 42, i32* %a
66; CHECK: ret void
67;
Chandler Carruth663943e2012-07-16 08:56:46 +000068
69entry:
Kostya Serebryanyc7895a82014-05-23 11:52:07 +000070 store i32 42, i32* %a, align 4
Chandler Carruth663943e2012-07-16 08:56:46 +000071 ret void
72}
Kostya Serebryany09959942012-10-19 06:20:53 +000073
74; Check that asan leaves just one alloca.
75
76declare void @alloca_test_use([10 x i8]*)
Kostya Serebryanycf880b92013-02-26 06:58:09 +000077define void @alloca_test() sanitize_address {
Kostya Serebryany09959942012-10-19 06:20:53 +000078entry:
79 %x = alloca [10 x i8], align 1
80 %y = alloca [10 x i8], align 1
81 %z = alloca [10 x i8], align 1
82 call void @alloca_test_use([10 x i8]* %x)
83 call void @alloca_test_use([10 x i8]* %y)
84 call void @alloca_test_use([10 x i8]* %z)
85 ret void
86}
87
Alexey Samsonov62a8e062014-07-16 18:11:31 +000088; CHECK-LABEL: define void @alloca_test()
Kostya Serebryany09959942012-10-19 06:20:53 +000089; CHECK: = alloca
90; CHECK-NOT: = alloca
91; CHECK: ret void
92
Kostya Serebryanycf880b92013-02-26 06:58:09 +000093define void @LongDoubleTest(x86_fp80* nocapture %a) nounwind uwtable sanitize_address {
Kostya Serebryanya9685682013-02-15 12:46:06 +000094entry:
95 store x86_fp80 0xK3FFF8000000000000000, x86_fp80* %a, align 16
96 ret void
97}
98
Alexey Samsonov62a8e062014-07-16 18:11:31 +000099; CHECK-LABEL: LongDoubleTest
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000100; CHECK: __asan_report_store_n
101; CHECK: __asan_report_store_n
102; CHECK: ret void
103
104
Kostya Serebryanycf880b92013-02-26 06:58:09 +0000105define void @i40test(i40* %a, i40* %b) nounwind uwtable sanitize_address {
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000106 entry:
David Blaikiea79ac142015-02-27 21:17:42 +0000107 %t = load i40, i40* %a
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000108 store i40 %t, i40* %b, align 8
109 ret void
110}
111
Alexey Samsonov62a8e062014-07-16 18:11:31 +0000112; CHECK-LABEL: i40test
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000113; CHECK: __asan_report_load_n{{.*}}, i64 5)
114; CHECK: __asan_report_load_n{{.*}}, i64 5)
115; CHECK: __asan_report_store_n{{.*}}, i64 5)
116; CHECK: __asan_report_store_n{{.*}}, i64 5)
117; CHECK: ret void
118
Kostya Serebryanyc7895a82014-05-23 11:52:07 +0000119define void @i64test_align1(i64* %b) nounwind uwtable sanitize_address {
120 entry:
121 store i64 0, i64* %b, align 1
122 ret void
123}
124
125; CHECK-LABEL: i64test_align1
126; CHECK: __asan_report_store_n{{.*}}, i64 8)
127; CHECK: __asan_report_store_n{{.*}}, i64 8)
128; CHECK: ret void
129
130
Kostya Serebryanycf880b92013-02-26 06:58:09 +0000131define void @i80test(i80* %a, i80* %b) nounwind uwtable sanitize_address {
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000132 entry:
David Blaikiea79ac142015-02-27 21:17:42 +0000133 %t = load i80, i80* %a
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000134 store i80 %t, i80* %b, align 8
135 ret void
136}
137
Alexey Samsonov62a8e062014-07-16 18:11:31 +0000138; CHECK-LABEL: i80test
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000139; CHECK: __asan_report_load_n{{.*}}, i64 10)
140; CHECK: __asan_report_load_n{{.*}}, i64 10)
141; CHECK: __asan_report_store_n{{.*}}, i64 10)
142; CHECK: __asan_report_store_n{{.*}}, i64 10)
Kostya Serebryanya9685682013-02-15 12:46:06 +0000143; CHECK: ret void
Kostya Serebryany6b5b58d2013-03-18 07:33:49 +0000144
145; asan should not instrument functions with available_externally linkage.
146define available_externally i32 @f_available_externally(i32* %a) sanitize_address {
147entry:
David Blaikiea79ac142015-02-27 21:17:42 +0000148 %tmp1 = load i32, i32* %a
Kostya Serebryany6b5b58d2013-03-18 07:33:49 +0000149 ret i32 %tmp1
150}
Alexey Samsonov62a8e062014-07-16 18:11:31 +0000151; CHECK-LABEL: @f_available_externally
Kostya Serebryany6b5b58d2013-03-18 07:33:49 +0000152; CHECK-NOT: __asan_report
153; CHECK: ret i32
154
Pete Cooper67cf9a72015-11-19 05:56:52 +0000155declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
156declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) nounwind
157declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) nounwind
Kostya Serebryany49b88f52014-04-21 11:57:43 +0000158
159define void @memintr_test(i8* %a, i8* %b) nounwind uwtable sanitize_address {
160 entry:
Pete Cooper67cf9a72015-11-19 05:56:52 +0000161 tail call void @llvm.memset.p0i8.i64(i8* %a, i8 0, i64 100, i32 1, i1 false)
162 tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %a, i8* %b, i64 100, i32 1, i1 false)
163 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 100, i32 1, i1 false)
Kostya Serebryany49b88f52014-04-21 11:57:43 +0000164 ret void
165}
166
167; CHECK-LABEL: memintr_test
168; CHECK: __asan_memset
169; CHECK: __asan_memmove
170; CHECK: __asan_memcpy
171; CHECK: ret void
Kostya Serebryany6b5b58d2013-03-18 07:33:49 +0000172
Ismail Pazarbasi09c37092015-05-07 21:40:46 +0000173; CHECK: define internal void @asan.module_ctor()
Kuba Brecka45dbffd2015-07-23 10:54:06 +0000174; CHECK: call void @__asan_init()
Ismail Pazarbasi09c37092015-05-07 21:40:46 +0000175
Kostya Serebryanyad238522014-09-02 21:46:51 +0000176; PROF
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000177; CHECK: ![[PROF]] = !{!"branch_weights", i32 1, i32 100000}