xref: /llvm-project/llvm/test/Instrumentation/DataFlowSanitizer/store.ll (revision ecb85b5cd89f9797c538675ee3ab93e350c57bd5)
1; RUN: opt < %s -passes=dfsan -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefixes=CHECK,COMBINE_PTR_LABEL
2; RUN: opt < %s -passes=dfsan -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefixes=CHECK,NO_COMBINE_PTR_LABEL
3target 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-S128"
4target triple = "x86_64-unknown-linux-gnu"
5
6define void @store0({} %v, ptr %p) {
7  ; CHECK-LABEL: @store0.dfsan
8  ; CHECK:       store {} %v, ptr %p
9  ; CHECK-NOT:   store
10  ; CHECK:       ret void
11
12  store {} %v, ptr %p
13  ret void
14}
15
16define void @store8(i8 %v, ptr %p) {
17  ; CHECK-LABEL:       @store8.dfsan
18  ; NO_COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls
19  ; COMBINE_PTR_LABEL:    load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align 2
20
21  ; COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls
22  ; COMBINE_PTR_LABEL: or i8
23  ; CHECK:             ptrtoint ptr {{.*}} i64
24  ; CHECK-NEXT:        xor i64
25  ; CHECK-NEXT:        inttoptr i64 {{.*}} ptr
26  ; CHECK-NEXT:        getelementptr i8, ptr
27  ; CHECK-NEXT:        store i8
28  ; CHECK-NEXT:        store i8 %v, ptr %p
29  ; CHECK-NEXT:        ret void
30
31  store i8 %v, ptr %p
32  ret void
33}
34
35define void @store16(i16 %v, ptr %p) {
36  ; CHECK-LABEL:       @store16.dfsan
37  ; NO_COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls
38  ; COMBINE_PTR_LABEL:    load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align 2
39  ; COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls
40  ; COMBINE_PTR_LABEL: or i8
41  ; CHECK:             ptrtoint ptr {{.*}} i64
42  ; CHECK-NEXT:        xor i64
43  ; CHECK-NEXT:        inttoptr i64 {{.*}} ptr
44  ; CHECK-NEXT:        getelementptr i8, ptr
45  ; CHECK-NEXT:        store i8
46  ; CHECK-NEXT:        getelementptr i8, ptr
47  ; CHECK-NEXT:        store i8
48  ; CHECK-NEXT:        store i16 %v, ptr %p
49  ; CHECK-NEXT:        ret void
50
51  store i16 %v, ptr %p
52  ret void
53}
54
55define void @store32(i32 %v, ptr %p) {
56  ; CHECK-LABEL:       @store32.dfsan
57  ; NO_COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls
58  ; COMBINE_PTR_LABEL:    load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align 2
59  ; COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls
60  ; COMBINE_PTR_LABEL: or i8
61  ; CHECK:             ptrtoint ptr {{.*}} i64
62  ; CHECK-NEXT:        xor i64
63  ; CHECK-NEXT:        inttoptr i64 {{.*}} ptr
64  ; CHECK-NEXT:        getelementptr i8, ptr
65  ; CHECK-NEXT:        store i8
66  ; CHECK-NEXT:        getelementptr i8, ptr
67  ; CHECK-NEXT:        store i8
68  ; CHECK-NEXT:        getelementptr i8, ptr
69  ; CHECK-NEXT:        store i8
70  ; CHECK-NEXT:        getelementptr i8, ptr
71  ; CHECK-NEXT:        store i8
72  ; CHECK-NEXT:        store i32 %v, ptr %p
73  ; CHECK-NEXT:        ret void
74
75  store i32 %v, ptr %p
76  ret void
77}
78
79define void @store64(i64 %v, ptr %p) {
80  ; CHECK-LABEL:       @store64.dfsan
81  ; NO_COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls
82  ; COMBINE_PTR_LABEL:    load i8, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__dfsan_arg_tls to i64), i64 2) to ptr), align 2
83  ; COMBINE_PTR_LABEL: load i8, ptr @__dfsan_arg_tls
84  ; COMBINE_PTR_LABEL: or i8
85  ; CHECK:             ptrtoint ptr {{.*}} i64
86  ; CHECK-NEXT:        xor i64
87  ; CHECK-NEXT:        inttoptr i64 {{.*}} ptr
88  ; CHECK-COUNT-8:     insertelement {{.*}} i8
89  ; CHECK-NEXT:        getelementptr <8 x i8>
90  ; CHECK-NEXT:        store <8 x i8>
91  ; CHECK-NEXT:        store i64 %v, ptr %p
92  ; CHECK-NEXT:        ret void
93
94  store i64 %v, ptr %p
95  ret void
96}
97
98define void @store_zero(ptr %p) {
99  ; CHECK-LABEL:          @store_zero.dfsan
100  ; NO_COMBINE_PTR_LABEL: store i32 0, ptr {{.*}}
101  store i32 0, ptr %p
102  ret void
103}
104