blob: ec50ea788396a9e042c30b4310bec8e5df782d71 [file] [log] [blame]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +00001; Test basic address sanitizer instrumentation.
2;
Peter Collingbourne73078ec2019-01-23 02:20:10 +00003; RUN: opt < %s -hwasan -hwasan-recover=0 -hwasan-with-ifunc=1 -hwasan-with-tls=0 -S | FileCheck %s --check-prefixes=CHECK,ABORT,ABORT-DYNAMIC-SHADOW
4; RUN: opt < %s -hwasan -hwasan-recover=1 -hwasan-with-ifunc=1 -hwasan-with-tls=0 -S | FileCheck %s --check-prefixes=CHECK,RECOVER,RECOVER-DYNAMIC-SHADOW
5; RUN: opt < %s -hwasan -hwasan-recover=0 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=CHECK,ABORT,ABORT-ZERO-BASED-SHADOW
6; RUN: opt < %s -hwasan -hwasan-recover=1 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=CHECK,RECOVER,RECOVER-ZERO-BASED-SHADOW
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +00007
Peter Collingbourned3a3e4b2018-12-17 22:56:34 +00008; CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @hwasan.module_ctor, i8* bitcast (void ()* @hwasan.module_ctor to i8*) }]
9; CHECK: @__hwasan = private constant [0 x i8] zeroinitializer, section "__hwasan_frames", comdat($hwasan.module_ctor)
10
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000011target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
12target triple = "aarch64--linux-android"
13
14define i8 @test_load8(i8* %a) sanitize_hwaddress {
15; CHECK-LABEL: @test_load8(
Peter Collingbourne73078ec2019-01-23 02:20:10 +000016; RECOVER: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
17; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
18; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
19; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
20; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
21; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
22; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
23; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
24; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
25; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000026
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000027; RECOVER: call void asm sideeffect "brk #2336", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000028; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000029
Peter Collingbourne73078ec2019-01-23 02:20:10 +000030; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %a, i32 0)
31; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %a, i32 0)
32
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000033; CHECK: %[[G:[^ ]*]] = load i8, i8* %a, align 4
34; CHECK: ret i8 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000035
36entry:
37 %b = load i8, i8* %a, align 4
38 ret i8 %b
39}
40
41define i16 @test_load16(i16* %a) sanitize_hwaddress {
42; CHECK-LABEL: @test_load16(
Peter Collingbourne73078ec2019-01-23 02:20:10 +000043; RECOVER: %[[A:[^ ]*]] = ptrtoint i16* %a to i64
44; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
45; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
46; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
47; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
48; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
49; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
50; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
51; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
52; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000053
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000054; RECOVER: call void asm sideeffect "brk #2337", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000055; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000056
Peter Collingbourne73078ec2019-01-23 02:20:10 +000057; ABORT: %[[A:[^ ]*]] = bitcast i16* %a to i8*
58; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %[[A]], i32 1)
59; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %[[A]], i32 1)
60
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000061; CHECK: %[[G:[^ ]*]] = load i16, i16* %a, align 4
62; CHECK: ret i16 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000063
64entry:
65 %b = load i16, i16* %a, align 4
66 ret i16 %b
67}
68
69define i32 @test_load32(i32* %a) sanitize_hwaddress {
70; CHECK-LABEL: @test_load32(
Peter Collingbourne73078ec2019-01-23 02:20:10 +000071; RECOVER: %[[A:[^ ]*]] = ptrtoint i32* %a to i64
72; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
73; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
74; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
75; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
76; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
77; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
78; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
79; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
80; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000081
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000082; RECOVER: call void asm sideeffect "brk #2338", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000083; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000084
Peter Collingbourne73078ec2019-01-23 02:20:10 +000085; ABORT: %[[A:[^ ]*]] = bitcast i32* %a to i8*
86; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %[[A]], i32 2)
87; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %[[A]], i32 2)
88
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000089; CHECK: %[[G:[^ ]*]] = load i32, i32* %a, align 4
90; CHECK: ret i32 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000091
92entry:
93 %b = load i32, i32* %a, align 4
94 ret i32 %b
95}
96
97define i64 @test_load64(i64* %a) sanitize_hwaddress {
98; CHECK-LABEL: @test_load64(
Peter Collingbourne73078ec2019-01-23 02:20:10 +000099; RECOVER: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
100; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
101; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
102; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
103; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
104; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
105; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
106; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
107; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
108; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000109
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000110; RECOVER: call void asm sideeffect "brk #2339", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000111; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000112
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000113; ABORT: %[[A:[^ ]*]] = bitcast i64* %a to i8*
114; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %[[A]], i32 3)
115; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %[[A]], i32 3)
116
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000117; CHECK: %[[G:[^ ]*]] = load i64, i64* %a, align 8
118; CHECK: ret i64 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000119
120entry:
121 %b = load i64, i64* %a, align 8
122 ret i64 %b
123}
124
125define i128 @test_load128(i128* %a) sanitize_hwaddress {
126; CHECK-LABEL: @test_load128(
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000127; RECOVER: %[[A:[^ ]*]] = ptrtoint i128* %a to i64
128; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
129; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
130; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
131; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
132; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
133; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
134; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
135; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
136; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000137
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000138; RECOVER: call void asm sideeffect "brk #2340", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000139; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000140
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000141; ABORT: %[[A:[^ ]*]] = bitcast i128* %a to i8*
142; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %[[A]], i32 4)
143; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %[[A]], i32 4)
144
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000145; CHECK: %[[G:[^ ]*]] = load i128, i128* %a, align 16
146; CHECK: ret i128 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000147
148entry:
149 %b = load i128, i128* %a, align 16
150 ret i128 %b
151}
152
153define i40 @test_load40(i40* %a) sanitize_hwaddress {
154; CHECK-LABEL: @test_load40(
155; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000156; ABORT: call void @__hwasan_loadN(i64 %[[A]], i64 5)
157; RECOVER: call void @__hwasan_loadN_noabort(i64 %[[A]], i64 5)
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000158; CHECK: %[[B:[^ ]*]] = load i40, i40* %a
159; CHECK: ret i40 %[[B]]
160
161entry:
162 %b = load i40, i40* %a, align 4
163 ret i40 %b
164}
165
166define void @test_store8(i8* %a, i8 %b) sanitize_hwaddress {
167; CHECK-LABEL: @test_store8(
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000168; RECOVER: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
169; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
170; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
171; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
172; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
173; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
174; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
175; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
176; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
177; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000178
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000179; RECOVER: call void asm sideeffect "brk #2352", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000180; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000181
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000182; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %a, i32 16)
183; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %a, i32 16)
184
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000185; CHECK: store i8 %b, i8* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000186; CHECK: ret void
187
188entry:
189 store i8 %b, i8* %a, align 4
190 ret void
191}
192
193define void @test_store16(i16* %a, i16 %b) sanitize_hwaddress {
194; CHECK-LABEL: @test_store16(
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000195; RECOVER: %[[A:[^ ]*]] = ptrtoint i16* %a to i64
196; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
197; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
198; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
199; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
200; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
201; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
202; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
203; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
204; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000205
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000206; RECOVER: call void asm sideeffect "brk #2353", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000207; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000208
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000209; ABORT: %[[A:[^ ]*]] = bitcast i16* %a to i8*
210; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %[[A]], i32 17)
211; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %[[A]], i32 17)
212
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000213; CHECK: store i16 %b, i16* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000214; CHECK: ret void
215
216entry:
217 store i16 %b, i16* %a, align 4
218 ret void
219}
220
221define void @test_store32(i32* %a, i32 %b) sanitize_hwaddress {
222; CHECK-LABEL: @test_store32(
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000223; RECOVER: %[[A:[^ ]*]] = ptrtoint i32* %a to i64
224; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
225; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
226; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
227; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
228; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
229; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
230; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
231; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
232; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000233
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000234; RECOVER: call void asm sideeffect "brk #2354", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000235; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000236
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000237; ABORT: %[[A:[^ ]*]] = bitcast i32* %a to i8*
238; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %[[A]], i32 18)
239; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %[[A]], i32 18)
240
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000241; CHECK: store i32 %b, i32* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000242; CHECK: ret void
243
244entry:
245 store i32 %b, i32* %a, align 4
246 ret void
247}
248
249define void @test_store64(i64* %a, i64 %b) sanitize_hwaddress {
250; CHECK-LABEL: @test_store64(
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000251; RECOVER: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
252; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
253; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
254; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
255; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
256; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
257; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
258; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
259; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
260; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000261
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000262; RECOVER: call void asm sideeffect "brk #2355", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000263; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000264
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000265; ABORT: %[[A:[^ ]*]] = bitcast i64* %a to i8*
266; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %[[A]], i32 19)
267; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %[[A]], i32 19)
268
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000269; CHECK: store i64 %b, i64* %a, align 8
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000270; CHECK: ret void
271
272entry:
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000273 store i64 %b, i64* %a, align 8
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000274 ret void
275}
276
277define void @test_store128(i128* %a, i128 %b) sanitize_hwaddress {
278; CHECK-LABEL: @test_store128(
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000279; RECOVER: %[[A:[^ ]*]] = ptrtoint i128* %a to i64
280; RECOVER: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
281; RECOVER: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
282; RECOVER: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
283; RECOVER: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
284; RECOVER-DYNAMIC-SHADOW: %[[E:[^ ]*]] = getelementptr i8, i8* %.hwasan.shadow, i64 %4
285; RECOVER-ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
286; RECOVER: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
287; RECOVER: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
288; RECOVER: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000289
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000290; RECOVER: call void asm sideeffect "brk #2356", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000291; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000292
Peter Collingbourne73078ec2019-01-23 02:20:10 +0000293; ABORT: %[[A:[^ ]*]] = bitcast i128* %a to i8*
294; ABORT-DYNAMIC-SHADOW: call void @llvm.hwasan.check.memaccess(i8* %.hwasan.shadow, i8* %[[A]], i32 20)
295; ABORT-ZERO-BASED-SHADOW: call void @llvm.hwasan.check.memaccess(i8* null, i8* %[[A]], i32 20)
296
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000297; CHECK: store i128 %b, i128* %a, align 16
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000298; CHECK: ret void
299
300entry:
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000301 store i128 %b, i128* %a, align 16
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000302 ret void
303}
304
305define void @test_store40(i40* %a, i40 %b) sanitize_hwaddress {
306; CHECK-LABEL: @test_store40(
307; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000308; ABORT: call void @__hwasan_storeN(i64 %[[A]], i64 5)
309; RECOVER: call void @__hwasan_storeN_noabort(i64 %[[A]], i64 5)
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000310; CHECK: store i40 %b, i40* %a
311; CHECK: ret void
312
313entry:
314 store i40 %b, i40* %a, align 4
315 ret void
316}
317
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000318define void @test_store_unaligned(i64* %a, i64 %b) sanitize_hwaddress {
319; CHECK-LABEL: @test_store_unaligned(
320; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000321; ABORT: call void @__hwasan_storeN(i64 %[[A]], i64 8)
322; RECOVER: call void @__hwasan_storeN_noabort(i64 %[[A]], i64 8)
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000323; CHECK: store i64 %b, i64* %a, align 4
324; CHECK: ret void
325
326entry:
327 store i64 %b, i64* %a, align 4
328 ret void
329}
330
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000331define i8 @test_load_noattr(i8* %a) {
332; CHECK-LABEL: @test_load_noattr(
333; CHECK-NEXT: entry:
334; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8* %a
335; CHECK-NEXT: ret i8 %[[B]]
336
337entry:
338 %b = load i8, i8* %a, align 4
339 ret i8 %b
340}
341
342define i8 @test_load_notmyattr(i8* %a) sanitize_address {
343; CHECK-LABEL: @test_load_notmyattr(
344; CHECK-NEXT: entry:
345; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8* %a
346; CHECK-NEXT: ret i8 %[[B]]
347
348entry:
349 %b = load i8, i8* %a, align 4
350 ret i8 %b
351}
352
353define i8 @test_load_addrspace(i8 addrspace(256)* %a) sanitize_hwaddress {
354; CHECK-LABEL: @test_load_addrspace(
355; CHECK-NEXT: entry:
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000356; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8 addrspace(256)* %a
357; CHECK-NEXT: ret i8 %[[B]]
358
359entry:
360 %b = load i8, i8 addrspace(256)* %a, align 4
361 ret i8 %b
362}
363
364; CHECK: declare void @__hwasan_init()
365
Peter Collingbourned3a3e4b2018-12-17 22:56:34 +0000366; CHECK: define internal void @hwasan.module_ctor() comdat {
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000367; CHECK-NEXT: call void @__hwasan_init()
Kostya Serebryanyaf955972018-10-23 00:50:40 +0000368; CHECK-NEXT: call void @__hwasan_init_frames(
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000369; CHECK-NEXT: ret void
370; CHECK-NEXT: }