Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Side by Side Diff: unittest/IceParseInstsTest.cpp

Issue 848473002: Add instruction alignment tests to unit tests. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/PNaClTranslator.cpp ('K') | « src/PNaClTranslator.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« src/PNaClTranslator.cpp ('K') | « src/PNaClTranslator.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698