blob: 15b51d410ad8726d1a6b6fe4556c5ecf30a8c32d [file] [log] [blame]
Chandler Carruth2f585332012-07-16 08:56:46 +00001; Test basic address sanitizer instrumentation.
2;
3; RUN: opt < %s -asan -S | FileCheck %s
4
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
8define i32 @test_load(i32* %a) address_safety {
9; CHECK: @test_load
10; CHECK-NOT: load
11; CHECK: %[[LOAD_ADDR:[^ ]*]] = ptrtoint i32* %a to i64
12; CHECK: lshr i64 %[[LOAD_ADDR]], 3
13; CHECK: or i64
14; CHECK: %[[LOAD_SHADOW_PTR:[^ ]*]] = inttoptr
15; CHECK: %[[LOAD_SHADOW:[^ ]*]] = load i8* %[[LOAD_SHADOW_PTR]]
16; CHECK: icmp ne i8
17; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
18;
Chandler Carruth2f585332012-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;
Chandler Carruthc3c8db92012-07-16 08:58:53 +000026; Second instrumentation block reports the error.
Chandler Carruth2f585332012-07-16 08:56:46 +000027; CHECK: call void @__asan_report_load4(i64 %[[LOAD_ADDR]]) noreturn
28; CHECK: unreachable
Chandler Carruthc3c8db92012-07-16 08:58:53 +000029;
30; Finally the instrumented load.
31; CHECK: %tmp1 = load i32* %a
32; CHECK: ret i32 %tmp1
Chandler Carruth2f585332012-07-16 08:56:46 +000033
34entry:
35 %tmp1 = load i32* %a
36 ret i32 %tmp1
37}
38
39define void @test_store(i32* %a) address_safety {
40; CHECK: @test_store
41; CHECK-NOT: store
42; CHECK: %[[STORE_ADDR:[^ ]*]] = ptrtoint i32* %a to i64
43; CHECK: lshr i64 %[[STORE_ADDR]], 3
44; CHECK: or i64
45; CHECK: %[[STORE_SHADOW_PTR:[^ ]*]] = inttoptr
46; CHECK: %[[STORE_SHADOW:[^ ]*]] = load i8* %[[STORE_SHADOW_PTR]]
47; CHECK: icmp ne i8
48; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
49;
Chandler Carruth2f585332012-07-16 08:56:46 +000050; First instrumentation block refines the shadow test.
51; CHECK: and i64 %[[STORE_ADDR]], 7
52; CHECK: add i64 %{{.*}}, 3
53; CHECK: trunc i64 %{{.*}} to i8
54; CHECK: icmp sge i8 %{{.*}}, %[[STORE_SHADOW]]
55; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
56;
Chandler Carruthc3c8db92012-07-16 08:58:53 +000057; Second instrumentation block reports the error.
Chandler Carruth2f585332012-07-16 08:56:46 +000058; CHECK: call void @__asan_report_store4(i64 %[[STORE_ADDR]]) noreturn
59; CHECK: unreachable
Chandler Carruthc3c8db92012-07-16 08:58:53 +000060;
61; Finally the instrumented store.
62; CHECK: store i32 42, i32* %a
63; CHECK: ret void
Chandler Carruth2f585332012-07-16 08:56:46 +000064
65entry:
66 store i32 42, i32* %a
67 ret void
68}