OLD | NEW |
---|---|
1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// | 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 | 9 |
10 #include "llvm/ADT/STLExtras.h" | 10 #include "llvm/ADT/STLExtras.h" |
(...skipping 24 matching lines...) Expand all Loading... | |
35 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 35 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
36 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 36 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
37 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 37 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
38 // Note: 100 is a bad value index in next line. | 38 // Note: 100 is a bad value index in next line. |
39 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 39 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
40 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 40 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
41 0, naclbitc::BLK_CODE_EXIT, Terminator, | 41 0, naclbitc::BLK_CODE_EXIT, Terminator, |
42 0, naclbitc::BLK_CODE_EXIT, Terminator | 42 0, naclbitc::BLK_CODE_EXIT, Terminator |
43 }; | 43 }; |
44 | 44 |
45 | |
46 // Show bitcode objdump for BitcodeRecords. | 45 // Show bitcode objdump for BitcodeRecords. |
47 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 46 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
48 array_lengthof(BitcodeRecords), Terminator); | 47 array_lengthof(BitcodeRecords), Terminator); |
49 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); | 48 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); |
50 EXPECT_EQ( | 49 EXPECT_EQ( |
51 "module { // BlockID = 8\n" | 50 "module { // BlockID = 8\n" |
52 " types { // BlockID = 17\n" | 51 " types { // BlockID = 17\n" |
53 " count 3;\n" | 52 " count 3;\n" |
54 " @t0 = i32;\n" | 53 " @t0 = i32;\n" |
55 " @t1 = void;\n" | 54 " @t1 = void;\n" |
(...skipping 13 matching lines...) Expand all Loading... | |
69 | 68 |
70 // Show that we get appropriate error when parsing in Subzero. | 69 // Show that we get appropriate error when parsing in Subzero. |
71 IceTest::SubzeroBitcodeMunger Munger( | 70 IceTest::SubzeroBitcodeMunger Munger( |
72 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 71 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
73 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); | 72 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); |
74 EXPECT_EQ( | 73 EXPECT_EQ( |
75 "Error: (66:4) Invalid function record: <34 0 4 2 100>\n", | 74 "Error: (66:4) Invalid function record: <34 0 4 2 100>\n", |
76 Munger.getTestResults()); | 75 Munger.getTestResults()); |
77 } | 76 } |
78 | 77 |
78 /// Test how we recognize alignments in alloca instructions. | |
79 TEST(IceParseInstsTests, AllocaAlignment) { | |
80 const uint64_t BitcodeRecords[] = { | |
81 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
82 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
83 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | |
84 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
85 3, naclbitc::TYPE_CODE_VOID, Terminator, | |
86 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | |
87 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | |
88 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
89 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | |
90 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
91 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
92 // Note: alignment stored as 0 or log2(Alignment)+1. | |
93 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 1, Terminator, | |
94 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | |
95 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
96 0, naclbitc::BLK_CODE_EXIT, Terminator}; | |
97 | |
98 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | |
99 | |
100 // Show text when alignment is 1. | |
101 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | |
102 Terminator); | |
103 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 1")); | |
104 EXPECT_EQ("module { // BlockID = 8\n" | |
105 " types { // BlockID = 17\n" | |
106 " count 4;\n" | |
107 " @t0 = i32;\n" | |
108 " @t1 = void;\n" | |
109 " @t2 = void (i32);\n" | |
110 " @t3 = i8;\n" | |
111 " }\n" | |
112 " define external void @f0(i32);\n" | |
113 " function void @f0(i32 %p0) { // BlockID = 12\n" | |
114 " blocks 1;\n" | |
115 " %b0:\n" | |
116 " %v0 = alloca i8, i32 %p0, align 1;\n" | |
117 " ret void;\n" | |
118 " }\n" | |
119 "}\n", | |
120 DumpMunger.getTestResults()); | |
121 | |
122 // Show that we can handle alignment of 1. | |
123 IceTest::SubzeroBitcodeMunger Munger( | |
124 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | |
125 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); | |
126 | |
127 // Show what happens when changing alignment to 0. | |
128 const uint64_t Align0[] = { | |
129 ReplaceIndex, NaClBitcodeMunger::Replace, | |
130 // Note: alignment stored as 0 or log2(Alignment)+1. | |
131 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 0, Terminator, | |
132 }; | |
133 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, | |
134 array_lengthof(Align0))); | |
135 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, | |
136 array_lengthof(Align0))); | |
137 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | |
138 DumpMunger.getLinesWithSubstring("alloca")); | |
139 | |
140 // Show what happens when changing alignment to 2**30. | |
141 const uint64_t Align30[] = { | |
142 ReplaceIndex, NaClBitcodeMunger::Replace, | |
143 // Note: alignment stored as 0 or log2(Alignment)+1. | |
jvoung (off chromium)
2015/01/12 18:10:06
Nit: probably don't need to repeat the note about
Karl
2015/01/14 22:03:07
Done.
| |
144 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 31, Terminator, | |
145 }; | |
146 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, | |
147 array_lengthof(Align30))); | |
148 EXPECT_EQ("Error: (62:4) Invalid function record: <19 1 31>\n", | |
149 Munger.getTestResults()); | |
150 | |
151 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, | |
152 array_lengthof(Align30))); | |
153 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | |
154 DumpMunger.getLinesWithSubstring("alloca")); | |
155 EXPECT_EQ( | |
156 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | |
157 DumpMunger.getLinesWithSubstring("Error")); | |
158 | |
159 // Show what happens when changing alignment to 2**29. | |
160 const uint64_t Align29[] = { | |
161 ReplaceIndex, NaClBitcodeMunger::Replace, | |
162 // Note: alignment stored as 0 or log2(Alignment)+1. | |
163 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 30, Terminator, | |
164 }; | |
165 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, | |
166 array_lengthof(Align29))); | |
167 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, | |
168 array_lengthof(Align29))); | |
169 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", | |
170 DumpMunger.getLinesWithSubstring("alloca")); | |
171 } | |
172 | |
173 // Test how we recognize alignments in load i32 instructions. | |
174 TEST(IceParseInstsTests, LoadI32Alignment) { | |
175 const uint64_t BitcodeRecords[] = { | |
176 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
177 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
178 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, | |
179 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
180 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, | |
181 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
182 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, | |
183 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
184 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
185 // Note: alignment stored as 0 or log2(Alignment)+1. | |
186 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 1, 0, Terminator, | |
187 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | |
188 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
189 0, naclbitc::BLK_CODE_EXIT, Terminator}; | |
190 | |
191 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | |
192 | |
193 // Show text when alignment is 1. | |
194 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | |
195 Terminator); | |
196 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load i32 alignment 1")); | |
197 EXPECT_EQ("module { // BlockID = 8\n" | |
198 " types { // BlockID = 17\n" | |
199 " count 2;\n" | |
200 " @t0 = i32;\n" | |
201 " @t1 = i32 (i32);\n" | |
202 " }\n" | |
203 " define external i32 @f0(i32);\n" | |
204 " function i32 @f0(i32 %p0) { // BlockID = 12\n" | |
205 " blocks 1;\n" | |
206 " %b0:\n" | |
207 " %v0 = load i32* %p0, align 1;\n" | |
208 " ret i32 %v0;\n" | |
209 " }\n" | |
210 "}\n", | |
211 DumpMunger.getTestResults()); | |
212 IceTest::SubzeroBitcodeMunger Munger( | |
213 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | |
214 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); | |
215 | |
216 // Show what happens when changing alignment to 0. | |
217 const uint64_t Align0[] = { | |
218 ReplaceIndex, NaClBitcodeMunger::Replace, | |
219 // Note: alignment stored as 0 or log2(Alignment)+1. | |
220 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 0, 0, Terminator, | |
221 }; | |
222 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, | |
223 array_lengthof(Align0))); | |
224 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | |
225 Munger.getTestResults()); | |
226 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, | |
227 array_lengthof(Align0))); | |
228 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | |
229 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | |
230 DumpMunger.getLinesWithSubstring("load")); | |
231 | |
232 // Show what happens when changing alignment to 4. | |
233 const uint64_t Align4[] = { | |
234 ReplaceIndex, NaClBitcodeMunger::Replace, | |
235 // Note: alignment stored as 0 or log2(Alignment)+1. | |
236 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 3, 0, Terminator, | |
237 }; | |
238 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, | |
239 array_lengthof(Align4))); | |
240 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 3 0>\n", | |
241 Munger.getTestResults()); | |
242 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, | |
243 array_lengthof(Align4))); | |
244 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" | |
245 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | |
246 DumpMunger.getLinesWithSubstring("load")); | |
247 | |
248 // Show what happens when changing alignment to 2**29. | |
249 const uint64_t Align29[] = { | |
250 ReplaceIndex, NaClBitcodeMunger::Replace, | |
251 // Note: alignment stored as 0 or log2(Alignment)+1. | |
252 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 30, 0, Terminator, | |
253 }; | |
254 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, | |
255 array_lengthof(Align29))); | |
256 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | |
257 Munger.getTestResults()); | |
258 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", | |
259 Align29, array_lengthof(Align29))); | |
260 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" | |
261 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | |
262 DumpMunger.getLinesWithSubstring("load")); | |
263 | |
264 // Show what happens when changing alignment to 2**30. | |
265 const uint64_t Align30[] = { | |
266 ReplaceIndex, NaClBitcodeMunger::Replace, | |
267 // Note: alignment stored as 0 or log2(Alignment)+1. | |
268 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 31, 0, Terminator, | |
269 }; | |
270 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, | |
271 array_lengthof(Align30))); | |
272 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | |
273 Munger.getTestResults()); | |
274 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", | |
275 Align30, array_lengthof(Align30))); | |
276 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | |
277 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | |
278 DumpMunger.getLinesWithSubstring("load")); | |
279 } | |
280 | |
281 // Test how we recognize alignments in load float instructions. | |
282 TEST(IceParseInstsTests, LoadFloatAlignment) { | |
283 const uint64_t BitcodeRecords[] = { | |
284 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
285 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
286 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | |
287 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | |
288 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
289 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, Terminator, | |
290 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
291 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | |
292 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
293 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
294 // Note: alignment stored as 0 or log2(Alignment)+1. | |
295 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 1, 0, Terminator, | |
296 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | |
297 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
298 0, naclbitc::BLK_CODE_EXIT, Terminator}; | |
299 | |
300 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD | |
301 | |
302 // Show text when alignment is 1. | |
303 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | |
304 Terminator); | |
305 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 1")); | |
306 EXPECT_EQ("module { // BlockID = 8\n" | |
307 " types { // BlockID = 17\n" | |
308 " count 3;\n" | |
309 " @t0 = float;\n" | |
310 " @t1 = i32;\n" | |
311 " @t2 = float (i32);\n" | |
312 " }\n" | |
313 " define external float @f0(i32);\n" | |
314 " function float @f0(i32 %p0) { // BlockID = 12\n" | |
315 " blocks 1;\n" | |
316 " %b0:\n" | |
317 " %v0 = load float* %p0, align 1;\n" | |
318 " ret float %v0;\n" | |
319 " }\n" | |
320 "}\n", | |
321 DumpMunger.getTestResults()); | |
322 IceTest::SubzeroBitcodeMunger Munger( | |
323 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | |
324 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); | |
325 | |
326 // Show what happens when changing alignment to 0. | |
327 const uint64_t Align0[] = { | |
328 ReplaceIndex, NaClBitcodeMunger::Replace, | |
329 // Note: alignment stored as 0 or log2(Alignment)+1. | |
330 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 0, 0, Terminator, | |
331 }; | |
332 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, | |
333 array_lengthof(Align0))); | |
334 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | |
335 Munger.getTestResults()); | |
336 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", | |
337 Align0, array_lengthof(Align0))); | |
338 EXPECT_EQ(" %v0 = load float* %p0, align 0;\n" | |
339 "Error(58:4): load: Illegal alignment for float. Expects: 4\n", | |
340 DumpMunger.getLinesWithSubstring("load")); | |
341 | |
342 // Show what happens when changing alignment to 4. | |
343 const uint64_t Align4[] = { | |
344 ReplaceIndex, NaClBitcodeMunger::Replace, | |
345 // Note: alignment stored as 0 or log2(Alignment)+1. | |
346 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 3, 0, Terminator, | |
347 }; | |
348 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, | |
349 array_lengthof(Align4))); | |
350 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", | |
351 Align4, array_lengthof(Align4))); | |
352 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | |
353 DumpMunger.getLinesWithSubstring("load")); | |
354 | |
355 // Show what happens when changing alignment to 2**29. | |
356 const uint64_t Align29[] = { | |
357 ReplaceIndex, NaClBitcodeMunger::Replace, | |
358 // Note: alignment stored as 0 or log2(Alignment)+1. | |
359 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 30, 0, Terminator, | |
360 }; | |
361 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, | |
362 array_lengthof(Align29))); | |
363 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | |
364 Munger.getTestResults()); | |
365 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", | |
366 Align29, array_lengthof(Align29))); | |
367 EXPECT_EQ(" %v0 = load float* %p0, align 536870912;\n" | |
368 "Error(58:4): load: Illegal alignment for float. Expects: 4\n", | |
369 DumpMunger.getLinesWithSubstring("load")); | |
370 | |
371 // Show what happens when changing alignment to 2**30. | |
372 const uint64_t Align30[] = { | |
373 ReplaceIndex, NaClBitcodeMunger::Replace, | |
374 // Note: alignment stored as 0 or log2(Alignment)+1. | |
375 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 31, 0, Terminator, | |
376 }; | |
377 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, | |
378 array_lengthof(Align30))); | |
379 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | |
380 Munger.getTestResults()); | |
381 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", | |
382 Align30, array_lengthof(Align30))); | |
383 EXPECT_EQ(" %v0 = load float* %p0, align 0;\n" | |
384 "Error(58:4): load: Illegal alignment for float. Expects: 4\n", | |
385 DumpMunger.getLinesWithSubstring("load")); | |
386 } | |
387 | |
388 // Test how we recognize alignments in store instructions. | |
389 TEST(NaClParseInstsTests, StoreAlignment) { | |
390 const uint64_t BitcodeRecords[] = { | |
391 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
392 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
393 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | |
394 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | |
395 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
396 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, | |
397 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
398 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | |
399 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
400 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
401 // Note: alignment stored as 0 or log2(Alignment)+1. | |
402 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 1, Terminator, | |
403 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | |
404 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
405 0, naclbitc::BLK_CODE_EXIT, Terminator}; | |
406 | |
407 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD | |
jvoung (off chromium)
2015/01/12 18:10:06
STORE
Karl
2015/01/14 22:03:07
Done.
| |
408 | |
409 // Show text when alignment is 1. | |
410 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | |
411 Terminator); | |
412 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good Store Alignment 1")); | |
413 EXPECT_EQ("module { // BlockID = 8\n" | |
414 " types { // BlockID = 17\n" | |
415 " count 3;\n" | |
416 " @t0 = float;\n" | |
417 " @t1 = i32;\n" | |
418 " @t2 = float (i32, float);\n" | |
419 " }\n" | |
420 " define external float @f0(i32, float);\n" | |
421 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" | |
422 " blocks 1;\n" | |
423 " %b0:\n" | |
424 " store float %p1, float* %p0, align 1;\n" | |
425 " ret float %p1;\n" | |
426 " }\n" | |
427 "}\n", | |
428 DumpMunger.getTestResults()); | |
429 IceTest::SubzeroBitcodeMunger Munger( | |
430 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | |
431 EXPECT_TRUE(Munger.runTest("Good store alignment")); | |
432 | |
433 // Show what happens when changing alignment to 0. | |
434 const uint64_t Align0[] = { | |
435 ReplaceIndex, NaClBitcodeMunger::Replace, | |
436 // Note: alignment stored as 0 or log2(Alignment)+1. | |
437 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 0, Terminator, | |
438 }; | |
439 EXPECT_FALSE( | |
440 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); | |
441 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 0>\n", | |
442 Munger.getTestResults()); | |
443 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, | |
444 array_lengthof(Align0))); | |
445 EXPECT_EQ(" store float %p1, float* %p0, align 0;\n" | |
446 "Error(62:4): store: Illegal alignment for float. Expects: 4\n", | |
447 DumpMunger.getLinesWithSubstring("store")); | |
448 | |
449 // Show what happens when changing alignment to 4. | |
450 const uint64_t Align4[] = { | |
451 ReplaceIndex, NaClBitcodeMunger::Replace, | |
452 // Note: alignment stored as 0 or log2(Alignment)+1. | |
453 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 3, Terminator, | |
454 }; | |
455 EXPECT_TRUE( | |
456 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); | |
457 EXPECT_TRUE(DumpMunger.runTestForAssembly("Bad store alignment 4", Align4, | |
jvoung (off chromium)
2015/01/12 18:10:06
Shouldn't be "Bad" if it returns true
Karl
2015/01/14 22:03:07
Done.
| |
458 array_lengthof(Align4))); | |
459 | |
460 // Show what happens when changing alignment to 8. | |
461 const uint64_t Align8[] = { | |
462 ReplaceIndex, NaClBitcodeMunger::Replace, | |
463 // Note: alignment stored as 0 or log2(Alignment)+1. | |
464 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 4, Terminator, | |
465 }; | |
466 EXPECT_FALSE( | |
467 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); | |
468 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 4>\n", | |
469 Munger.getTestResults()); | |
470 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, | |
471 array_lengthof(Align8))); | |
472 EXPECT_EQ(" store float %p1, float* %p0, align 8;\n" | |
473 "Error(62:4): store: Illegal alignment for float. Expects: 4\n", | |
jvoung (off chromium)
2015/01/12 18:10:06
I guess technically 4 or 1 =)
Karl
2015/01/14 22:03:08
Acknowledged.
This problem needs to be fixed in L
| |
474 DumpMunger.getLinesWithSubstring("store")); | |
475 | |
476 // Show what happens when changing alignment to 2**29. | |
477 const uint64_t Align29[] = { | |
478 ReplaceIndex, NaClBitcodeMunger::Replace, | |
479 // Note: alignment stored as 0 or log2(Alignment)+1. | |
480 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 30, Terminator, | |
481 }; | |
482 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, | |
483 array_lengthof(Align29))); | |
484 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 30>\n", | |
485 Munger.getTestResults()); | |
486 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, | |
487 array_lengthof(Align29))); | |
488 EXPECT_EQ(" store float %p1, float* %p0, align 536870912;\n" | |
489 "Error(62:4): store: Illegal alignment for float. Expects: 4\n", | |
490 DumpMunger.getLinesWithSubstring("store")); | |
491 | |
492 // Show what happens when changing alignment to 2**30. | |
493 const uint64_t Align30[] = { | |
494 ReplaceIndex, NaClBitcodeMunger::Replace, | |
495 // Note: alignment stored as 0 or log2(Alignment)+1. | |
496 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 31, Terminator, | |
497 }; | |
498 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, | |
499 array_lengthof(Align30))); | |
500 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 31>\n", | |
501 Munger.getTestResults()); | |
502 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, | |
503 array_lengthof(Align30))); | |
504 EXPECT_EQ(" store float %p1, float* %p0, align 0;\n" | |
505 "Error(62:4): store: Illegal alignment for float. Expects: 4\n", | |
506 DumpMunger.getLinesWithSubstring("store")); | |
507 } | |
508 | |
79 } // end of anonymous namespace | 509 } // end of anonymous namespace |
OLD | NEW |