OLD | NEW |
---|---|
1 ; RUN: not pnacl-abicheck < %s | FileCheck %s | 1 ; RUN: not pnacl-abicheck < %s | FileCheck %s |
2 ; Test instruction opcodes allowed by PNaCl ABI | 2 ; Test instruction opcodes allowed by PNaCl ABI |
3 | 3 |
4 target datalayout = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64 :64:64-p:32:32:32-v128:32:32" | 4 target datalayout = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64 :64:64-p:32:32:32-v128:32:32" |
5 target triple = "le32-unknown-nacl" | 5 target triple = "le32-unknown-nacl" |
6 | 6 |
7 define internal void @terminators() { | 7 define internal void @terminators() { |
8 ; CHECK: ERROR: Function terminators | 8 ; CHECK: ERROR: Function terminators |
9 ; Terminator instructions | 9 ; Terminator instructions |
10 terminators: | 10 terminators: |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 } | 141 } |
142 | 142 |
143 define internal void @memory() { | 143 define internal void @memory() { |
144 ; CHECK: ERROR: Function memory | 144 ; CHECK: ERROR: Function memory |
145 ; Memory operations | 145 ; Memory operations |
146 %a1 = alloca i8, i32 4 | 146 %a1 = alloca i8, i32 4 |
147 %ptr = inttoptr i32 0 to i32* | 147 %ptr = inttoptr i32 0 to i32* |
148 %a2 = load i32* %ptr, align 1 | 148 %a2 = load i32* %ptr, align 1 |
149 store i32 undef, i32* %ptr, align 1 | 149 store i32 undef, i32* %ptr, align 1 |
150 ; CHECK-NOT: disallowed | 150 ; CHECK-NOT: disallowed |
151 %vptr = inttoptr i32 0 to <4 x i32>* ; CHECK-NEXT: disallowed: bad result type : <4 x i32>* | |
152 %a3 = load <4 x i32>* %vptr, align 16 ; CHECK-NEXT: disallowed: bad pointer: { {.*}} load <4 x i32>* | |
153 store <4 x i32> undef, <4 x i32>* %vptr, align 16 ; CHECK-NEXT: disallowed: ba d pointer: store <4 x i32> | |
154 %a4 = getelementptr { i32, i32}* undef ; CHECK-NEXT: disallowed: bad instructi on opcode: {{.*}} getelementptr | 151 %a4 = getelementptr { i32, i32}* undef ; CHECK-NEXT: disallowed: bad instructi on opcode: {{.*}} getelementptr |
155 ret void | 152 ret void |
156 } | 153 } |
157 | 154 |
155 define internal void @vector_memory() { | |
156 ; CHECK: ERROR: Function vector_memory | |
157 ; Vector memory operations. | |
jvoung (off chromium)
2014/06/10 16:28:33
Is there anywhere that tests alloca <vectorty>?
JF
2014/06/10 18:26:29
Not that I know of. What are you suggesting? Maybe
jvoung (off chromium)
2014/06/10 19:20:31
Right now we only allow alloca i8, i32 <sz>, align
JF
2014/06/11 16:04:51
Done.
| |
158 %ptr16xi8 = inttoptr i32 0 to <16 x i8>* | |
159 %ptr8xi16 = inttoptr i32 0 to <8 x i16>* | |
160 %ptr4xi32 = inttoptr i32 0 to <4 x i32>* | |
161 %ptr4xfloat = inttoptr i32 0 to <4 x float>* | |
162 | |
163 %l16xi8 = load <16 x i8>* %ptr16xi8, align 1 | |
164 %l8xi16 = load <8 x i16>* %ptr8xi16, align 2 | |
165 %l4xi32 = load <4 x i32>* %ptr4xi32, align 4 | |
166 %l4xfloat = load <4 x float>* %ptr4xfloat, align 4 | |
167 | |
168 store <16 x i8> undef, <16 x i8>* %ptr16xi8, align 1 | |
169 store <8 x i16> undef, <8 x i16>* %ptr8xi16, align 2 | |
170 store <4 x i32> undef, <4 x i32>* %ptr4xi32, align 4 | |
171 store <4 x float> undef, <4 x float>* %ptr4xfloat, align 4 | |
172 | |
173 ; CHECK-NOT: disallowed | |
174 ; The following vector types are disallowed. | |
175 %ptr2xi1 = inttoptr i32 0 to <2 x i1>* ; CHECK-NEXT: disallowed: bad r esult type: <2 x i1>* | |
176 %ptr4xi1 = inttoptr i32 0 to <4 x i1>* ; CHECK-NEXT: disallowed: bad r esult type: <4 x i1>* | |
177 %ptr8xi1 = inttoptr i32 0 to <8 x i1>* ; CHECK-NEXT: disallowed: bad r esult type: <8 x i1>* | |
178 %ptr16xi1 = inttoptr i32 0 to <16 x i1>* ; CHECK-NEXT: disallowed: bad r esult type: <16 x i1>* | |
179 %ptr32xi1 = inttoptr i32 0 to <32 x i1>* ; CHECK-NEXT: disallowed: bad r esult type: <32 x i1>* | |
180 %ptr64xi1 = inttoptr i32 0 to <64 x i1>* ; CHECK-NEXT: disallowed: bad r esult type: <64 x i1>* | |
181 %ptr2xi8 = inttoptr i32 0 to <2 x i8>* ; CHECK-NEXT: disallowed: bad r esult type: <2 x i8>* | |
182 %ptr4xi8 = inttoptr i32 0 to <4 x i8>* ; CHECK-NEXT: disallowed: bad r esult type: <4 x i8>* | |
183 %ptr32xi8 = inttoptr i32 0 to <32 x i8>* ; CHECK-NEXT: disallowed: bad r esult type: <32 x i8>* | |
184 %ptr64xi8 = inttoptr i32 0 to <64 x i8>* ; CHECK-NEXT: disallowed: bad r esult type: <64 x i8>* | |
185 %ptr2xi16 = inttoptr i32 0 to <2 x i16>* ; CHECK-NEXT: disallowed: bad r esult type: <2 x i16>* | |
186 %ptr4xi16 = inttoptr i32 0 to <4 x i16>* ; CHECK-NEXT: disallowed: bad r esult type: <4 x i16>* | |
187 %ptr16xi16 = inttoptr i32 0 to <16 x i16>* ; CHECK-NEXT: disallowed: bad r esult type: <16 x i16>* | |
188 %ptr32xi16 = inttoptr i32 0 to <32 x i16>* ; CHECK-NEXT: disallowed: bad r esult type: <32 x i16>* | |
189 %ptr2xi32 = inttoptr i32 0 to <2 x i32>* ; CHECK-NEXT: disallowed: bad r esult type: <2 x i32>* | |
190 %ptr8xi32 = inttoptr i32 0 to <8 x i32>* ; CHECK-NEXT: disallowed: bad r esult type: <8 x i32>* | |
191 %ptr16xi32 = inttoptr i32 0 to <16 x i32>* ; CHECK-NEXT: disallowed: bad r esult type: <16 x i32>* | |
192 %ptr2xi64 = inttoptr i32 0 to <2 x i64>* ; CHECK-NEXT: disallowed: bad r esult type: <2 x i64>* | |
193 %ptr4xi64 = inttoptr i32 0 to <4 x i64>* ; CHECK-NEXT: disallowed: bad r esult type: <4 x i64>* | |
194 %ptr8xi64 = inttoptr i32 0 to <8 x i64>* ; CHECK-NEXT: disallowed: bad r esult type: <8 x i64>* | |
195 %ptr2xfloat = inttoptr i32 0 to <2 x float>* ; CHECK-NEXT: disallowed: bad r esult type: <2 x float>* | |
196 %ptr8xfloat = inttoptr i32 0 to <8 x float>* ; CHECK-NEXT: disallowed: bad r esult type: <8 x float>* | |
197 %ptr16xfloat = inttoptr i32 0 to <16 x float>* ; CHECK-NEXT: disallowed: bad r esult type: <16 x float>* | |
198 %ptr2xdouble = inttoptr i32 0 to <2 x double>* ; CHECK-NEXT: disallowed: bad r esult type: <2 x double>* | |
199 %ptr4xdouble = inttoptr i32 0 to <4 x double>* ; CHECK-NEXT: disallowed: bad r esult type: <4 x double>* | |
200 %ptr8xdouble = inttoptr i32 0 to <8 x double>* ; CHECK-NEXT: disallowed: bad r esult type: <8 x double>* | |
201 | |
202 ; i1 vector pointers are simply disallowed, their alignment is inconsequential . | |
203 %l4xi1 = load <4 x i1>* %ptr4xi1, align 1 ; CHECK-NEXT: disallowed: bad poi nter: %l4xi1 = load <4 x i1>* %ptr4xi1, align 1 | |
204 %l8xi1 = load <8 x i1>* %ptr8xi1, align 1 ; CHECK-NEXT: disallowed: bad poi nter: %l8xi1 = load <8 x i1>* %ptr8xi1, align 1 | |
205 %l16xi1 = load <16 x i1>* %ptr16xi1, align 1 ; CHECK-NEXT: disallowed: bad poi nter: %l16xi1 = load <16 x i1>* %ptr16xi1, align 1 | |
206 | |
207 store <4 x i1> undef, <4 x i1>* %ptr4xi1, align 1 ; CHECK-NEXT: disallowed: bad pointer: store <4 x i1> undef, <4 x i1>* %ptr4xi1, align 1 | |
208 store <8 x i1> undef, <8 x i1>* %ptr8xi1, align 1 ; CHECK-NEXT: disallowed: bad pointer: store <8 x i1> undef, <8 x i1>* %ptr8xi1, align 1 | |
209 store <16 x i1> undef, <16 x i1>* %ptr16xi1, align 1 ; CHECK-NEXT: disallowed: bad pointer: store <16 x i1> undef, <16 x i1>* %ptr16xi1, align 1 | |
210 | |
211 ; Under- or over-aligned load/store are disallowed. | |
212 %a1_8xi16 = load <8 x i16>* %ptr8xi16, align 1 ; CHECK-NEXT: disallowed: bad alignment: %a1_8xi16 = load <8 x i16>* %ptr8xi16, align 1 | |
213 %a1_4xi32 = load <4 x i32>* %ptr4xi32, align 1 ; CHECK-NEXT: disallowed: bad alignment: %a1_4xi32 = load <4 x i32>* %ptr4xi32, align 1 | |
214 %a1_4xfloat = load <4 x float>* %ptr4xfloat, align 1 ; CHECK-NEXT: disallowed: bad alignment: %a1_4xfloat = load <4 x float>* %ptr4xfloat, align 1 | |
215 | |
216 %a16_16xi8 = load <16 x i8>* %ptr16xi8, align 16 ; CHECK-NEXT: disallowe d: bad alignment: %a16_16xi8 = load <16 x i8>* %ptr16xi8, align 16 | |
217 %a16_8xi16 = load <8 x i16>* %ptr8xi16, align 16 ; CHECK-NEXT: disallowe d: bad alignment: %a16_8xi16 = load <8 x i16>* %ptr8xi16, align 16 | |
218 %a16_4xi32 = load <4 x i32>* %ptr4xi32, align 16 ; CHECK-NEXT: disallowe d: bad alignment: %a16_4xi32 = load <4 x i32>* %ptr4xi32, align 16 | |
219 %a16_4xfloat = load <4 x float>* %ptr4xfloat, align 16 ; CHECK-NEXT: disallowe d: bad alignment: %a16_4xfloat = load <4 x float>* %ptr4xfloat, align 16 | |
220 | |
221 store <8 x i16> undef, <8 x i16>* %ptr8xi16, align 1 ; CHECK-NEXT: disal lowed: bad alignment: store <8 x i16> undef, <8 x i16>* %ptr8xi16, align 1 | |
222 store <4 x i32> undef, <4 x i32>* %ptr4xi32, align 1 ; CHECK-NEXT: disal lowed: bad alignment: store <4 x i32> undef, <4 x i32>* %ptr4xi32, align 1 | |
223 store <4 x float> undef, <4 x float>* %ptr4xfloat, align 1 ; CHECK-NEXT: disal lowed: bad alignment: store <4 x float> undef, <4 x float>* %ptr4xfloat, align 1 | |
224 | |
225 store <16 x i8> undef, <16 x i8>* %ptr16xi8, align 16 ; CHECK-NEXT: disa llowed: bad alignment: store <16 x i8> undef, <16 x i8>* %ptr16xi8, align 16 | |
226 store <8 x i16> undef, <8 x i16>* %ptr8xi16, align 16 ; CHECK-NEXT: disa llowed: bad alignment: store <8 x i16> undef, <8 x i16>* %ptr8xi16, align 16 | |
227 store <4 x i32> undef, <4 x i32>* %ptr4xi32, align 16 ; CHECK-NEXT: disa llowed: bad alignment: store <4 x i32> undef, <4 x i32>* %ptr4xi32, align 16 | |
228 store <4 x float> undef, <4 x float>* %ptr4xfloat, align 16 ; CHECK-NEXT: disa llowed: bad alignment: store <4 x float> undef, <4 x float>* %ptr4xfloat, align 16 | |
229 | |
230 ret void | |
231 } | |
232 | |
158 define internal void @atomic() { | 233 define internal void @atomic() { |
159 ; CHECK: ERROR: Function atomic | 234 ; CHECK: ERROR: Function atomic |
160 %a1 = alloca i8, i32 4 | 235 %a1 = alloca i8, i32 4 |
161 %ptr = inttoptr i32 0 to i32* | 236 %ptr = inttoptr i32 0 to i32* |
162 ; CHECK-NOT: disallowed | 237 ; CHECK-NOT: disallowed |
163 ; CHECK: disallowed: atomic load: {{.*}} load atomic | 238 ; CHECK: disallowed: atomic load: {{.*}} load atomic |
164 %a2 = load atomic i32* %ptr seq_cst, align 4 | 239 %a2 = load atomic i32* %ptr seq_cst, align 4 |
165 ; CHECK: disallowed: volatile load: {{.*}} load volatile | 240 ; CHECK: disallowed: volatile load: {{.*}} load volatile |
166 %a3 = load volatile i32* %ptr, align 4 | 241 %a3 = load volatile i32* %ptr, align 4 |
167 ; CHECK: disallowed: atomic store: store atomic | 242 ; CHECK: disallowed: atomic store: store atomic |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
342 define internal void @inline_asm() { | 417 define internal void @inline_asm() { |
343 ; CHECK: ERROR: Function inline_asm | 418 ; CHECK: ERROR: Function inline_asm |
344 call void asm "foo", ""() | 419 call void asm "foo", ""() |
345 ret void | 420 ret void |
346 } | 421 } |
347 ; CHECK-NOT: disallowed | 422 ; CHECK-NOT: disallowed |
348 ; CHECK: disallowed: inline assembly: call void asm "foo", ""() | 423 ; CHECK: disallowed: inline assembly: call void asm "foo", ""() |
349 | 424 |
350 ; CHECK-NOT: disallowed | 425 ; CHECK-NOT: disallowed |
351 ; If another check is added, there should be a check-not in between each check | 426 ; If another check is added, there should be a check-not in between each check |
OLD | NEW |