Chromium Code Reviews| 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 20 matching lines...) Expand all Loading... | |
| 31 0, naclbitc::BLK_CODE_EXIT, Terminator, | 31 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 32 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, | 32 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, |
| 33 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 33 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 34 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 34 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 35 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 35 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 36 0, naclbitc::BLK_CODE_EXIT, Terminator, | 36 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 37 0, naclbitc::BLK_CODE_EXIT, Terminator | 37 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 38 }; | 38 }; |
| 39 | 39 |
| 40 // Expected output when bitcode records are dumped. | 40 // Expected output when bitcode records are dumped. |
| 41 const char* ExpectedDump = | 41 const char *ExpectedDump = |
| 42 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " | 42 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
| 43 "88, 69)\n" | 43 "88, 69)\n" |
| 44 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" | 44 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
| 45 " | 0> |\n" | 45 " | 0> |\n" |
| 46 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" | 46 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
| 47 " 24:0| 1: <65535, 17, 3> | types { // BlockID = 17\n" | 47 " 24:0| 1: <65535, 17, 3> | types { // BlockID = 17\n" |
| 48 " 32:0| 3: <1, 2> | count 2;\n" | 48 " 32:0| 3: <1, 2> | count 2;\n" |
| 49 " 34:5| 3: <2> | @t0 = void;\n" | 49 " 34:5| 3: <2> | @t0 = void;\n" |
| 50 " 36:4| 3: <21, 0, 0> | @t1 = void ();\n" | 50 " 36:4| 3: <21, 0, 0> | @t1 = void ();\n" |
| 51 " 39:7| 0: <65534> | }\n" | 51 " 39:7| 0: <65534> | }\n" |
| 52 " 44:0| 3: <8, 1, 0, 0, 0> | define external void @f0();\n" | 52 " 44:0| 3: <8, 1, 0, 0, 0> | define external void @f0();\n" |
| 53 " 48:6| 1: <65535, 12, 2> | function void @f0() { \n" | 53 " 48:6| 1: <65535, 12, 2> | function void @f0() { \n" |
| 54 " | | // BlockID " | 54 " | | // BlockID " |
| 55 "= 12\n" | 55 "= 12\n" |
| 56 " 56:0| 3: <1, 1> | blocks 1;\n" | 56 " 56:0| 3: <1, 1> | blocks 1;\n" |
| 57 " | | %b0:\n" | 57 " | | %b0:\n" |
| 58 " 58:4| 3: <10> | ret void;\n" | 58 " 58:4| 3: <10> | ret void;\n" |
| 59 " 60:2| 0: <65534> | }\n" | 59 " 60:2| 0: <65534> | }\n" |
| 60 " 64:0|0: <65534> |}\n" | 60 " 64:0|0: <65534> |}\n" |
| 61 ; | 61 ; |
| 62 | 62 |
| 63 // Same as above, but just the records as generated by NaClWriteMunger. | |
|
jvoung (off chromium)
2015/05/27 20:09:37
I don't see a class named NaClWriteMunger.
Karl
2015/05/28 20:50:31
I was trying to clarify what tool generated the ou
| |
| 64 const char *ExpectedRecords = | |
| 65 " 1: [65535, 8, 2]\n" | |
| 66 " 1: [65535, 17, 3]\n" | |
| 67 " 3: [1, 2]\n" | |
| 68 " 3: [2]\n" | |
| 69 " 3: [21, 0, 0]\n" | |
| 70 " 0: [65534]\n" | |
| 71 " 3: [8, 1, 0, 0, 0]\n" | |
| 72 " 1: [65535, 12, 2]\n" | |
| 73 " 3: [1, 1]\n" | |
| 74 " 3: [10]\n" | |
| 75 " 0: [65534]\n" | |
| 76 " 0: [65534]\n"; | |
| 77 | |
| 78 const char *UnableToContinue = | |
| 79 "Error: Unable to generate bitcode file due to write errors\n"; | |
| 80 | |
| 63 // Edit to change void type with an illegal abbreviation index. | 81 // Edit to change void type with an illegal abbreviation index. |
| 64 const uint64_t VoidTypeIndex = 3; // Index for "@t0 = void". | 82 const uint64_t VoidTypeIndex = 3; // Index for "@t0 = void". |
| 65 const uint64_t AbbrevIndex4VoidTypeEdit[] = { | 83 const uint64_t AbbrevIndex4VoidTypeEdit[] = { |
| 66 VoidTypeIndex, NaClMungedBitcode::Replace, | 84 VoidTypeIndex, NaClMungedBitcode::Replace, |
| 67 4, naclbitc::TYPE_CODE_VOID, Terminator, | 85 4, naclbitc::TYPE_CODE_VOID, Terminator, |
| 68 }; | 86 }; |
| 69 | 87 |
| 70 // Edit to add local abbreviation for "ret void", and then use on that | 88 // Edit to add local abbreviation for "ret void", and then use on that |
| 71 // instruction. | 89 // instruction. |
| 72 const uint64_t RetVoidIndex = 9; // return void; | 90 const uint64_t RetVoidIndex = 9; // return void; |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 338 RetVoidIndex, NaClMungedBitcode::AddBefore, | 356 RetVoidIndex, NaClMungedBitcode::AddBefore, |
| 339 // Bad abbreviation! Intentionally leave out "literal" operand: 1 | 357 // Bad abbreviation! Intentionally leave out "literal" operand: 1 |
| 340 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, // 1, | 358 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, // 1, |
| 341 naclbitc::FUNC_CODE_INST_RET, Terminator, | 359 naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 342 }; | 360 }; |
| 343 | 361 |
| 344 // Show that the error is detected. | 362 // Show that the error is detected. |
| 345 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | 363 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 346 EXPECT_FALSE(Munger.runTest(ARRAY(Edits))); | 364 EXPECT_FALSE(Munger.runTest(ARRAY(Edits))); |
| 347 EXPECT_EQ( | 365 EXPECT_EQ( |
| 348 "Error (Block 12): Error: Bad abbreviation operand encoding 10:" | 366 "Error (Block 12): Bad abbreviation operand encoding 10:" |
| 349 " 2: [65533, 1, 10]\n" | 367 " 2: [65533, 1, 10]\n" |
| 350 "Error: Unable to generate bitcode file due to write errors\n", | 368 "Error: Unable to generate bitcode file due to write errors\n", |
| 351 Munger.getTestResults()); | 369 Munger.getTestResults()); |
| 352 | 370 |
| 353 // Show that the writer can recover. | 371 // Show that the writer can recover. |
| 354 Munger.setTryToRecoverOnWrite(true); | 372 Munger.setTryToRecoverOnWrite(true); |
| 355 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); | 373 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); |
| 356 EXPECT_EQ( | 374 EXPECT_EQ( |
| 357 "Error (Block 12): Error: Bad abbreviation operand encoding 10: " | 375 "Error (Block 12): Bad abbreviation operand encoding 10: " |
| 358 "2: [65533, 1, 10]\n" | 376 "2: [65533, 1, 10]\n" |
| 359 " 1: [65535, 8, 2]\n" | 377 " 1: [65535, 8, 2]\n" |
| 360 " 1: [65535, 17, 3]\n" | 378 " 1: [65535, 17, 3]\n" |
| 361 " 3: [1, 2]\n" | 379 " 3: [1, 2]\n" |
| 362 " 3: [2]\n" | 380 " 3: [2]\n" |
| 363 " 3: [21, 0, 0]\n" | 381 " 3: [21, 0, 0]\n" |
| 364 " 0: [65534]\n" | 382 " 0: [65534]\n" |
| 365 " 3: [8, 1, 0, 0, 0]\n" | 383 " 3: [8, 1, 0, 0, 0]\n" |
| 366 " 1: [65535, 12, 3]\n" // Note: not followed by abbreviation def. | 384 " 1: [65535, 12, 3]\n" // Note: not followed by abbreviation def. |
| 367 " 3: [1, 1]\n" | 385 " 3: [1, 1]\n" |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 388 RetVoidIndex, NaClMungedBitcode::AddBefore, // good abbreviation to ignore. | 406 RetVoidIndex, NaClMungedBitcode::AddBefore, // good abbreviation to ignore. |
| 389 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, 1, | 407 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, 1, |
| 390 naclbitc::FUNC_CODE_INST_RET, Terminator, | 408 naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 391 RetVoidIndex, NaClMungedBitcode::Replace, // reference to good abreviation. | 409 RetVoidIndex, NaClMungedBitcode::Replace, // reference to good abreviation. |
| 392 5, naclbitc::FUNC_CODE_INST_RET, Terminator | 410 5, naclbitc::FUNC_CODE_INST_RET, Terminator |
| 393 }; | 411 }; |
| 394 | 412 |
| 395 Munger.setTryToRecoverOnWrite(true); | 413 Munger.setTryToRecoverOnWrite(true); |
| 396 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); | 414 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); |
| 397 EXPECT_EQ( | 415 EXPECT_EQ( |
| 398 "Error (Block 12): Error: Bad abbreviation operand encoding 9:" | 416 "Error (Block 12): Bad abbreviation operand encoding 9:" |
| 399 " 2: [65533, 1, 9]\n" | 417 " 2: [65533, 1, 9]\n" |
| 400 "Error (Block 12): Ignoring abbreviation: 2: [65533, 1, 1, 10]\n" | 418 "Error (Block 12): Ignoring abbreviation: 2: [65533, 1, 1, 10]\n" |
| 401 "Error (Block 12): Uses illegal abbreviation index: 5: [10]\n" | 419 "Error (Block 12): Uses illegal abbreviation index: 5: [10]\n" |
| 402 " 1: [65535, 8, 2]\n" | 420 " 1: [65535, 8, 2]\n" |
| 403 " 1: [65535, 17, 3]\n" | 421 " 1: [65535, 17, 3]\n" |
| 404 " 3: [1, 2]\n" | 422 " 3: [1, 2]\n" |
| 405 " 3: [2]\n" | 423 " 3: [2]\n" |
| 406 " 3: [21, 0, 0]\n" | 424 " 3: [21, 0, 0]\n" |
| 407 " 0: [65534]\n" | 425 " 0: [65534]\n" |
| 408 " 3: [8, 1, 0, 0, 0]\n" | 426 " 3: [8, 1, 0, 0, 0]\n" |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 554 " 3: [1, 1]\n" | 572 " 3: [1, 1]\n" |
| 555 " 3: [10]\n" | 573 " 3: [10]\n" |
| 556 " 0: [65534]\n" | 574 " 0: [65534]\n" |
| 557 " 0: [65534]\n" | 575 " 0: [65534]\n" |
| 558 " 1: [65535, 4294967295, 3]\n" | 576 " 1: [65535, 4294967295, 3]\n" |
| 559 " 3: [1, 4]\n" | 577 " 3: [1, 4]\n" |
| 560 " 0: [65534]\n", | 578 " 0: [65534]\n", |
| 561 Munger.getTestResults()); | 579 Munger.getTestResults()); |
| 562 } | 580 } |
| 563 | 581 |
| 582 // Runs write munging tests on BitcodeRecords, inserting bad | |
| 583 // abbreviation definitions via Edit. ErrorMessage is the expected | |
|
jvoung (off chromium)
2015/05/27 20:09:37
via Edit -> via Edits ?
Karl
2015/05/28 20:50:32
Done.
| |
| 584 // error message to be generated by the write munger. Assumes the the | |
|
jvoung (off chromium)
2015/05/27 20:09:37
the the -> that the
Karl
2015/05/28 20:50:31
Done.
| |
| 585 // error recovery is to delete the bad abbreviation definitions. | |
|
jvoung (off chromium)
2015/05/27 20:09:37
error recover -> error recover method
or somethin
Karl
2015/05/28 20:50:31
No longer applicable. Comments were rewritten.
| |
| 586 void CheckWriteBadAbbrevMunging(const uint64_t *Edits, size_t EditsSize, | |
| 587 const char *ErrorMessage) { | |
| 588 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | |
| 589 EXPECT_FALSE(Munger.runTest(Edits, EditsSize)); | |
| 590 std::string BadResults(ErrorMessage); | |
| 591 BadResults.append(UnableToContinue); | |
| 592 EXPECT_EQ(BadResults, Munger.getTestResults()); | |
| 593 | |
| 594 Munger.setTryToRecoverOnWrite(true); | |
| 595 EXPECT_TRUE(Munger.runTest(Edits, EditsSize)); | |
| 596 std::string GoodResults(ErrorMessage); | |
| 597 GoodResults.append(ExpectedRecords); | |
| 598 EXPECT_EQ(GoodResults, Munger.getTestResults()); | |
| 599 } | |
| 600 | |
| 601 // Show that inserting an abbreviation with a bad fixed width is dealt with. | |
| 602 TEST(NaClMungeWriteErrorTests, InvalidFixedAbbreviationSize) { | |
| 603 // Insert bad abbreviation Fixed(36) into type block. | |
|
jvoung (off chromium)
2015/05/27 20:09:37
how about static_assert(36 > naclbitc::MaxAbbrevWi
Karl
2015/05/28 20:50:31
Done.
| |
| 604 const uint64_t Edit[] = { | |
| 605 VoidTypeIndex, NaClMungedBitcode::AddBefore, | |
| 606 naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, | |
| 607 0, NaClBitCodeAbbrevOp::Fixed, 36, Terminator | |
|
jvoung (off chromium)
2015/05/27 20:09:38
can line up the 0, ... with the other array elems
Karl
2015/05/28 20:50:32
Done.
| |
| 608 }; | |
| 609 CheckWriteBadAbbrevMunging( | |
| 610 ARRAY(Edit), | |
| 611 "Error (Block 17): Invalid abbreviation Fixed(36) in: 2: [65533, 1, 0," | |
| 612 " 1, 36]\n"); | |
| 613 } | |
| 614 | |
| 615 // Show that inserting an abbreviation with a bad vbr width is dealt with. | |
| 616 TEST(NaClMungeWriteErrorTests, InvalidVbrAbbreviationSize) { | |
| 617 // Insert bad abbreviation Vbr(36) into type block. | |
| 618 const uint64_t Edit[] = { | |
| 619 VoidTypeIndex, NaClMungedBitcode::AddBefore, | |
| 620 naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, | |
| 621 0, NaClBitCodeAbbrevOp::VBR, 36, | |
| 622 Terminator | |
| 623 }; | |
| 624 CheckWriteBadAbbrevMunging( | |
| 625 ARRAY(Edit), | |
| 626 "Error (Block 17): Invalid abbreviation VBR(36) in: 2: [65533, 1, 0," | |
| 627 " 2, 36]\n"); | |
| 628 } | |
| 629 | |
| 630 // Show that the array operator can't appear last. | |
| 631 TEST(NaClMungeWriteErrorTests, InvalidArrayAbbreviationLast) { | |
| 632 const uint64_t Edit[] = { | |
| 633 VoidTypeIndex, NaClMungedBitcode::AddBefore, | |
| 634 naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, | |
| 635 0, NaClBitCodeAbbrevOp::Array, Terminator | |
| 636 }; | |
| 637 CheckWriteBadAbbrevMunging( | |
| 638 ARRAY(Edit), | |
| 639 "Error (Block 17): Malformed array abbreviation found: 2: [65533, 1," | |
| 640 " 0, 3]\n"); | |
| 641 } | |
| 642 | |
| 643 // Show that the array operator can't appear before the second to last | |
| 644 // operand. | |
| 645 TEST(NaClMungeWriteErrorTests, InvalidArrayAbbreviationTooEarly) { | |
| 646 const uint64_t Edit[] = { | |
| 647 VoidTypeIndex, NaClMungedBitcode::AddBefore, | |
| 648 naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 3, | |
| 649 0, NaClBitCodeAbbrevOp::Array, // array | |
| 650 1, 15, // lit(15) | |
| 651 1, 10, // lit(10) | |
| 652 Terminator | |
| 653 }; | |
| 654 CheckWriteBadAbbrevMunging( | |
| 655 ARRAY(Edit), | |
| 656 "Error (Block 17): Array abbreviation must be second to last: 2: [65533," | |
| 657 " 3, 0, 3, 1, 15, 1, 10]\n"); | |
| 658 } | |
| 659 | |
| 660 // Show that the array operator can't appear as last two operators. | |
| 661 TEST(NaClMungeWriteErrorTests, InvalidArrayAbbreviationLastTwo) { | |
| 662 const uint64_t Edit[] = { | |
| 663 VoidTypeIndex, NaClMungedBitcode::AddBefore, | |
| 664 naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 2, | |
| 665 0, NaClBitCodeAbbrevOp::Array, // array | |
| 666 0, NaClBitCodeAbbrevOp::Array, // array | |
| 667 Terminator | |
| 668 }; | |
| 669 CheckWriteBadAbbrevMunging( | |
| 670 ARRAY(Edit), | |
| 671 "Error (Block 17): Malformed array abbreviation found: 2: [65533, 2," | |
| 672 " 0, 3, 0, 3]\n"); | |
| 673 } | |
| 674 | |
| 675 // Show that the code checks if specifies too few operands for an | |
|
jvoung (off chromium)
2015/05/27 20:09:37
nit: "Show that the code checks if specifies too f
Karl
2015/05/28 20:50:31
Rewritten.
| |
| 676 // abbreviation, based on the record size. | |
| 677 TEST(NaClMungeWriteErrorTests, SpecifiesTooFewOperands) { | |
| 678 const uint64_t Edit[] = { | |
| 679 VoidTypeIndex, NaClMungedBitcode::AddBefore, | |
| 680 naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, | |
| 681 1, 10, // lit(10) | |
| 682 1, 15, // lit(15) | |
| 683 Terminator | |
| 684 }; | |
| 685 CheckWriteBadAbbrevMunging( | |
| 686 ARRAY(Edit), | |
| 687 "Error (Block 17): Error: Too many values for number of operands (1):" | |
| 688 " 2: [65533, 1, 1, 10, 1, 15]\n"); | |
| 689 } | |
| 690 | |
| 691 // Show that the code checks if specifies too many operands for an | |
| 692 // abbreviation, based on the record size. | |
| 693 TEST(NaClMungeWriteErrorTests, SpecifiesTooManyOperands) { | |
| 694 // Insert bad abbreviation Vbr(36) into type block. | |
| 695 const uint64_t Edit[] = { | |
| 696 VoidTypeIndex, NaClMungedBitcode::AddBefore, | |
| 697 naclbitc::DEFINE_ABBREV, naclbitc::BLK_CODE_DEFINE_ABBREV, 3, | |
| 698 1, 10, // lit(10) | |
| 699 1, 15, // lit(15) | |
| 700 Terminator | |
| 701 }; | |
| 702 CheckWriteBadAbbrevMunging( | |
| 703 ARRAY(Edit), | |
| 704 "Error (Block 17): Malformed abbreviation found. Expects 3 operands" | |
| 705 " but found 2: 2: [65533, 3, 1, 10, 1, 15]\n"); | |
| 706 } | |
| 707 | |
| 564 } // end of namespace naclmungetest | 708 } // end of namespace naclmungetest |
| OLD | NEW |