1
1
; Test for handling of asm constraints in MSan instrumentation.
2
- ; RUN: opt < %s -msan -msan-check-access-address=0 -msan-handle-asm-conservative=0 -S | FileCheck -check-prefixes=CHECK,CHECK-NONCONS %s
3
- ; RUN: opt < %s -msan -msan-check-access-address=0 -msan-handle-asm-conservative=1 -S | FileCheck -check-prefixes=CHECK,CHECK-CONS %s
2
+ ; RUN: opt < %s -msan -msan-kernel=1 -msan- check-access-address=0 -msan-handle-asm-conservative=0 -S | FileCheck -check-prefixes=CHECK,CHECK-NONCONS %s
3
+ ; RUN: opt < %s -msan -msan-kernel=1 -msan- check-access-address=0 -msan-handle-asm-conservative=1 -S | FileCheck -check-prefixes=CHECK,CHECK-CONS %s
4
4
5
5
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
6
6
target triple = "x86_64-unknown-linux-gnu"
@@ -40,9 +40,12 @@ entry:
40
40
41
41
; CHECK-LABEL: @f_1i_1o_reg
42
42
; CHECK: [[IS1_F1:%.*]] = load i32, i32* @is1, align 4
43
- ; CHECK: call void @__msan_warning_noreturn()
43
+ ; CHECK: call void @__msan_warning
44
44
; CHECK: call i32 asm "",{{.*}}(i32 [[IS1_F1]])
45
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id1 to i64)
45
+ ; CHECK: [[PACK1_F1:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
46
+ ; CHECK: [[EXT1_F1:%.*]] = extractvalue { i8*, i32* } [[PACK1_F1]], 0
47
+ ; CHECK: [[CAST1_F1:%.*]] = bitcast i8* [[EXT1_F1]] to i32*
48
+ ; CHECK: store i32 0, i32* [[CAST1_F1]]
46
49
47
50
48
51
; Two input registers, two output registers:
@@ -62,11 +65,17 @@ entry:
62
65
; CHECK-LABEL: @f_2i_2o_reg
63
66
; CHECK: [[IS1_F2:%.*]] = load i32, i32* @is1, align 4
64
67
; CHECK: [[IS2_F2:%.*]] = load i32, i32* @is2, align 4
65
- ; CHECK: call void @__msan_warning_noreturn()
66
- ; CHECK: call void @__msan_warning_noreturn()
68
+ ; CHECK: call void @__msan_warning
69
+ ; CHECK: call void @__msan_warning
67
70
; CHECK: call { i32, i32 } asm "",{{.*}}(i32 [[IS1_F2]], i32 [[IS2_F2]])
68
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id1 to i64)
69
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id2 to i64)
71
+ ; CHECK: [[PACK1_F2:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
72
+ ; CHECK: [[EXT1_F2:%.*]] = extractvalue { i8*, i32* } [[PACK1_F2]], 0
73
+ ; CHECK: [[CAST1_F2:%.*]] = bitcast i8* [[EXT1_F2]] to i32*
74
+ ; CHECK: store i32 0, i32* [[CAST1_F2]]
75
+ ; CHECK: [[PACK2_F2:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
76
+ ; CHECK: [[EXT2_F2:%.*]] = extractvalue { i8*, i32* } [[PACK2_F2]], 0
77
+ ; CHECK: [[CAST2_F2:%.*]] = bitcast i8* [[EXT2_F2]] to i32*
78
+ ; CHECK: store i32 0, i32* [[CAST2_F2]]
70
79
71
80
; Input same as output, used twice:
72
81
; asm("" : "=r" (id1), "=r" (id2) : "r" (id1), "r" (id2));
@@ -85,11 +94,17 @@ entry:
85
94
; CHECK-LABEL: @f_2i_2o_reuse2_reg
86
95
; CHECK: [[ID1_F3:%.*]] = load i32, i32* @id1, align 4
87
96
; CHECK: [[ID2_F3:%.*]] = load i32, i32* @id2, align 4
88
- ; CHECK: call void @__msan_warning_noreturn()
89
- ; CHECK: call void @__msan_warning_noreturn()
97
+ ; CHECK: call void @__msan_warning
98
+ ; CHECK: call void @__msan_warning
90
99
; CHECK: call { i32, i32 } asm "",{{.*}}(i32 [[ID1_F3]], i32 [[ID2_F3]])
91
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id1 to i64)
92
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id2 to i64)
100
+ ; CHECK: [[PACK1_F3:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
101
+ ; CHECK: [[EXT1_F3:%.*]] = extractvalue { i8*, i32* } [[PACK1_F3]], 0
102
+ ; CHECK: [[CAST1_F3:%.*]] = bitcast i8* [[EXT1_F3]] to i32*
103
+ ; CHECK: store i32 0, i32* [[CAST1_F3]]
104
+ ; CHECK: [[PACK2_F3:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
105
+ ; CHECK: [[EXT2_F3:%.*]] = extractvalue { i8*, i32* } [[PACK2_F3]], 0
106
+ ; CHECK: [[CAST2_F3:%.*]] = bitcast i8* [[EXT2_F3]] to i32*
107
+ ; CHECK: store i32 0, i32* [[CAST2_F3]]
93
108
94
109
95
110
; One of the input registers is also an output:
@@ -109,11 +124,17 @@ entry:
109
124
; CHECK-LABEL: @f_2i_2o_reuse1_reg
110
125
; CHECK: [[ID1_F4:%.*]] = load i32, i32* @id1, align 4
111
126
; CHECK: [[IS1_F4:%.*]] = load i32, i32* @is1, align 4
112
- ; CHECK: call void @__msan_warning_noreturn()
113
- ; CHECK: call void @__msan_warning_noreturn()
127
+ ; CHECK: call void @__msan_warning
128
+ ; CHECK: call void @__msan_warning
114
129
; CHECK: call { i32, i32 } asm "",{{.*}}(i32 [[ID1_F4]], i32 [[IS1_F4]])
115
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id1 to i64)
116
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id2 to i64)
130
+ ; CHECK: [[PACK1_F4:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
131
+ ; CHECK: [[EXT1_F4:%.*]] = extractvalue { i8*, i32* } [[PACK1_F4]], 0
132
+ ; CHECK: [[CAST1_F4:%.*]] = bitcast i8* [[EXT1_F4]] to i32*
133
+ ; CHECK: store i32 0, i32* [[CAST1_F4]]
134
+ ; CHECK: [[PACK2_F4:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
135
+ ; CHECK: [[EXT2_F4:%.*]] = extractvalue { i8*, i32* } [[PACK2_F4]], 0
136
+ ; CHECK: [[CAST2_F4:%.*]] = bitcast i8* [[EXT2_F4]] to i32*
137
+ ; CHECK: store i32 0, i32* [[CAST2_F4]]
117
138
118
139
119
140
; One input register, three output registers:
@@ -133,11 +154,20 @@ entry:
133
154
134
155
; CHECK-LABEL: @f_1i_3o_reg
135
156
; CHECK: [[IS1_F5:%.*]] = load i32, i32* @is1, align 4
136
- ; CHECK: call void @__msan_warning_noreturn()
157
+ ; CHECK: call void @__msan_warning
137
158
; CHECK: call { i32, i32, i32 } asm "",{{.*}}(i32 [[IS1_F5]])
138
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id1 to i64)
139
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id2 to i64)
140
- ; CHECK: store i32 0,{{.*}}ptrtoint (i32* @id3 to i64)
159
+ ; CHECK: [[PACK1_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id1{{.*}})
160
+ ; CHECK: [[EXT1_F5:%.*]] = extractvalue { i8*, i32* } [[PACK1_F5]], 0
161
+ ; CHECK: [[CAST1_F5:%.*]] = bitcast i8* [[EXT1_F5]] to i32*
162
+ ; CHECK: store i32 0, i32* [[CAST1_F5]]
163
+ ; CHECK: [[PACK2_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id2{{.*}})
164
+ ; CHECK: [[EXT2_F5:%.*]] = extractvalue { i8*, i32* } [[PACK2_F5]], 0
165
+ ; CHECK: [[CAST2_F5:%.*]] = bitcast i8* [[EXT2_F5]] to i32*
166
+ ; CHECK: store i32 0, i32* [[CAST2_F5]]
167
+ ; CHECK: [[PACK3_F5:%.*]] = call {{.*}} @__msan_metadata_ptr_for_store_4({{.*}}@id3{{.*}})
168
+ ; CHECK: [[EXT3_F5:%.*]] = extractvalue { i8*, i32* } [[PACK3_F5]], 0
169
+ ; CHECK: [[CAST3_F5:%.*]] = bitcast i8* [[EXT3_F5]] to i32*
170
+ ; CHECK: store i32 0, i32* [[CAST3_F5]]
141
171
142
172
143
173
; 2 input memory args, 2 output memory args:
@@ -170,7 +200,7 @@ entry:
170
200
; CHECK: [[IS1_F7:%.*]] = load i32, i32* @is1, align 4
171
201
; CHECK-CONS: call void @__msan_instrument_asm_load({{.*}}@is1{{.*}}, i64 4)
172
202
; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@id1{{.*}}, i64 4)
173
- ; CHECK: call void @__msan_warning_noreturn()
203
+ ; CHECK: call void @__msan_warning
174
204
; CHECK: call i32 asm "", "=r,=*m,r,*m,~{dirflag},~{fpsr},~{flags}"(i32* @id1, i32 [[IS1_F7]], i32* @is1)
175
205
176
206
@@ -212,9 +242,9 @@ entry:
212
242
; CHECK: [[C1_F9:%.*]] = load {{.*}} @c1
213
243
; CHECK: [[MEMCPY_S1_F9:%.*]] = load {{.*}} @memcpy_s1
214
244
; CHECK-CONS: call void @__msan_instrument_asm_store({{.*}}@pair2{{.*}}, i64 8)
215
- ; CHECK: call void @__msan_warning_noreturn()
216
- ; CHECK: call void @__msan_warning_noreturn()
217
- ; CHECK: call void @__msan_warning_noreturn()
245
+ ; CHECK: call void @__msan_warning
246
+ ; CHECK: call void @__msan_warning
247
+ ; CHECK: call void @__msan_warning
218
248
; CHECK: call { i8, i8* (i8*, i8*, i32)* } asm "", "=*r,=r,=r,r,r,r,~{dirflag},~{fpsr},~{flags}"(%struct.pair* @pair2, {{.*}}[[PAIR1_F9]], i8 [[C1_F9]], {{.*}} [[MEMCPY_S1_F9]])
219
249
220
250
; Three inputs and three outputs of different types: a pair, a char, a function pointer.
0 commit comments