blob: e02e5fc283b8406ee03851b48d20827caebb00a3 [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
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(
16; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000017; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
18; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
19; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
20; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +000021; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
22; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
23; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000024; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
25; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
26; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
27
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000028; ABORT: call void asm sideeffect "brk #2304", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000029; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000030; RECOVER: call void asm sideeffect "brk #2336", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000031; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000032
33; 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(
43; CHECK: %[[A:[^ ]*]] = ptrtoint i16* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000044; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
45; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
46; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
47; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +000048; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
49; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
50; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000051; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
52; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
53; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
54
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000055; ABORT: call void asm sideeffect "brk #2305", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000056; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000057; RECOVER: call void asm sideeffect "brk #2337", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000058; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000059
60; CHECK: %[[G:[^ ]*]] = load i16, i16* %a, align 4
61; CHECK: ret i16 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000062
63entry:
64 %b = load i16, i16* %a, align 4
65 ret i16 %b
66}
67
68define i32 @test_load32(i32* %a) sanitize_hwaddress {
69; CHECK-LABEL: @test_load32(
70; CHECK: %[[A:[^ ]*]] = ptrtoint i32* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000071; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
72; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
73; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
74; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +000075; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
76; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
77; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000078; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
79; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
80; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
81
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000082; ABORT: call void asm sideeffect "brk #2306", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000083; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +000084; RECOVER: call void asm sideeffect "brk #2338", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +000085; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000086
87; CHECK: %[[G:[^ ]*]] = load i32, i32* %a, align 4
88; CHECK: ret i32 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +000089
90entry:
91 %b = load i32, i32* %a, align 4
92 ret i32 %b
93}
94
95define i64 @test_load64(i64* %a) sanitize_hwaddress {
96; CHECK-LABEL: @test_load64(
97; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +000098; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
99; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
100; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
101; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000102; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
103; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
104; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000105; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
106; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
107; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
108
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000109; ABORT: call void asm sideeffect "brk #2307", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000110; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000111; RECOVER: call void asm sideeffect "brk #2339", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000112; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000113
114; CHECK: %[[G:[^ ]*]] = load i64, i64* %a, align 8
115; CHECK: ret i64 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000116
117entry:
118 %b = load i64, i64* %a, align 8
119 ret i64 %b
120}
121
122define i128 @test_load128(i128* %a) sanitize_hwaddress {
123; CHECK-LABEL: @test_load128(
124; CHECK: %[[A:[^ ]*]] = ptrtoint i128* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000125; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
126; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
127; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
128; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000129; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
130; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
131; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000132; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
133; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
134; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
135
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000136; ABORT: call void asm sideeffect "brk #2308", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000137; ABORT: unreachable
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
141; CHECK: %[[G:[^ ]*]] = load i128, i128* %a, align 16
142; CHECK: ret i128 %[[G]]
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000143
144entry:
145 %b = load i128, i128* %a, align 16
146 ret i128 %b
147}
148
149define i40 @test_load40(i40* %a) sanitize_hwaddress {
150; CHECK-LABEL: @test_load40(
151; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000152; ABORT: call void @__hwasan_loadN(i64 %[[A]], i64 5)
153; RECOVER: call void @__hwasan_loadN_noabort(i64 %[[A]], i64 5)
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000154; CHECK: %[[B:[^ ]*]] = load i40, i40* %a
155; CHECK: ret i40 %[[B]]
156
157entry:
158 %b = load i40, i40* %a, align 4
159 ret i40 %b
160}
161
162define void @test_store8(i8* %a, i8 %b) sanitize_hwaddress {
163; CHECK-LABEL: @test_store8(
164; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000165; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
166; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
167; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
168; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000169; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
170; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
171; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000172; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
173; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
174; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
175
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000176; ABORT: call void asm sideeffect "brk #2320", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000177; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000178; RECOVER: call void asm sideeffect "brk #2352", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000179; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000180
181; CHECK: store i8 %b, i8* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000182; CHECK: ret void
183
184entry:
185 store i8 %b, i8* %a, align 4
186 ret void
187}
188
189define void @test_store16(i16* %a, i16 %b) sanitize_hwaddress {
190; CHECK-LABEL: @test_store16(
191; CHECK: %[[A:[^ ]*]] = ptrtoint i16* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000192; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
193; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
194; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
195; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000196; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
197; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
198; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000199; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
200; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
201; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
202
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000203; ABORT: call void asm sideeffect "brk #2321", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000204; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000205; RECOVER: call void asm sideeffect "brk #2353", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000206; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000207
208; CHECK: store i16 %b, i16* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000209; CHECK: ret void
210
211entry:
212 store i16 %b, i16* %a, align 4
213 ret void
214}
215
216define void @test_store32(i32* %a, i32 %b) sanitize_hwaddress {
217; CHECK-LABEL: @test_store32(
218; CHECK: %[[A:[^ ]*]] = ptrtoint i32* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000219; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
220; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
221; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
222; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000223; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
224; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
225; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000226; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
227; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
228; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
229
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000230; ABORT: call void asm sideeffect "brk #2322", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000231; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000232; RECOVER: call void asm sideeffect "brk #2354", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000233; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000234
235; CHECK: store i32 %b, i32* %a, align 4
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000236; CHECK: ret void
237
238entry:
239 store i32 %b, i32* %a, align 4
240 ret void
241}
242
243define void @test_store64(i64* %a, i64 %b) sanitize_hwaddress {
244; CHECK-LABEL: @test_store64(
245; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000246; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
247; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
248; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
249; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000250; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
251; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
252; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000253; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
254; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
255; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
256
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000257; ABORT: call void asm sideeffect "brk #2323", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000258; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000259; RECOVER: call void asm sideeffect "brk #2355", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000260; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000261
262; CHECK: store i64 %b, i64* %a, align 8
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000263; CHECK: ret void
264
265entry:
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000266 store i64 %b, i64* %a, align 8
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000267 ret void
268}
269
270define void @test_store128(i128* %a, i128 %b) sanitize_hwaddress {
271; CHECK-LABEL: @test_store128(
272; CHECK: %[[A:[^ ]*]] = ptrtoint i128* %a to i64
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000273; CHECK: %[[B:[^ ]*]] = lshr i64 %[[A]], 56
274; CHECK: %[[PTRTAG:[^ ]*]] = trunc i64 %[[B]] to i8
275; CHECK: %[[C:[^ ]*]] = and i64 %[[A]], 72057594037927935
276; CHECK: %[[D:[^ ]*]] = lshr i64 %[[C]], 4
Alex Shlyapnikov99cf54b2018-04-20 20:04:04 +0000277; DYNAMIC-SHADOW: %[[D_DYN:[^ ]*]] = add i64 %[[D]], %.hwasan.shadow
278; DYNAMIC-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D_DYN]] to i8*
279; ZERO-BASED-SHADOW: %[[E:[^ ]*]] = inttoptr i64 %[[D]] to i8*
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000280; CHECK: %[[MEMTAG:[^ ]*]] = load i8, i8* %[[E]]
281; CHECK: %[[F:[^ ]*]] = icmp ne i8 %[[PTRTAG]], %[[MEMTAG]]
282; CHECK: br i1 %[[F]], label {{.*}}, label {{.*}}, !prof {{.*}}
283
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000284; ABORT: call void asm sideeffect "brk #2324", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000285; ABORT: unreachable
Evgeniy Stepanov43271b12018-02-21 19:52:23 +0000286; RECOVER: call void asm sideeffect "brk #2356", "{x0}"(i64 %[[A]])
Evgeniy Stepanov3fd1b1a2017-12-20 19:05:44 +0000287; RECOVER: br label
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000288
289; CHECK: store i128 %b, i128* %a, align 16
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000290; CHECK: ret void
291
292entry:
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000293 store i128 %b, i128* %a, align 16
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000294 ret void
295}
296
297define void @test_store40(i40* %a, i40 %b) sanitize_hwaddress {
298; CHECK-LABEL: @test_store40(
299; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000300; ABORT: call void @__hwasan_storeN(i64 %[[A]], i64 5)
301; RECOVER: call void @__hwasan_storeN_noabort(i64 %[[A]], i64 5)
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000302; CHECK: store i40 %b, i40* %a
303; CHECK: ret void
304
305entry:
306 store i40 %b, i40* %a, align 4
307 ret void
308}
309
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000310define void @test_store_unaligned(i64* %a, i64 %b) sanitize_hwaddress {
311; CHECK-LABEL: @test_store_unaligned(
312; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
Evgeniy Stepanovc07e0bd2018-01-16 23:15:08 +0000313; ABORT: call void @__hwasan_storeN(i64 %[[A]], i64 8)
314; RECOVER: call void @__hwasan_storeN_noabort(i64 %[[A]], i64 8)
Evgeniy Stepanovecb48e52017-12-13 01:16:34 +0000315; CHECK: store i64 %b, i64* %a, align 4
316; CHECK: ret void
317
318entry:
319 store i64 %b, i64* %a, align 4
320 ret void
321}
322
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000323define i8 @test_load_noattr(i8* %a) {
324; CHECK-LABEL: @test_load_noattr(
325; CHECK-NEXT: entry:
326; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8* %a
327; CHECK-NEXT: ret i8 %[[B]]
328
329entry:
330 %b = load i8, i8* %a, align 4
331 ret i8 %b
332}
333
334define i8 @test_load_notmyattr(i8* %a) sanitize_address {
335; CHECK-LABEL: @test_load_notmyattr(
336; CHECK-NEXT: entry:
337; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8* %a
338; CHECK-NEXT: ret i8 %[[B]]
339
340entry:
341 %b = load i8, i8* %a, align 4
342 ret i8 %b
343}
344
345define i8 @test_load_addrspace(i8 addrspace(256)* %a) sanitize_hwaddress {
346; CHECK-LABEL: @test_load_addrspace(
347; CHECK-NEXT: entry:
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000348; CHECK-NEXT: %[[B:[^ ]*]] = load i8, i8 addrspace(256)* %a
349; CHECK-NEXT: ret i8 %[[B]]
350
351entry:
352 %b = load i8, i8 addrspace(256)* %a, align 4
353 ret i8 %b
354}
355
356; CHECK: declare void @__hwasan_init()
357
Peter Collingbourned3a3e4b2018-12-17 22:56:34 +0000358; CHECK: define internal void @hwasan.module_ctor() comdat {
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000359; CHECK-NEXT: call void @__hwasan_init()
Kostya Serebryanyaf955972018-10-23 00:50:40 +0000360; CHECK-NEXT: call void @__hwasan_init_frames(
Evgeniy Stepanovc667c1f2017-12-09 00:21:41 +0000361; CHECK-NEXT: ret void
362; CHECK-NEXT: }