OLD | NEW |
---|---|
1 //===- llvm/unittest/Bitcode/NaClMungeWriteErrorTests.cpp -----------------===// | 1 //===- llvm/unittest/Bitcode/NaClMungeWriteErrorTests.cpp -----------------===// |
2 // Tests parser for PNaCl bitcode instructions. | 2 // Tests parser for PNaCl bitcode instructions. |
3 // | 3 // |
4 // The LLVM Compiler Infrastructure | 4 // The LLVM Compiler Infrastructure |
5 // | 5 // |
6 // This file is distributed under the University of Illinois Open Source | 6 // This file is distributed under the University of Illinois Open Source |
7 // License. See LICENSE.TXT for details. | 7 // License. See LICENSE.TXT for details. |
8 // | 8 // |
9 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// |
10 | 10 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
88 // Show that by default, one can't write a bad abbreviation index. | 88 // Show that by default, one can't write a bad abbreviation index. |
89 TEST(NaClMungeWriteErrorTests, CantWriteBadAbbrevIndex) { | 89 TEST(NaClMungeWriteErrorTests, CantWriteBadAbbrevIndex) { |
90 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | 90 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); |
91 EXPECT_FALSE(Munger.runTest(ARRAY(AbbrevIndex4VoidTypeEdit))); | 91 EXPECT_FALSE(Munger.runTest(ARRAY(AbbrevIndex4VoidTypeEdit))); |
92 EXPECT_EQ( | 92 EXPECT_EQ( |
93 "Error (Block 17): Uses illegal abbreviation index: 4: [2]\n" | 93 "Error (Block 17): Uses illegal abbreviation index: 4: [2]\n" |
94 "Error: Unable to generate bitcode file due to write errors\n", | 94 "Error: Unable to generate bitcode file due to write errors\n", |
95 Munger.getTestResults()); | 95 Munger.getTestResults()); |
96 } | 96 } |
97 | 97 |
98 // Show that we can't write more local abbreviations than specified in | 98 // Show that we use more local abbreviations than specified in the |
99 // the corresponding enclosing block. | 99 // corresponding enclosing block. |
100 TEST(NaClMungeWriteErrorTests, CantWriteTooManyLocalAbbreviations) { | 100 TEST(NaClMungeWriteErrorTests, CantWriteTooManyLocalAbbreviations) { |
101 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | 101 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); |
102 Munger.munge(ARRAY(UseLocalRetVoidAbbrevEdits)); | 102 Munger.munge(ARRAY(UseLocalRetVoidAbbrevEdits)); |
103 EXPECT_EQ( | 103 EXPECT_EQ( |
104 " 1: [65535, 8, 2]\n" | 104 " 1: [65535, 8, 2]\n" |
105 " 1: [65535, 17, 3]\n" | 105 " 1: [65535, 17, 3]\n" |
106 " 3: [1, 2]\n" | 106 " 3: [1, 2]\n" |
107 " 3: [2]\n" | 107 " 3: [2]\n" |
108 " 3: [21, 0, 0]\n" | 108 " 3: [21, 0, 0]\n" |
109 " 0: [65534]\n" | 109 " 0: [65534]\n" |
110 " 3: [8, 1, 0, 0, 0]\n" | 110 " 3: [8, 1, 0, 0, 0]\n" |
111 " 1: [65535, 12, 2]\n" | 111 " 1: [65535, 12, 2]\n" // Only allows 2 bits for abbrevs. |
112 " 3: [1, 1]\n" | 112 " 3: [1, 1]\n" |
113 " 2: [65533, 1, 1, 10]\n" | 113 " 2: [65533, 1, 1, 10]\n" // defines abbev 4: |
114 " 4: [10]\n" | 114 " 4: [10]\n" // can't use, 4 can't fit in two bits. |
115 " 0: [65534]\n" | 115 " 0: [65534]\n" |
116 " 0: [65534]\n", | 116 " 0: [65534]\n", |
117 stringify(Munger)); | 117 stringify(Munger)); |
118 | 118 |
119 EXPECT_FALSE(Munger.runTest()); | 119 EXPECT_FALSE(Munger.runTest()); |
120 EXPECT_EQ( | 120 EXPECT_EQ( |
121 "Error (Block 12): Exceeds abbreviation index limit of 3: 2: [65533," | 121 "Error (Block 12): Uses illegal abbreviation index: 4: [10]\n" |
122 " 1, 1, 10]\n" | |
123 "Error: Unable to generate bitcode file due to write errors\n", | 122 "Error: Unable to generate bitcode file due to write errors\n", |
124 Munger.getTestResults()); | 123 Munger.getTestResults()); |
125 } | 124 } |
126 | 125 |
127 // Show what happens when there are more enter blocks then exit blocks. | 126 // Show what happens when there are more enter blocks then exit blocks. |
128 TEST(NaClMungeWriteErrorTests, CantWriteTooManyEnterBlocks) { | 127 TEST(NaClMungeWriteErrorTests, CantWriteTooManyEnterBlocks) { |
129 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | 128 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); |
130 // Remove all but first two records (i.e. two enter blocks). | 129 // Remove all but first two records (i.e. two enter blocks). |
131 NaClMungedBitcode &MungedBitcode = Munger.getMungedBitcode(); | 130 NaClMungedBitcode &MungedBitcode = Munger.getMungedBitcode(); |
132 for (size_t i = 2; i < MungedBitcode.getBaseRecords().size(); ++i) { | 131 for (size_t i = 2; i < MungedBitcode.getBaseRecords().size(); ++i) { |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
252 "Error \\(Block 17\\)\\: Uses illegal abbreviation index\\: 4\\: \\[2\\]" | 251 "Error \\(Block 17\\)\\: Uses illegal abbreviation index\\: 4\\: \\[2\\]" |
253 ".*" | 252 ".*" |
254 // Corresponding error while parsing. | 253 // Corresponding error while parsing. |
255 "Fatal\\(35\\:0)\\: Invalid abbreviation \\# 4 defined for record" | 254 "Fatal\\(35\\:0)\\: Invalid abbreviation \\# 4 defined for record" |
256 ".*" | 255 ".*" |
257 // Output of report_fatal_error. | 256 // Output of report_fatal_error. |
258 "LLVM ERROR\\: Unable to continue" | 257 "LLVM ERROR\\: Unable to continue" |
259 ".*"); | 258 ".*"); |
260 } | 259 } |
261 | 260 |
261 // Show that we check that the abbreviation actually applies to the | |
262 // record associated with that abbreviation. Also shows that we repair | |
263 // the problem by applying the default abbreviation instead. | |
264 TEST(NaClMungeWriteErrorsTests, TestMismatchedAbbreviation) { | |
265 // Create edits to: | |
266 // 1) Expand the number of abbreviation index bits for the block from 2 to 3. | |
267 // 2) Introduce the incorrect abbreviation for the return instruction. | |
268 // i.e. [9] instead of [10]. | |
269 // 3) Apply the bad abbreviation to record "ret" | |
270 const uint64_t FunctionEnterIndex = 7; | |
271 const uint64_t Edits[] { | |
272 FunctionEnterIndex, NaClMungedBitcode::Replace, | |
273 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 3, Terminator, | |
274 RetVoidIndex, NaClMungedBitcode::AddBefore, | |
275 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, 1, | |
276 naclbitc::FUNC_CODE_INST_RET - 1, Terminator, | |
277 RetVoidIndex, NaClMungedBitcode::Replace, | |
278 4, naclbitc::FUNC_CODE_INST_RET, Terminator | |
279 }; | |
280 | |
281 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | |
282 Munger.munge(ARRAY(Edits)); | |
283 EXPECT_EQ( | |
284 " 1: [65535, 8, 2]\n" | |
285 " 1: [65535, 17, 3]\n" | |
286 " 3: [1, 2]\n" | |
287 " 3: [2]\n" | |
288 " 3: [21, 0, 0]\n" | |
289 " 0: [65534]\n" | |
290 " 3: [8, 1, 0, 0, 0]\n" | |
291 " 1: [65535, 12, 3]\n" // Upped abbreviation index bits to 3 | |
292 " 3: [1, 1]\n" | |
293 " 2: [65533, 1, 1, 9]\n" // added abbrev 4: [9] | |
294 " 4: [10]\n" // "ret" with bad abbreviation. | |
295 " 0: [65534]\n" | |
296 " 0: [65534]\n", | |
297 stringify(Munger)); | |
298 | |
299 // Show detected error | |
300 EXPECT_FALSE(Munger.runTest()); | |
301 EXPECT_EQ( | |
302 "Error (Block 12): Abbreviation doesn't apply to record: 4: [10]\n" | |
303 "Error: Unable to generate bitcode file due to write errors\n", | |
304 Munger.getTestResults()); | |
305 | |
306 // Show that the writer can recover. | |
307 Munger.setTryToRecoverOnWrite(true); | |
308 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); | |
309 EXPECT_EQ( | |
310 "Error (Block 12): Abbreviation doesn't apply to record: 4: [10]\n" | |
311 " 1: [65535, 8, 2]\n" | |
312 " 1: [65535, 17, 3]\n" | |
313 " 3: [1, 2]\n" | |
314 " 3: [2]\n" | |
315 " 3: [21, 0, 0]\n" | |
316 " 0: [65534]\n" | |
317 " 3: [8, 1, 0, 0, 0]\n" | |
318 " 1: [65535, 12, 3]\n" | |
319 " 3: [1, 1]\n" | |
320 " 2: [65533, 1, 1, 9]\n" | |
321 " 3: [10]\n" // Implicit repair here. | |
322 " 0: [65534]\n" | |
323 " 0: [65534]\n", | |
324 Munger.getTestResults()); | |
325 } | |
326 | |
327 // Show that we recognize when an abbreviation definition record is | |
328 // malformed. Also show that we repair the problem by removing the | |
329 // definition. | |
330 TEST(NaClMungeWriteErrorsTests, TestWritingMalformedAbbreviation) { | |
331 // Create edits to: | |
332 // 1) Expand the number of abbreviation index bits for the block from 2 to 3. | |
333 // 2) Leave out the "literal" operand encoding out. | |
334 const uint64_t FunctionEnterIndex = 7; | |
335 const uint64_t Edits[] { | |
336 FunctionEnterIndex, NaClMungedBitcode::Replace, // Set Abbrev bits = 3 | |
337 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 3, Terminator, | |
338 RetVoidIndex, NaClMungedBitcode::AddBefore, | |
339 // Bad abbreviation! Intentionally leave out "literal" operand: 1 | |
340 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, // 1, | |
341 naclbitc::FUNC_CODE_INST_RET, Terminator, | |
342 }; | |
343 | |
344 // Show that the error is detected. | |
345 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | |
346 EXPECT_FALSE(Munger.runTest(ARRAY(Edits))); | |
347 EXPECT_EQ( | |
348 "Error (Block 12): Error: Bad abbreviation operand encoding 10:" | |
349 " 2: [65533, 1, 10]\n" | |
350 "Error: Unable to generate bitcode file due to write errors\n", | |
351 Munger.getTestResults()); | |
352 | |
353 // Show that the writer can recover. | |
354 Munger.setTryToRecoverOnWrite(true); | |
355 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); | |
356 EXPECT_EQ( | |
357 "Error (Block 12): Error: Bad abbreviation operand encoding 10: " | |
358 "2: [65533, 1, 10]\n" | |
359 " 1: [65535, 8, 2]\n" | |
360 " 1: [65535, 17, 3]\n" | |
361 " 3: [1, 2]\n" | |
362 " 3: [2]\n" | |
363 " 3: [21, 0, 0]\n" | |
364 " 0: [65534]\n" | |
365 " 3: [8, 1, 0, 0, 0]\n" | |
366 " 1: [65535, 12, 3]\n" // Note: not followed by abbreviation def. | |
367 " 3: [1, 1]\n" | |
368 " 3: [10]\n" | |
369 " 0: [65534]\n" | |
370 " 0: [65534]\n", | |
371 Munger.getTestResults()); | |
372 } | |
373 | |
374 // Show how we deal with additional abbreviations defined for a block, | |
375 // once a bad abbreviation definition record is found. That is, we | |
376 // remove all succeeding abbreviations definitions for that block. In | |
377 // addition, any record refering to a remove abbreviation is changed | |
378 // to use the default abbreviation. | |
379 TEST(NaClMungedWriteErrorTests, TestRemovingAbbrevWithMultAbbrevs) { | |
380 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | |
381 const uint64_t FunctionEnterIndex = 7; | |
382 const uint64_t Edits[] { | |
383 FunctionEnterIndex, NaClMungedBitcode::Replace, // Set Abbrev bits = 3 | |
384 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 3, Terminator, | |
385 RetVoidIndex, NaClMungedBitcode::AddBefore, // bad abbreviation! | |
386 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, // 1, | |
387 naclbitc::FUNC_CODE_INST_RET - 1, Terminator, | |
388 RetVoidIndex, NaClMungedBitcode::AddBefore, // good abbreviation to ignore. | |
389 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, 1, | |
390 naclbitc::FUNC_CODE_INST_RET, Terminator, | |
391 RetVoidIndex, NaClMungedBitcode::Replace, // reference to good abreviation. | |
392 5, naclbitc::FUNC_CODE_INST_RET, Terminator | |
393 }; | |
394 | |
395 Munger.setTryToRecoverOnWrite(true); | |
396 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); | |
397 EXPECT_EQ( | |
398 "Error (Block 12): Error: Bad abbreviation operand encoding 9:" | |
399 " 2: [65533, 1, 9]\n" | |
400 "Error (Block 12): Ignoring abbreviation: 2: [65533, 1, 1, 10]\n" | |
401 "Error (Block 12): Uses illegal abbreviation index: 5: [10]\n" | |
402 " 1: [65535, 8, 2]\n" | |
403 " 1: [65535, 17, 3]\n" | |
404 " 3: [1, 2]\n" | |
405 " 3: [2]\n" | |
406 " 3: [21, 0, 0]\n" | |
407 " 0: [65534]\n" | |
408 " 3: [8, 1, 0, 0, 0]\n" | |
409 " 1: [65535, 12, 3]\n" | |
410 " 3: [1, 1]\n" | |
411 " 3: [10]\n" // Abbreviation index 5 replaced with default. | |
412 " 0: [65534]\n" | |
413 " 0: [65534]\n", | |
414 Munger.getTestResults()); | |
415 } | |
416 | |
262 // Show that error recovery works when writing an illegal abbreviation | 417 // Show that error recovery works when writing an illegal abbreviation |
263 // index. Show success by parsing fixed bitcode. | 418 // index. Show success by parsing fixed bitcode. |
264 TEST(NaClMungeWriteErrorTests, RecoverWhenParsingBadAbbrevIndex) { | 419 TEST(NaClMungeWriteErrorTests, RecoverWhenParsingBadAbbrevIndex) { |
265 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); | 420 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
266 Munger.setTryToRecoverOnWrite(true); | 421 Munger.setTryToRecoverOnWrite(true); |
267 EXPECT_TRUE( | 422 EXPECT_TRUE( |
268 Munger.runTest(ARRAY(AbbrevIndex4VoidTypeEdit), true)); | 423 Munger.runTest(ARRAY(AbbrevIndex4VoidTypeEdit), true)); |
269 EXPECT_EQ( | 424 EXPECT_EQ( |
270 "Error (Block 17): Uses illegal abbreviation index: 4: [2]\n" | 425 "Error (Block 17): Uses illegal abbreviation index: 4: [2]\n" |
271 "Successful parse!\n", | 426 "Successful parse!\n", |
(...skipping 13 matching lines...) Expand all Loading... | |
285 } | 440 } |
286 | 441 |
287 // Show that error recovery works when writing too many locally | 442 // Show that error recovery works when writing too many locally |
288 // defined abbreviations for the corresponding number of bits defined | 443 // defined abbreviations for the corresponding number of bits defined |
289 // in the corresponding enter block. Show success by dumping the fixed | 444 // in the corresponding enter block. Show success by dumping the fixed |
290 // bitcode. | 445 // bitcode. |
291 TEST(NaClMungeWriteErrorTests, RecoverTooManyLocalAbbreviations) { | 446 TEST(NaClMungeWriteErrorTests, RecoverTooManyLocalAbbreviations) { |
292 NaClObjDumpMunger Munger(ARRAY_TERM(BitcodeRecords)); | 447 NaClObjDumpMunger Munger(ARRAY_TERM(BitcodeRecords)); |
293 Munger.setTryToRecoverOnWrite(true); | 448 Munger.setTryToRecoverOnWrite(true); |
294 Munger.munge(ARRAY(UseLocalRetVoidAbbrevEdits)); | 449 Munger.munge(ARRAY(UseLocalRetVoidAbbrevEdits)); |
295 | |
296 EXPECT_TRUE(Munger.runTest()); | 450 EXPECT_TRUE(Munger.runTest()); |
297 std::string Results( | |
298 "Error (Block 12): Exceeds abbreviation index limit of 3: 2:" | |
299 " [65533, 1, 1, 10]\n" | |
300 "Error (Block 12): Uses illegal abbreviation index: 4: [10]\n"); | |
301 Results.append(ExpectedDump); | |
302 EXPECT_EQ( | 451 EXPECT_EQ( |
303 Results, | 452 "Error (Block 12): Uses illegal abbreviation index: 4: [10]\n" |
453 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE'" | |
454 " (80, 69, 88, 69)\n" | |
455 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" | |
456 " | 0> |\n" | |
457 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" | |
458 " 24:0| 1: <65535, 17, 3> | types { // BlockID = 17\n" | |
459 " 32:0| 3: <1, 2> | count 2;\n" | |
460 " 34:5| 3: <2> | @t0 = void;\n" | |
461 " 36:4| 3: <21, 0, 0> | @t1 = void ();\n" | |
462 " 39:7| 0: <65534> | }\n" | |
463 " 44:0| 3: <8, 1, 0, 0, 0> | define external void @f0();\n" | |
464 // Block only spefies 2 bits for abbreviations (i.e. limit = 3). | |
jvoung (off chromium)
2015/05/21 20:57:59
spefies -> specifies
Karl
2015/05/22 15:30:43
Done.
| |
465 " 48:6| 1: <65535, 12, 2> | function void @f0() { \n" | |
466 " | | // BlockID" | |
467 " = 12\n" | |
468 " 56:0| 3: <1, 1> | blocks 1;\n" | |
469 // Added abbreviation. Defines abbreviation index 4. | |
470 " 58:4| 2: <65533, 1, 1, 10> | %a0 = abbrev <10>;\n" | |
471 " | | %b0:\n" | |
472 // Repaired abbreviation index of 4 (now 3). | |
473 " 60:4| 3: <10> | ret void;\n" | |
474 " 62:2| 0: <65534> | }\n" | |
475 " 64:0|0: <65534> |}\n", | |
304 Munger.getTestResults()); | 476 Munger.getTestResults()); |
305 } | 477 } |
306 | 478 |
307 // Show that error recovery works when writing and there are more | 479 // Show that error recovery works when writing and there are more |
308 // enter blocks than exit blocks. Show success by dumping fixed | 480 // enter blocks than exit blocks. Show success by dumping fixed |
309 // bitcode. | 481 // bitcode. |
310 TEST(NaClMungeWriteErrorTests, RecoverTooManyEnterBlocks) { | 482 TEST(NaClMungeWriteErrorTests, RecoverTooManyEnterBlocks) { |
311 NaClObjDumpMunger Munger(ARRAY_TERM(BitcodeRecords)); | 483 NaClObjDumpMunger Munger(ARRAY_TERM(BitcodeRecords)); |
312 // Remove all but first two records (i.e. two enter blocks). | 484 // Remove all but first two records (i.e. two enter blocks). |
313 NaClMungedBitcode &MungedBitcode = Munger.getMungedBitcode(); | 485 NaClMungedBitcode &MungedBitcode = Munger.getMungedBitcode(); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
383 " 3: [10]\n" | 555 " 3: [10]\n" |
384 " 0: [65534]\n" | 556 " 0: [65534]\n" |
385 " 0: [65534]\n" | 557 " 0: [65534]\n" |
386 " 1: [65535, 4294967295, 3]\n" | 558 " 1: [65535, 4294967295, 3]\n" |
387 " 3: [1, 4]\n" | 559 " 3: [1, 4]\n" |
388 " 0: [65534]\n", | 560 " 0: [65534]\n", |
389 Munger.getTestResults()); | 561 Munger.getTestResults()); |
390 } | 562 } |
391 | 563 |
392 } // end of namespace naclmungetest | 564 } // end of namespace naclmungetest |
OLD | NEW |