blob: db1f52fc56e92d8353c85c5b077b0e5168075e57 [file] [log] [blame]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +00001; Test basic address sanitizer instrumentation.
2;
3; RUN: opt < %s -hwasan -S | FileCheck %s
4
5target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
6target triple = "aarch64--linux-android"
7
8define i8 @test_load8(i8* %a) sanitize_hwaddress {
9; CHECK-LABEL: @test_load8(
10; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000011; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
12; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
13; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
14; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
15; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
16; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
17; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
18; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
19
20; CHECK: call void asm sideeffect "hlt #256", "{x0}"(i64 %[[A]])
21; CHECK: br label
22
23; CHECK: %[[G:[^ ]*]] = load i8, i8* %a, align 4
24; CHECK: ret i8 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000025
26entry:
27 %b = load i8, i8* %a, align 4
28 ret i8 %b
29}
30
31define i16 @test_load16(i16* %a) sanitize_hwaddress {
32; CHECK-LABEL: @test_load16(
33; CHECK: %[[A:[^ ]*]] = ptrtoint i16* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000034; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
35; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
36; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
37; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
38; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
39; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
40; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
41; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
42
43; CHECK: call void asm sideeffect "hlt #257", "{x0}"(i64 %[[A]])
44; CHECK: br label
45
46; CHECK: %[[G:[^ ]*]] = load i16, i16* %a, align 4
47; CHECK: ret i16 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000048
49entry:
50 %b = load i16, i16* %a, align 4
51 ret i16 %b
52}
53
54define i32 @test_load32(i32* %a) sanitize_hwaddress {
55; CHECK-LABEL: @test_load32(
56; CHECK: %[[A:[^ ]*]] = ptrtoint i32* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000057; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
58; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
59; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
60; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
61; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
62; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
63; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
64; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
65
66; CHECK: call void asm sideeffect "hlt #258", "{x0}"(i64 %[[A]])
67; CHECK: br label
68
69; CHECK: %[[G:[^ ]*]] = load i32, i32* %a, align 4
70; CHECK: ret i32 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000071
72entry:
73 %b = load i32, i32* %a, align 4
74 ret i32 %b
75}
76
77define i64 @test_load64(i64* %a) sanitize_hwaddress {
78; CHECK-LABEL: @test_load64(
79; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000080; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
81; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
82; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
83; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
84; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
85; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
86; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
87; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
88
89; CHECK: call void asm sideeffect "hlt #259", "{x0}"(i64 %[[A]])
90; CHECK: br label
91
92; CHECK: %[[G:[^ ]*]] = load i64, i64* %a, align 8
93; CHECK: ret i64 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000094
95entry:
96 %b = load i64, i64* %a, align 8
97 ret i64 %b
98}
99
100define i128 @test_load128(i128* %a) sanitize_hwaddress {
101; CHECK-LABEL: @test_load128(
102; CHECK: %[[A:[^ ]*]] = ptrtoint i128* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000103; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
104; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
105; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
106; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
107; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
108; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
109; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
110; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
111
112; CHECK: call void asm sideeffect "hlt #260", "{x0}"(i64 %[[A]])
113; CHECK: br label
114
115; CHECK: %[[G:[^ ]*]] = load i128, i128* %a, align 16
116; CHECK: ret i128 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000117
118entry:
119 %b = load i128, i128* %a, align 16
120 ret i128 %b
121}
122
123define i40 @test_load40(i40* %a) sanitize_hwaddress {
124; CHECK-LABEL: @test_load40(
125; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
126; CHECK: call void @__hwasan_load(i64 %[[A]], i64 5)
127; CHECK: %[[B:[^ ]*]] = load i40, i40* %a
128; CHECK: ret i40 %[[B]]
129
130entry:
131 %b = load i40, i40* %a, align 4
132 ret i40 %b
133}
134
135define void @test_store8(i8* %a, i8 %b) sanitize_hwaddress {
136; CHECK-LABEL: @test_store8(
137; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000138; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
139; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
140; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
141; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
142; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
143; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
144; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
145; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
146
147; CHECK: call void asm sideeffect "hlt #272", "{x0}"(i64 %[[A]])
148; CHECK: br label
149
150; CHECK: store i8 %b, i8* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000151; CHECK: ret void
152
153entry:
154 store i8 %b, i8* %a, align 4
155 ret void
156}
157
158define void @test_store16(i16* %a, i16 %b) sanitize_hwaddress {
159; CHECK-LABEL: @test_store16(
160; CHECK: %[[A:[^ ]*]] = ptrtoint i16* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000161; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
162; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
163; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
164; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
165; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
166; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
167; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
168; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
169
170; CHECK: call void asm sideeffect "hlt #273", "{x0}"(i64 %[[A]])
171; CHECK: br label
172
173; CHECK: store i16 %b, i16* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000174; CHECK: ret void
175
176entry:
177 store i16 %b, i16* %a, align 4
178 ret void
179}
180
181define void @test_store32(i32* %a, i32 %b) sanitize_hwaddress {
182; CHECK-LABEL: @test_store32(
183; CHECK: %[[A:[^ ]*]] = ptrtoint i32* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000184; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
185; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
186; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
187; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
188; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
189; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
190; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
191; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
192
193; CHECK: call void asm sideeffect "hlt #274", "{x0}"(i64 %[[A]])
194; CHECK: br label
195
196; CHECK: store i32 %b, i32* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000197; CHECK: ret void
198
199entry:
200 store i32 %b, i32* %a, align 4
201 ret void
202}
203
204define void @test_store64(i64* %a, i64 %b) sanitize_hwaddress {
205; CHECK-LABEL: @test_store64(
206; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000207; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
208; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
209; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
210; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
211; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
212; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
213; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
214; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
215
216; CHECK: call void asm sideeffect "hlt #275", "{x0}"(i64 %[[A]])
217; CHECK: br label
218
219; CHECK: store i64 %b, i64* %a, align 8
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000220; CHECK: ret void
221
222entry:
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000223 store i64 %b, i64* %a, align 8
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000224 ret void
225}
226
227define void @test_store128(i128* %a, i128 %b) sanitize_hwaddress {
228; CHECK-LABEL: @test_store128(
229; CHECK: %[[A:[^ ]*]] = ptrtoint i128* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000230; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
231; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
232; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
233; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
234; CHECK: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
235; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
236; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
237; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
238
239; CHECK: call void asm sideeffect "hlt #276", "{x0}"(i64 %[[A]])
240; CHECK: br label
241
242; CHECK: store i128 %b, i128* %a, align 16
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000243; CHECK: ret void
244
245entry:
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000246 store i128 %b, i128* %a, align 16
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000247 ret void
248}
249
250define void @test_store40(i40* %a, i40 %b) sanitize_hwaddress {
251; CHECK-LABEL: @test_store40(
252; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
253; CHECK: call void @__hwasan_store(i64 %[[A]], i64 5)
254; CHECK: store i40 %b, i40* %a
255; CHECK: ret void
256
257entry:
258 store i40 %b, i40* %a, align 4
259 ret void
260}
261
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000262define void @test_store_unaligned(i64* %a, i64 %b) sanitize_hwaddress {
263; CHECK-LABEL: @test_store_unaligned(
264; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
265; CHECK: call void @__hwasan_store(i64 %[[A]], i64 8)
266; CHECK: store i64 %b, i64* %a, align 4
267; CHECK: ret void
268
269entry:
270 store i64 %b, i64* %a, align 4
271 ret void
272}
273
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000274define i8 @test_load_noattr(i8* %a) {
275; CHECK-LABEL: @test_load_noattr(
276; CHECK-NEXT: entry:
277; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8* %a
278; CHECK-NEXT: ret i8 %[[B]]
279
280entry:
281 %b = load i8, i8* %a, align 4
282 ret i8 %b
283}
284
285define i8 @test_load_notmyattr(i8* %a) sanitize_address {
286; CHECK-LABEL: @test_load_notmyattr(
287; CHECK-NEXT: entry:
288; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8* %a
289; CHECK-NEXT: ret i8 %[[B]]
290
291entry:
292 %b = load i8, i8* %a, align 4
293 ret i8 %b
294}
295
296define i8 @test_load_addrspace(i8 addrspace(256)* %a) sanitize_hwaddress {
297; CHECK-LABEL: @test_load_addrspace(
298; CHECK-NEXT: entry:
299; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8 addrspace(256)* %a
300; CHECK-NEXT: ret i8 %[[B]]
301
302entry:
303 %b = load i8, i8 addrspace(256)* %a, align 4
304 ret i8 %b
305}
306
307; CHECK: declare void @__hwasan_init()
308
309; CHECK: define internal void @hwasan.module_ctor() {
310; CHECK-NEXT: call void @__hwasan_init()
311; CHECK-NEXT: ret void
312; CHECK-NEXT: }