Chromium Code Reviews| Index: unittests/Bitcode/NaClParseInstsTest.cpp |
| diff --git a/unittests/Bitcode/NaClParseInstsTest.cpp b/unittests/Bitcode/NaClParseInstsTest.cpp |
| index 44fb968634b3ddb8e132126308aef723242ae3ee..a8471dc5e299b3a03babca067ed8ef9839d127e5 100644 |
| --- a/unittests/Bitcode/NaClParseInstsTest.cpp |
| +++ b/unittests/Bitcode/NaClParseInstsTest.cpp |
| @@ -79,4 +79,236 @@ TEST(NaClParseInstsTest, NonexistantCallArg) { |
| Munger.getTestResults()); |
| } |
| +/// Tests if we recognize when alignment gets too large. |
|
jvoung (off chromium)
2014/12/16 23:24:39
nit: maybe change Alloc - >"Alloca" to be a bit mo
Karl
2014/12/17 20:52:38
Done.
|
| +TEST(NaClParseInstsTests, BadAllocInstAlignment) { |
| + const uint64_t BitcodeRecords[] = { |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| + 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
| + 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| + 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| + 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, |
| + 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| + 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| + 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
| + 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 1, Terminator, |
| + 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator |
| + }; |
| + |
| + const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA |
| + |
| + // Show text of base input. |
| + NaClObjDumpMunger DumpMunger(BitcodeRecords, |
| + array_lengthof(BitcodeRecords), Terminator); |
| + EXPECT_TRUE(DumpMunger.runTestForAssembly("BadAllocInstAlignment")); |
| + EXPECT_EQ( |
| + "module { // BlockID = 8\n" |
| + " types { // BlockID = 17\n" |
| + " count 4;\n" |
| + " @t0 = i32;\n" |
| + " @t1 = void;\n" |
| + " @t2 = void (i32);\n" |
| + " @t3 = i8;\n" |
| + " }\n" |
| + " define external void @f0(i32);\n" |
| + " function void @f0(i32 %p0) { // BlockID = 12\n" |
| + " blocks 1;\n" |
| + " %b0:\n" |
| + " %v0 = alloca i8, i32 %p0, align 1;\n" |
| + " ret void;\n" |
| + " }\n" |
| + "}\n", |
| + DumpMunger.getTestResults()); |
| + |
| + NaClParseBitcodeMunger Munger(BitcodeRecords, |
| + array_lengthof(BitcodeRecords), Terminator); |
| + EXPECT_TRUE(Munger.runTest("BadAllocInstAlignment", true)); |
| + EXPECT_EQ( |
| + "Successful parse!\n", |
| + Munger.getTestResults()); |
| + |
| + // Show what happens when changing alignment to 30. |
|
jvoung (off chromium)
2014/12/16 23:24:39
"to 30" -> "to 2**30" ?
Karl
2014/12/17 20:52:38
Done.
|
| + const uint64_t Align30[] = { |
| + ReplaceIndex, NaClBitcodeMunger::Replace, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
|
jvoung (off chromium)
2014/12/16 23:24:39
I don't quite know what Log32_32 means. Do you mea
Karl
2014/12/17 20:52:38
Done.
|
| + 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 31, Terminator, |
| + }; |
| + EXPECT_FALSE(Munger.runTest( |
| + "BadAllocInstAlignment-30", Align30, array_lengthof(Align30), true)); |
| + EXPECT_EQ( |
| + "Error: Alignment can't be greater than 2**29. Found: 2**30\n" |
| + "Error: Invalid value in record\n", |
| + Munger.getTestResults()); |
| + |
| + // Show what happens when changing alignment to 29. |
| + const uint64_t Align29[] = { |
| + ReplaceIndex, NaClBitcodeMunger::Replace, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
| + 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 30, Terminator, |
| + }; |
| + EXPECT_TRUE(Munger.runTest( |
| + "BadAllocInstAlignment-29", Align29, array_lengthof(Align29), true)); |
| + EXPECT_EQ( |
| + "Successful parse!\n", |
| + Munger.getTestResults()); |
| + EXPECT_TRUE(DumpMunger.runTestForAssembly( |
| + "BadAllocInstAlignment-29", Align29, array_lengthof(Align29))); |
| + EXPECT_EQ( |
| + " %v0 = alloca i8, i32 %p0, align 536870912;\n", |
| + DumpMunger.getLinesWithSubstring("alloca")); |
| +} |
| + |
| +TEST(NaClParseInstsTests, BadLoadAlignment) { |
| + const uint64_t BitcodeRecords[] = { |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| + 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, |
| + 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| + 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| + 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| + 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
| + 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 1, 0, Terminator, |
| + 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator |
| + }; |
| + |
| + const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD |
| + |
| + // Note: i32 can only have alignment of 1. |
| + // Show text of base input. |
| + NaClObjDumpMunger DumpMunger(BitcodeRecords, |
| + array_lengthof(BitcodeRecords), Terminator); |
| + EXPECT_TRUE(DumpMunger.runTestForAssembly("BadLoadAlignment")); |
| + EXPECT_EQ( |
| + "module { // BlockID = 8\n" |
| + " types { // BlockID = 17\n" |
| + " count 2;\n" |
| + " @t0 = i32;\n" |
| + " @t1 = i32 (i32);\n" |
| + " }\n" |
| + " define external i32 @f0(i32);\n" |
| + " function i32 @f0(i32 %p0) { // BlockID = 12\n" |
| + " blocks 1;\n" |
| + " %b0:\n" |
| + " %v0 = load i32* %p0, align 1;\n" |
| + " ret i32 %v0;\n" |
| + " }\n" |
| + "}\n", |
| + DumpMunger.getTestResults()); |
| + |
| + // Show what happens when changing alignment to 4. |
| + const uint64_t Align4[] = { |
| + ReplaceIndex, NaClBitcodeMunger::Replace, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
| + 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 3, 0, Terminator, |
| + }; |
| + NaClParseBitcodeMunger Munger(BitcodeRecords, |
| + array_lengthof(BitcodeRecords), Terminator); |
| + EXPECT_FALSE(Munger.runTest( |
| + "BadLoadAlignment", Align4, array_lengthof(Align4), true)); |
| + EXPECT_EQ( |
| + "Error: Invalid alignment for load of type i32: 4\n" |
| + "Error: Invalid value in record\n", |
| + Munger.getTestResults()); |
| +} |
| + |
| +TEST(NaClParseInstsTests, BadStoreAlignment) { |
| + const uint64_t BitcodeRecords[] = { |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| + 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
| + 3, naclbitc::TYPE_CODE_FLOAT, Terminator, |
| + 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| + 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| + 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| + 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| + 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
| + 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 1, Terminator, |
| + 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| + 0, naclbitc::BLK_CODE_EXIT, Terminator |
| + }; |
| + |
| + const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD |
| + |
| + // Note: float can only have alignment of 1 and 4. |
| + // Show text of base input. |
| + NaClObjDumpMunger DumpMunger(BitcodeRecords, |
| + array_lengthof(BitcodeRecords), Terminator); |
| + EXPECT_TRUE(DumpMunger.runTestForAssembly("BadStoreAlignment")); |
| + EXPECT_EQ( |
| + "module { // BlockID = 8\n" |
| + " types { // BlockID = 17\n" |
| + " count 3;\n" |
| + " @t0 = float;\n" |
| + " @t1 = i32;\n" |
| + " @t2 = float (i32, float);\n" |
| + " }\n" |
| + " define external float @f0(i32, float);\n" |
| + " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" |
| + " blocks 1;\n" |
| + " %b0:\n" |
| + " store float %p1, float* %p0, align 1;\n" |
| + " ret float %p1;\n" |
| + " }\n" |
| + "}\n", |
| + DumpMunger.getTestResults()); |
| + |
| + // Show what happens when changing alignment to 2. |
| + const uint64_t Align2[] = { |
| + ReplaceIndex, NaClBitcodeMunger::Replace, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
| + 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 2, Terminator, |
| + }; |
| + NaClParseBitcodeMunger Munger(BitcodeRecords, |
| + array_lengthof(BitcodeRecords), Terminator); |
| + EXPECT_FALSE(Munger.runTest( |
| + "BadStoreAlignment-2", Align2, array_lengthof(Align2), true)); |
| + EXPECT_EQ( |
| + "Error: Invalid alignment for store of type float: 2\n" |
| + "Error: Invalid value in record\n", |
| + Munger.getTestResults()); |
| + |
| + // Show what happens when changing alignment to 4. |
| + const uint64_t Align4[] = { |
| + ReplaceIndex, NaClBitcodeMunger::Replace, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
| + 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 3, Terminator, |
| + }; |
| + EXPECT_TRUE(Munger.runTest( |
| + "BadStoreAlignment-4", Align4, array_lengthof(Align4), true)); |
| + EXPECT_EQ( |
| + "Successful parse!\n", |
| + Munger.getTestResults()); |
| + EXPECT_TRUE(DumpMunger.runTestForAssembly( |
| + "BadStoreAlignment-4", Align4, array_lengthof(Align4))); |
| + EXPECT_EQ( |
| + " store float %p1, float* %p0, align 4;\n", |
| + DumpMunger.getLinesWithSubstring("store")); |
| + |
| + // Show what happens when changing alignment to 8. |
| + const uint64_t Align8[] = { |
| + ReplaceIndex, NaClBitcodeMunger::Replace, |
| + // Note: alignment stored as Log32_32(Alignment)+1. |
| + 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 4, Terminator, |
| + }; |
| + EXPECT_FALSE(Munger.runTest( |
| + "BadStoreAlignment-8", Align8, array_lengthof(Align8), true)); |
| + EXPECT_EQ( |
| + "Error: Invalid alignment for store of type float: 8\n" |
| + "Error: Invalid value in record\n", |
| + Munger.getTestResults()); |
| +} |
| + |
| } // end of anonamous namespace. |