blob: d9997e2f350085f1e0eca97a9ef90f53eb16c526 [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"
7
Kostya Serebryanycf880b92013-02-26 06:58:09 +00008define i32 @test_load(i32* %a) sanitize_address {
Alexey Samsonov62a8e062014-07-16 18:11:31 +00009; CHECK-LABEL: @test_load
Chandler Carruth663943e2012-07-16 08:56:46 +000010; CHECK-NOT: load
11; CHECK: %[[LOAD_ADDR:[^ ]*]] = ptrtoint i32* %a to i64
12; CHECK: lshr i64 %[[LOAD_ADDR]], 3
Kostya Serebryanye2e32b32013-02-12 11:14:24 +000013; CHECK: {{or|add}}
Chandler Carruth663943e2012-07-16 08:56:46 +000014; CHECK: %[[LOAD_SHADOW_PTR:[^ ]*]] = inttoptr
15; CHECK: %[[LOAD_SHADOW:[^ ]*]] = load i8* %[[LOAD_SHADOW_PTR]]
16; CHECK: icmp ne i8
Kostya Serebryanyad238522014-09-02 21:46:51 +000017; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}!prof ![[PROF:[0-9]+]]
Chandler Carruth663943e2012-07-16 08:56:46 +000018;
Chandler Carruth663943e2012-07-16 08:56:46 +000019; First instrumentation block refines the shadow test.
20; CHECK: and i64 %[[LOAD_ADDR]], 7
21; CHECK: add i64 %{{.*}}, 3
22; CHECK: trunc i64 %{{.*}} to i8
23; CHECK: icmp sge i8 %{{.*}}, %[[LOAD_SHADOW]]
24; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
25;
Kostya Serebryanyf02c6062012-07-20 09:54:50 +000026; The crash block reports the error.
27; CHECK: call void @__asan_report_load4(i64 %[[LOAD_ADDR]])
28; CHECK: unreachable
29;
Kostya Serebryanybf479712012-08-14 14:05:50 +000030; The actual load.
31; CHECK: %tmp1 = load i32* %a
32; CHECK: ret i32 %tmp1
33
Kostya Serebryanyf02c6062012-07-20 09:54:50 +000034
Chandler Carruth663943e2012-07-16 08:56:46 +000035
36entry:
Kostya Serebryanyc7895a82014-05-23 11:52:07 +000037 %tmp1 = load i32* %a, align 4
Chandler Carruth663943e2012-07-16 08:56:46 +000038 ret i32 %tmp1
39}
40
Kostya Serebryanycf880b92013-02-26 06:58:09 +000041define void @test_store(i32* %a) sanitize_address {
Alexey Samsonov62a8e062014-07-16 18:11:31 +000042; CHECK-LABEL: @test_store
Chandler Carruth663943e2012-07-16 08:56:46 +000043; CHECK-NOT: store
44; CHECK: %[[STORE_ADDR:[^ ]*]] = ptrtoint i32* %a to i64
45; CHECK: lshr i64 %[[STORE_ADDR]], 3
Kostya Serebryanye2e32b32013-02-12 11:14:24 +000046; CHECK: {{or|add}}
Chandler Carruth663943e2012-07-16 08:56:46 +000047; CHECK: %[[STORE_SHADOW_PTR:[^ ]*]] = inttoptr
48; CHECK: %[[STORE_SHADOW:[^ ]*]] = load i8* %[[STORE_SHADOW_PTR]]
49; CHECK: icmp ne i8
50; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
51;
Chandler Carruth663943e2012-07-16 08:56:46 +000052; First instrumentation block refines the shadow test.
53; CHECK: and i64 %[[STORE_ADDR]], 7
54; CHECK: add i64 %{{.*}}, 3
55; CHECK: trunc i64 %{{.*}} to i8
56; CHECK: icmp sge i8 %{{.*}}, %[[STORE_SHADOW]]
57; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
58;
Kostya Serebryanyf02c6062012-07-20 09:54:50 +000059; The crash block reports the error.
60; CHECK: call void @__asan_report_store4(i64 %[[STORE_ADDR]])
61; CHECK: unreachable
62;
Kostya Serebryanybf479712012-08-14 14:05:50 +000063; The actual load.
64; CHECK: store i32 42, i32* %a
65; CHECK: ret void
66;
Chandler Carruth663943e2012-07-16 08:56:46 +000067
68entry:
Kostya Serebryanyc7895a82014-05-23 11:52:07 +000069 store i32 42, i32* %a, align 4
Chandler Carruth663943e2012-07-16 08:56:46 +000070 ret void
71}
Kostya Serebryany09959942012-10-19 06:20:53 +000072
73; Check that asan leaves just one alloca.
74
75declare void @alloca_test_use([10 x i8]*)
Kostya Serebryanycf880b92013-02-26 06:58:09 +000076define void @alloca_test() sanitize_address {
Kostya Serebryany09959942012-10-19 06:20:53 +000077entry:
78 %x = alloca [10 x i8], align 1
79 %y = alloca [10 x i8], align 1
80 %z = alloca [10 x i8], align 1
81 call void @alloca_test_use([10 x i8]* %x)
82 call void @alloca_test_use([10 x i8]* %y)
83 call void @alloca_test_use([10 x i8]* %z)
84 ret void
85}
86
Alexey Samsonov62a8e062014-07-16 18:11:31 +000087; CHECK-LABEL: define void @alloca_test()
Kostya Serebryany09959942012-10-19 06:20:53 +000088; CHECK: = alloca
89; CHECK-NOT: = alloca
90; CHECK: ret void
91
Kostya Serebryanycf880b92013-02-26 06:58:09 +000092define void @LongDoubleTest(x86_fp80* nocapture %a) nounwind uwtable sanitize_address {
Kostya Serebryanya9685682013-02-15 12:46:06 +000093entry:
94 store x86_fp80 0xK3FFF8000000000000000, x86_fp80* %a, align 16
95 ret void
96}
97
Alexey Samsonov62a8e062014-07-16 18:11:31 +000098; CHECK-LABEL: LongDoubleTest
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +000099; CHECK: __asan_report_store_n
100; CHECK: __asan_report_store_n
101; CHECK: ret void
102
103
Kostya Serebryanycf880b92013-02-26 06:58:09 +0000104define void @i40test(i40* %a, i40* %b) nounwind uwtable sanitize_address {
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000105 entry:
106 %t = load i40* %a
107 store i40 %t, i40* %b, align 8
108 ret void
109}
110
Alexey Samsonov62a8e062014-07-16 18:11:31 +0000111; CHECK-LABEL: i40test
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000112; CHECK: __asan_report_load_n{{.*}}, i64 5)
113; CHECK: __asan_report_load_n{{.*}}, i64 5)
114; CHECK: __asan_report_store_n{{.*}}, i64 5)
115; CHECK: __asan_report_store_n{{.*}}, i64 5)
116; CHECK: ret void
117
Kostya Serebryanyc7895a82014-05-23 11:52:07 +0000118define void @i64test_align1(i64* %b) nounwind uwtable sanitize_address {
119 entry:
120 store i64 0, i64* %b, align 1
121 ret void
122}
123
124; CHECK-LABEL: i64test_align1
125; CHECK: __asan_report_store_n{{.*}}, i64 8)
126; CHECK: __asan_report_store_n{{.*}}, i64 8)
127; CHECK: ret void
128
129
Kostya Serebryanycf880b92013-02-26 06:58:09 +0000130define void @i80test(i80* %a, i80* %b) nounwind uwtable sanitize_address {
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000131 entry:
132 %t = load i80* %a
133 store i80 %t, i80* %b, align 8
134 ret void
135}
136
Alexey Samsonov62a8e062014-07-16 18:11:31 +0000137; CHECK-LABEL: i80test
Kostya Serebryany3ece9bea2013-02-19 11:29:21 +0000138; CHECK: __asan_report_load_n{{.*}}, i64 10)
139; CHECK: __asan_report_load_n{{.*}}, i64 10)
140; CHECK: __asan_report_store_n{{.*}}, i64 10)
141; CHECK: __asan_report_store_n{{.*}}, i64 10)
Kostya Serebryanya9685682013-02-15 12:46:06 +0000142; CHECK: ret void
Kostya Serebryany6b5b58d2013-03-18 07:33:49 +0000143
144; asan should not instrument functions with available_externally linkage.
145define available_externally i32 @f_available_externally(i32* %a) sanitize_address {
146entry:
147 %tmp1 = load i32* %a
148 ret i32 %tmp1
149}
Alexey Samsonov62a8e062014-07-16 18:11:31 +0000150; CHECK-LABEL: @f_available_externally
Kostya Serebryany6b5b58d2013-03-18 07:33:49 +0000151; CHECK-NOT: __asan_report
152; CHECK: ret i32
153
Kostya Serebryany49b88f52014-04-21 11:57:43 +0000154declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
155declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) nounwind
156declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) nounwind
157
158define void @memintr_test(i8* %a, i8* %b) nounwind uwtable sanitize_address {
159 entry:
160 tail call void @llvm.memset.p0i8.i64(i8* %a, i8 0, i64 100, i32 1, i1 false)
161 tail call void @llvm.memmove.p0i8.p0i8.i64(i8* %a, i8* %b, i64 100, i32 1, i1 false)
162 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 100, i32 1, i1 false)
163 ret void
164}
165
166; CHECK-LABEL: memintr_test
167; CHECK: __asan_memset
168; CHECK: __asan_memmove
169; CHECK: __asan_memcpy
170; CHECK: ret void
Kostya Serebryany6b5b58d2013-03-18 07:33:49 +0000171
Kostya Serebryanyad238522014-09-02 21:46:51 +0000172; PROF
173; CHECK: ![[PROF]] = metadata !{metadata !"branch_weights", i32 1, i32 100000}