blob: 8253016d97b4adff5d0c2f7b4c55822045f3a127 [file] [log] [blame]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +00001; Test basic address sanitizer instrumentation.
2;
Evgeniy Stepanov090f0f92018-09-24 23:03:34 +00003; RUN: opt < %s -hwasan -hwasan-recover=0 -hwasan-with-ifunc=1 -hwasan-with-tls=0 -S | FileCheck %s --check-prefixes=CHECK,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,DYNAMIC-SHADOW
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +00005; RUN: opt < %s -hwasan -hwasan-recover=0 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=CHECK,ABORT,ZERO-BASED-SHADOW
6; RUN: opt < %s -hwasan -hwasan-recover=1 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=CHECK,RECOVER,ZERO-BASED-SHADOW
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +00007
8target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
9target triple = "aarch64--linux-android"
10
11define i8 @test_load8(i8* %a) sanitize_hwaddress {
12; CHECK-LABEL: @test_load8(
13; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000014; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
15; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
16; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
17; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +000018; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
19; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
20; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000021; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
22; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
23; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
24
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000025; ABORT: call void asm sideeffect "brk #2304", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000026; ABORT: unreachable
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
30; CHECK: %[[G:[^ ]*]] = load i8, i8* %a, align 4
31; CHECK: ret i8 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000032
33entry:
34 %b = load i8, i8* %a, align 4
35 ret i8 %b
36}
37
38define i16 @test_load16(i16* %a) sanitize_hwaddress {
39; CHECK-LABEL: @test_load16(
40; CHECK: %[[A:[^ ]*]] = ptrtoint i16* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000041; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
42; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
43; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
44; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +000045; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
46; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
47; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000048; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
49; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
50; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
51
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000052; ABORT: call void asm sideeffect "brk #2305", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000053; ABORT: unreachable
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
57; CHECK: %[[G:[^ ]*]] = load i16, i16* %a, align 4
58; CHECK: ret i16 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000059
60entry:
61 %b = load i16, i16* %a, align 4
62 ret i16 %b
63}
64
65define i32 @test_load32(i32* %a) sanitize_hwaddress {
66; CHECK-LABEL: @test_load32(
67; CHECK: %[[A:[^ ]*]] = ptrtoint i32* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000068; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
69; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
70; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
71; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +000072; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
73; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
74; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000075; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
76; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
77; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
78
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000079; ABORT: call void asm sideeffect "brk #2306", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000080; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000081; RECOVER: call void asm sideeffect "brk #2338", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000082; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000083
84; CHECK: %[[G:[^ ]*]] = load i32, i32* %a, align 4
85; CHECK: ret i32 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000086
87entry:
88 %b = load i32, i32* %a, align 4
89 ret i32 %b
90}
91
92define i64 @test_load64(i64* %a) sanitize_hwaddress {
93; CHECK-LABEL: @test_load64(
94; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000095; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
96; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
97; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
98; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +000099; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
100; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
101; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000102; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
103; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
104; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
105
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000106; ABORT: call void asm sideeffect "brk #2307", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000107; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000108; RECOVER: call void asm sideeffect "brk #2339", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000109; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000110
111; CHECK: %[[G:[^ ]*]] = load i64, i64* %a, align 8
112; CHECK: ret i64 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000113
114entry:
115 %b = load i64, i64* %a, align 8
116 ret i64 %b
117}
118
119define i128 @test_load128(i128* %a) sanitize_hwaddress {
120; CHECK-LABEL: @test_load128(
121; CHECK: %[[A:[^ ]*]] = ptrtoint i128* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000122; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
123; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
124; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
125; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000126; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
127; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
128; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000129; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
130; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
131; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
132
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000133; ABORT: call void asm sideeffect "brk #2308", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000134; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000135; RECOVER: call void asm sideeffect "brk #2340", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000136; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000137
138; CHECK: %[[G:[^ ]*]] = load i128, i128* %a, align 16
139; CHECK: ret i128 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000140
141entry:
142 %b = load i128, i128* %a, align 16
143 ret i128 %b
144}
145
146define i40 @test_load40(i40* %a) sanitize_hwaddress {
147; CHECK-LABEL: @test_load40(
148; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000149; ABORT: call void @__hwasan_loadN(i64 %[[A]], i64 5)
150; RECOVER: call void @__hwasan_loadN_noabort(i64 %[[A]], i64 5)
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000151; CHECK: %[[B:[^ ]*]] = load i40, i40* %a
152; CHECK: ret i40 %[[B]]
153
154entry:
155 %b = load i40, i40* %a, align 4
156 ret i40 %b
157}
158
159define void @test_store8(i8* %a, i8 %b) sanitize_hwaddress {
160; CHECK-LABEL: @test_store8(
161; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000162; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
163; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
164; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
165; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000166; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
167; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
168; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000169; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
170; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
171; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
172
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000173; ABORT: call void asm sideeffect "brk #2320", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000174; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000175; RECOVER: call void asm sideeffect "brk #2352", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000176; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000177
178; CHECK: store i8 %b, i8* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000179; CHECK: ret void
180
181entry:
182 store i8 %b, i8* %a, align 4
183 ret void
184}
185
186define void @test_store16(i16* %a, i16 %b) sanitize_hwaddress {
187; CHECK-LABEL: @test_store16(
188; CHECK: %[[A:[^ ]*]] = ptrtoint i16* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000189; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
190; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
191; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
192; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000193; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
194; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
195; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000196; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
197; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
198; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
199
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000200; ABORT: call void asm sideeffect "brk #2321", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000201; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000202; RECOVER: call void asm sideeffect "brk #2353", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000203; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000204
205; CHECK: store i16 %b, i16* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000206; CHECK: ret void
207
208entry:
209 store i16 %b, i16* %a, align 4
210 ret void
211}
212
213define void @test_store32(i32* %a, i32 %b) sanitize_hwaddress {
214; CHECK-LABEL: @test_store32(
215; CHECK: %[[A:[^ ]*]] = ptrtoint i32* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000216; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
217; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
218; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
219; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000220; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
221; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
222; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000223; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
224; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
225; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
226
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000227; ABORT: call void asm sideeffect "brk #2322", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000228; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000229; RECOVER: call void asm sideeffect "brk #2354", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000230; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000231
232; CHECK: store i32 %b, i32* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000233; CHECK: ret void
234
235entry:
236 store i32 %b, i32* %a, align 4
237 ret void
238}
239
240define void @test_store64(i64* %a, i64 %b) sanitize_hwaddress {
241; CHECK-LABEL: @test_store64(
242; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000243; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
244; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
245; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
246; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000247; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
248; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
249; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000250; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
251; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
252; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
253
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000254; ABORT: call void asm sideeffect "brk #2323", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000255; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000256; RECOVER: call void asm sideeffect "brk #2355", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000257; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000258
259; CHECK: store i64 %b, i64* %a, align 8
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000260; CHECK: ret void
261
262entry:
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000263 store i64 %b, i64* %a, align 8
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000264 ret void
265}
266
267define void @test_store128(i128* %a, i128 %b) sanitize_hwaddress {
268; CHECK-LABEL: @test_store128(
269; CHECK: %[[A:[^ ]*]] = ptrtoint i128* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000270; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
271; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
272; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
273; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000274; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
275; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
276; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000277; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
278; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
279; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
280
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000281; ABORT: call void asm sideeffect "brk #2324", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000282; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000283; RECOVER: call void asm sideeffect "brk #2356", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000284; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000285
286; CHECK: store i128 %b, i128* %a, align 16
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000287; CHECK: ret void
288
289entry:
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000290 store i128 %b, i128* %a, align 16
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000291 ret void
292}
293
294define void @test_store40(i40* %a, i40 %b) sanitize_hwaddress {
295; CHECK-LABEL: @test_store40(
296; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000297; ABORT: call void @__hwasan_storeN(i64 %[[A]], i64 5)
298; RECOVER: call void @__hwasan_storeN_noabort(i64 %[[A]], i64 5)
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000299; CHECK: store i40 %b, i40* %a
300; CHECK: ret void
301
302entry:
303 store i40 %b, i40* %a, align 4
304 ret void
305}
306
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000307define void @test_store_unaligned(i64* %a, i64 %b) sanitize_hwaddress {
308; CHECK-LABEL: @test_store_unaligned(
309; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000310; ABORT: call void @__hwasan_storeN(i64 %[[A]], i64 8)
311; RECOVER: call void @__hwasan_storeN_noabort(i64 %[[A]], i64 8)
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000312; CHECK: store i64 %b, i64* %a, align 4
313; CHECK: ret void
314
315entry:
316 store i64 %b, i64* %a, align 4
317 ret void
318}
319
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000320define i8 @test_load_noattr(i8* %a) {
321; CHECK-LABEL: @test_load_noattr(
322; CHECK-NEXT: entry:
323; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8* %a
324; CHECK-NEXT: ret i8 %[[B]]
325
326entry:
327 %b = load i8, i8* %a, align 4
328 ret i8 %b
329}
330
331define i8 @test_load_notmyattr(i8* %a) sanitize_address {
332; CHECK-LABEL: @test_load_notmyattr(
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_addrspace(i8 addrspace(256)* %a) sanitize_hwaddress {
343; CHECK-LABEL: @test_load_addrspace(
344; CHECK-NEXT: entry:
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000345; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8 addrspace(256)* %a
346; CHECK-NEXT: ret i8 %[[B]]
347
348entry:
349 %b = load i8, i8 addrspace(256)* %a, align 4
350 ret i8 %b
351}
352
353; CHECK: declare void @__hwasan_init()
354
355; CHECK: define internal void @hwasan.module_ctor() {
356; CHECK-NEXT: call void @__hwasan_init()
Kostya Serebryanyaf955972018-10-23 00:50:40 +0000357; CHECK-NEXT: call void @__hwasan_init_frames(
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000358; CHECK-NEXT: ret void
359; CHECK-NEXT: }