1
1
; Test for handling of asm constraints in MSan instrumentation.
2
+ ; RUN: opt < %s -msan-check-access-address=0 -msan-handle-asm-conservative=0 -S -passes=msan 2>&1 | \
3
+ ; RUN: FileCheck %s
4
+ ; RUN: opt < %s -msan-check-access-address=0 -msan-handle-asm-conservative=1 -S -passes=msan 2>&1 | \
5
+ ; RUN: FileCheck --check-prefixes=CHECK,USER-CONS %s
2
6
; RUN: opt < %s -msan-kernel=1 -msan-check-access-address=0 \
3
- ; RUN: -msan-handle-asm-conservative=0 -S -passes=msan 2>&1 | FileCheck \
4
- ; RUN: "- check-prefix =CHECK" %s
7
+ ; RUN: -msan-handle-asm-conservative=0 -S -passes=msan 2>&1 | FileCheck \
8
+ ; RUN: -- check-prefixes =CHECK,KMSAN %s
5
9
; RUN: opt < %s -msan-kernel=1 -msan-check-access-address=0 \
6
- ; RUN: -msan-handle-asm-conservative=1 -S -passes=msan 2>&1 | FileCheck \
7
- ; RUN: "- check-prefixes=CHECK,CHECK-CONS" %s
10
+ ; RUN: -msan-handle-asm-conservative=1 -S -passes=msan 2>&1 | FileCheck \
11
+ ; RUN: -- check-prefixes=CHECK,KMSAN, CHECK-CONS %s
8
12
9
13
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
10
14
target triple = "x86_64-unknown-linux-gnu"
46
50
; CHECK: [[IS1_F1:%.*]] = load i32, ptr @is1, align 4
47
51
; CHECK: call void @__msan_warning
48
52
; CHECK: call i32 asm "",{{.*}}(i32 [[IS1_F1]])
49
- ; CHECK : [[PACK1_F1:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
50
- ; CHECK : [[EXT1_F1:%.*]] = extractvalue { ptr, ptr } [[PACK1_F1]], 0
51
- ; CHECK : store i32 0, ptr [[EXT1_F1]]
53
+ ; KMSAN : [[PACK1_F1:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
54
+ ; KMSAN : [[EXT1_F1:%.*]] = extractvalue { ptr, ptr } [[PACK1_F1]], 0
55
+ ; KMSAN : store i32 0, ptr [[EXT1_F1]]
52
56
53
57
54
58
; Two input registers, two output registers:
@@ -69,14 +73,14 @@ entry:
69
73
; CHECK: [[IS1_F2:%.*]] = load i32, ptr @is1, align 4
70
74
; CHECK: [[IS2_F2:%.*]] = load i32, ptr @is2, align 4
71
75
; CHECK: call void @__msan_warning
72
- ; CHECK : call void @__msan_warning
76
+ ; KMSAN : call void @__msan_warning
73
77
; CHECK: call { i32, i32 } asm "",{{.*}}(i32 [[IS1_F2]], i32 [[IS2_F2]])
74
- ; CHECK : [[PACK1_F2:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
75
- ; CHECK : [[EXT1_F2:%.*]] = extractvalue { ptr, ptr } [[PACK1_F2]], 0
76
- ; CHECK : store i32 0, ptr [[EXT1_F2]]
77
- ; CHECK : [[PACK2_F2:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
78
- ; CHECK : [[EXT2_F2:%.*]] = extractvalue { ptr, ptr } [[PACK2_F2]], 0
79
- ; CHECK : store i32 0, ptr [[EXT2_F2]]
78
+ ; KMSAN : [[PACK1_F2:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
79
+ ; KMSAN : [[EXT1_F2:%.*]] = extractvalue { ptr, ptr } [[PACK1_F2]], 0
80
+ ; KMSAN : store i32 0, ptr [[EXT1_F2]]
81
+ ; KMSAN : [[PACK2_F2:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
82
+ ; KMSAN : [[EXT2_F2:%.*]] = extractvalue { ptr, ptr } [[PACK2_F2]], 0
83
+ ; KMSAN : store i32 0, ptr [[EXT2_F2]]
80
84
81
85
; Input same as output, used twice:
82
86
; asm("" : "=r" (id1), "=r" (id2) : "r" (id1), "r" (id2));
@@ -96,14 +100,14 @@ entry:
96
100
; CHECK: [[ID1_F3:%.*]] = load i32, ptr @id1, align 4
97
101
; CHECK: [[ID2_F3:%.*]] = load i32, ptr @id2, align 4
98
102
; CHECK: call void @__msan_warning
99
- ; CHECK : call void @__msan_warning
103
+ ; KMSAN : call void @__msan_warning
100
104
; CHECK: call { i32, i32 } asm "",{{.*}}(i32 [[ID1_F3]], i32 [[ID2_F3]])
101
- ; CHECK : [[PACK1_F3:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
102
- ; CHECK : [[EXT1_F3:%.*]] = extractvalue { ptr, ptr } [[PACK1_F3]], 0
103
- ; CHECK : store i32 0, ptr [[EXT1_F3]]
104
- ; CHECK : [[PACK2_F3:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
105
- ; CHECK : [[EXT2_F3:%.*]] = extractvalue { ptr, ptr } [[PACK2_F3]], 0
106
- ; CHECK : store i32 0, ptr [[EXT2_F3]]
105
+ ; KMSAN : [[PACK1_F3:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
106
+ ; KMSAN : [[EXT1_F3:%.*]] = extractvalue { ptr, ptr } [[PACK1_F3]], 0
107
+ ; KMSAN : store i32 0, ptr [[EXT1_F3]]
108
+ ; KMSAN : [[PACK2_F3:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
109
+ ; KMSAN : [[EXT2_F3:%.*]] = extractvalue { ptr, ptr } [[PACK2_F3]], 0
110
+ ; KMSAN : store i32 0, ptr [[EXT2_F3]]
107
111
108
112
109
113
; One of the input registers is also an output:
@@ -124,14 +128,14 @@ entry:
124
128
; CHECK: [[ID1_F4:%.*]] = load i32, ptr @id1, align 4
125
129
; CHECK: [[IS1_F4:%.*]] = load i32, ptr @is1, align 4
126
130
; CHECK: call void @__msan_warning
127
- ; CHECK : call void @__msan_warning
131
+ ; KMSAN : call void @__msan_warning
128
132
; CHECK: call { i32, i32 } asm "",{{.*}}(i32 [[ID1_F4]], i32 [[IS1_F4]])
129
- ; CHECK : [[PACK1_F4:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
130
- ; CHECK : [[EXT1_F4:%.*]] = extractvalue { ptr, ptr } [[PACK1_F4]], 0
131
- ; CHECK : store i32 0, ptr [[EXT1_F4]]
132
- ; CHECK : [[PACK2_F4:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
133
- ; CHECK : [[EXT2_F4:%.*]] = extractvalue { ptr, ptr } [[PACK2_F4]], 0
134
- ; CHECK : store i32 0, ptr [[EXT2_F4]]
133
+ ; KMSAN : [[PACK1_F4:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
134
+ ; KMSAN : [[EXT1_F4:%.*]] = extractvalue { ptr, ptr } [[PACK1_F4]], 0
135
+ ; KMSAN : store i32 0, ptr [[EXT1_F4]]
136
+ ; KMSAN : [[PACK2_F4:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
137
+ ; KMSAN : [[EXT2_F4:%.*]] = extractvalue { ptr, ptr } [[PACK2_F4]], 0
138
+ ; KMSAN : store i32 0, ptr [[EXT2_F4]]
135
139
136
140
137
141
; One input register, three output registers:
@@ -153,15 +157,15 @@ entry:
153
157
; CHECK: [[IS1_F5:%.*]] = load i32, ptr @is1, align 4
154
158
; CHECK: call void @__msan_warning
155
159
; CHECK: call { i32, i32, i32 } asm "",{{.*}}(i32 [[IS1_F5]])
156
- ; CHECK : [[PACK1_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
157
- ; CHECK : [[EXT1_F5:%.*]] = extractvalue { ptr, ptr } [[PACK1_F5]], 0
158
- ; CHECK : store i32 0, ptr [[EXT1_F5]]
159
- ; CHECK : [[PACK2_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
160
- ; CHECK : [[EXT2_F5:%.*]] = extractvalue { ptr, ptr } [[PACK2_F5]], 0
161
- ; CHECK : store i32 0, ptr [[EXT2_F5]]
162
- ; CHECK : [[PACK3_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id3{{.*}})
163
- ; CHECK : [[EXT3_F5:%.*]] = extractvalue { ptr, ptr } [[PACK3_F5]], 0
164
- ; CHECK : store i32 0, ptr [[EXT3_F5]]
160
+ ; KMSAN : [[PACK1_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
161
+ ; KMSAN : [[EXT1_F5:%.*]] = extractvalue { ptr, ptr } [[PACK1_F5]], 0
162
+ ; KMSAN : store i32 0, ptr [[EXT1_F5]]
163
+ ; KMSAN : [[PACK2_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
164
+ ; KMSAN : [[EXT2_F5:%.*]] = extractvalue { ptr, ptr } [[PACK2_F5]], 0
165
+ ; KMSAN : store i32 0, ptr [[EXT2_F5]]
166
+ ; KMSAN : [[PACK3_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id3{{.*}})
167
+ ; KMSAN : [[EXT3_F5:%.*]] = extractvalue { ptr, ptr } [[PACK3_F5]], 0
168
+ ; KMSAN : store i32 0, ptr [[EXT3_F5]]
165
169
166
170
167
171
; 2 input memory args, 2 output memory args:
@@ -173,6 +177,8 @@ entry:
173
177
}
174
178
175
179
; CHECK-LABEL: @f_2i_2o_mem
180
+ ; USER-CONS: store i32 0, ptr inttoptr (i64 xor (i64 ptrtoint (ptr @id1 to i64), i64 87960930222080) to ptr), align 1
181
+ ; USER-CONS: store i32 0, ptr inttoptr (i64 xor (i64 ptrtoint (ptr @id2 to i64), i64 87960930222080) to ptr), align 1
176
182
; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@id1{{.*}}, i64 4)
177
183
; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@id2{{.*}}, i64 4)
178
184
; CHECK: call void asm "", "=*m,=*m,*m,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) @id1, ptr elementtype(i32) @id2, ptr elementtype(i32) @is1, ptr elementtype(i32) @is2)
@@ -190,6 +196,7 @@ entry:
190
196
191
197
; CHECK-LABEL: @f_1i_1o_memreg
192
198
; CHECK: [[IS1_F7:%.*]] = load i32, ptr @is1, align 4
199
+ ; USER-CONS: store i32 0, ptr inttoptr (i64 xor (i64 ptrtoint (ptr @id1 to i64), i64 87960930222080) to ptr), align 1
193
200
; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@id1{{.*}}, i64 4)
194
201
; CHECK: call void @__msan_warning
195
202
; CHECK: call i32 asm "", "=r,=*m,r,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) @id1, i32 [[IS1_F7]], ptr elementtype(i32) @is1)
@@ -208,6 +215,7 @@ entry:
208
215
}
209
216
210
217
; CHECK-LABEL: @f_3o_reg_mem_reg
218
+ ; USER-CONS: store i32 0, ptr inttoptr (i64 xor (i64 ptrtoint (ptr @id2 to i64), i64 87960930222080) to ptr), align 1
211
219
; CHECK-CONS: call void @__msan_instrument_asm_store(ptr @id2, i64 4)
212
220
; CHECK: call { i32, i32 } asm "", "=r,=*m,=r,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) @id2)
213
221
@@ -232,10 +240,11 @@ entry:
232
240
; CHECK: [[PAIR1_F9:%.*]] = load {{.*}} @pair1
233
241
; CHECK: [[C1_F9:%.*]] = load {{.*}} @c1
234
242
; CHECK: [[MEMCPY_S1_F9:%.*]] = load {{.*}} @memcpy_s1
243
+ ; USER-CONS: store { i32, i32 } zeroinitializer, ptr inttoptr (i64 xor (i64 ptrtoint (ptr @pair2 to i64), i64 87960930222080) to ptr), align 1
235
244
; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@pair2{{.*}}, i64 8)
236
245
; CHECK: call void @__msan_warning
237
- ; CHECK : call void @__msan_warning
238
- ; CHECK : call void @__msan_warning
246
+ ; KMSAN : call void @__msan_warning
247
+ ; KMSAN : call void @__msan_warning
239
248
; CHECK: call { i8, ptr } asm "", "=*r,=r,=r,r,r,r,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(%struct.pair) @pair2, {{.*}}[[PAIR1_F9]], i8 [[C1_F9]], {{.*}} [[MEMCPY_S1_F9]])
240
249
241
250
; Three inputs and three outputs of different types: a pair, a char, a function pointer.
@@ -248,9 +257,12 @@ entry:
248
257
}
249
258
250
259
; CHECK-LABEL: @f_3i_3o_complex_mem
251
- ; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@pair2{{.*}}, i64 8)
252
- ; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@c2{{.*}}, i64 1)
253
- ; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@memcpy_d1{{.*}}, i64 8)
260
+ ; USER-CONS: store { i32, i32 } zeroinitializer, ptr inttoptr (i64 xor (i64 ptrtoint (ptr @pair2 to i64), i64 87960930222080) to ptr), align 1
261
+ ; USER-CONS-NEXT: store i8 0, ptr inttoptr (i64 xor (i64 ptrtoint (ptr @c2 to i64), i64 87960930222080) to ptr), align 1
262
+ ; USER-CONS-NEXT: store i64 0, ptr inttoptr (i64 xor (i64 ptrtoint (ptr @memcpy_d1 to i64), i64 87960930222080) to ptr), align 1
263
+ ; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@pair2{{.*}}, i64 8)
264
+ ; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@c2{{.*}}, i64 1)
265
+ ; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@memcpy_d1{{.*}}, i64 8)
254
266
; CHECK: call void asm "", "=*m,=*m,=*m,*m,*m,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(%struct.pair) @pair2, ptr elementtype(i8) @c2, ptr elementtype(ptr) @memcpy_d1, ptr elementtype(%struct.pair) @pair1, ptr elementtype(i8) @c1, ptr elementtype(ptr) @memcpy_s1)
255
267
256
268
@@ -278,8 +290,8 @@ cleanup: ; preds = %entry, %skip_label
278
290
}
279
291
280
292
; CHECK-LABEL: @asm_goto
281
- ; CHECK : [[LOAD_ARG:%.*]] = load {{.*}} %_msarg
282
- ; CHECK : [[CMP:%.*]] = icmp ne {{.*}} [[LOAD_ARG]], 0
283
- ; CHECK : br {{.*}} [[CMP]], label %[[LABEL:.*]], label
284
- ; CHECK : [[LABEL]]:
285
- ; CHECK -NEXT: call void @__msan_warning
293
+ ; KMSAN : [[LOAD_ARG:%.*]] = load {{.*}} %_msarg
294
+ ; KMSAN : [[CMP:%.*]] = icmp ne {{.*}} [[LOAD_ARG]], 0
295
+ ; KMSAN : br {{.*}} [[CMP]], label %[[LABEL:.*]], label
296
+ ; KMSAN : [[LABEL]]:
297
+ ; KMSAN -NEXT: call void @__msan_warning
0 commit comments