Index: unittest/IceParseInstsTest.cpp |
diff --git a/unittest/IceParseInstsTest.cpp b/unittest/IceParseInstsTest.cpp |
index abb536c1048406db36d94c206d62fbc645041858..898712a9e763ecd77925d0b26ece124d927798f8 100644 |
--- a/unittest/IceParseInstsTest.cpp |
+++ b/unittest/IceParseInstsTest.cpp |
@@ -21,6 +21,12 @@ namespace { |
static const uint64_t Terminator = 0x5768798008978675LL; |
+// Note: alignment stored as 0 or log2(Alignment)+1. |
+uint64_t getEncAlignPower(unsigned Power) { |
+ return Power + 1; |
+} |
+uint64_t getEncAlignZero() { return 0; } |
+ |
/// Test how we report a call arg that refers to nonexistent call argument |
TEST(IceParseInstsTest, NonexistentCallArg) { |
const uint64_t BitcodeRecords[] = { |
@@ -42,7 +48,6 @@ TEST(IceParseInstsTest, NonexistentCallArg) { |
0, naclbitc::BLK_CODE_EXIT, Terminator |
}; |
- |
// Show bitcode objdump for BitcodeRecords. |
NaClObjDumpMunger DumpMunger(BitcodeRecords, |
array_lengthof(BitcodeRecords), Terminator); |
@@ -76,4 +81,421 @@ TEST(IceParseInstsTest, NonexistentCallArg) { |
Munger.getTestResults()); |
} |
+/// Test how we recognize alignments in alloca instructions. |
+TEST(IceParseInstsTests, AllocaAlignment) { |
+ 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, |
+ 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), 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 when alignment is 1. |
+ NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
+ Terminator); |
+ EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 1")); |
+ 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()); |
+ |
+ // Show that we can handle alignment of 1. |
+ IceTest::SubzeroBitcodeMunger Munger( |
+ BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
+ EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); |
+ |
+ // Show what happens when changing alignment to 0. |
+ const uint64_t Align0[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, |
+ }; |
+ EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, |
+ array_lengthof(Align0))); |
+ EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, |
+ array_lengthof(Align0))); |
+ EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
+ DumpMunger.getLinesWithSubstring("alloca")); |
+ |
+ // Show what happens when changing alignment to 2**30. |
+ const uint64_t Align30[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, |
+ array_lengthof(Align30))); |
+ EXPECT_EQ("Error: (62:4) Invalid function record: <19 1 31>\n", |
+ Munger.getTestResults()); |
+ |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, |
+ array_lengthof(Align30))); |
+ EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
+ DumpMunger.getLinesWithSubstring("alloca")); |
+ EXPECT_EQ( |
+ "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
+ DumpMunger.getLinesWithSubstring("Error")); |
+ |
+ // Show what happens when changing alignment to 2**29. |
+ const uint64_t Align29[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, |
+ }; |
+ EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, |
+ array_lengthof(Align29))); |
+ EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, |
+ array_lengthof(Align29))); |
+ EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", |
+ DumpMunger.getLinesWithSubstring("alloca")); |
+} |
+ |
+// Test how we recognize alignments in load i32 instructions. |
+TEST(IceParseInstsTests, LoadI32Alignment) { |
+ 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, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 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 |
+ |
+ // Show text when alignment is 1. |
+ NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
+ Terminator); |
+ EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load i32 alignment 1")); |
+ 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()); |
+ IceTest::SubzeroBitcodeMunger Munger( |
+ BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
+ EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); |
+ |
+ // Show what happens when changing alignment to 0. |
+ const uint64_t Align0[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, |
+ array_lengthof(Align0))); |
+ EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, |
+ array_lengthof(Align0))); |
+ EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
+ "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
+ DumpMunger.getLinesWithSubstring("load")); |
+ |
+ // Show what happens when changing alignment to 4. |
+ const uint64_t Align4[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, |
+ array_lengthof(Align4))); |
+ EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 3 0>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, |
+ array_lengthof(Align4))); |
+ EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" |
+ "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
+ DumpMunger.getLinesWithSubstring("load")); |
+ |
+ // Show what happens when changing alignment to 2**29. |
+ const uint64_t Align29[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, |
+ array_lengthof(Align29))); |
+ EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", |
+ Align29, array_lengthof(Align29))); |
+ EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" |
+ "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
+ DumpMunger.getLinesWithSubstring("load")); |
+ |
+ // Show what happens when changing alignment to 2**30. |
+ const uint64_t Align30[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, |
+ array_lengthof(Align30))); |
+ EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", |
+ Align30, array_lengthof(Align30))); |
+ EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
+ "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
+ DumpMunger.getLinesWithSubstring("load")); |
+} |
+ |
+// Test how we recognize alignments in load float instructions. |
+TEST(IceParseInstsTests, LoadFloatAlignment) { |
+ 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, 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, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 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 = 10; // index for FUNC_CODE_INST_LOAD |
+ |
+ // Show text when alignment is 1. |
+ NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
+ Terminator); |
+ EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 1")); |
+ EXPECT_EQ("module { // BlockID = 8\n" |
+ " types { // BlockID = 17\n" |
+ " count 3;\n" |
+ " @t0 = float;\n" |
+ " @t1 = i32;\n" |
+ " @t2 = float (i32);\n" |
+ " }\n" |
+ " define external float @f0(i32);\n" |
+ " function float @f0(i32 %p0) { // BlockID = 12\n" |
+ " blocks 1;\n" |
+ " %b0:\n" |
+ " %v0 = load float* %p0, align 1;\n" |
+ " ret float %v0;\n" |
+ " }\n" |
+ "}\n", |
+ DumpMunger.getTestResults()); |
+ IceTest::SubzeroBitcodeMunger Munger( |
+ BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
+ EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); |
+ |
+ // Show what happens when changing alignment to 0. |
+ const uint64_t Align0[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, |
+ array_lengthof(Align0))); |
+ EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", |
+ Align0, array_lengthof(Align0))); |
+ EXPECT_EQ( |
+ " %v0 = load float* %p0, align 0;\n" |
+ "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
+ DumpMunger.getLinesWithSubstring("load")); |
+ |
+ // Show what happens when changing alignment to 4. |
+ const uint64_t Align4[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
+ }; |
+ EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, |
+ array_lengthof(Align4))); |
+ EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", |
+ Align4, array_lengthof(Align4))); |
+ EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
+ DumpMunger.getLinesWithSubstring("load")); |
+ |
+ const uint64_t Align29[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, |
+ array_lengthof(Align29))); |
+ EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", |
+ Align29, array_lengthof(Align29))); |
+ EXPECT_EQ( |
+ " %v0 = load float* %p0, align 536870912;\n" |
+ "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
+ DumpMunger.getLinesWithSubstring("load")); |
+ |
+ // Show what happens when changing alignment to 2**30. |
+ const uint64_t Align30[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, |
+ array_lengthof(Align30))); |
+ EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", |
+ Align30, array_lengthof(Align30))); |
+ EXPECT_EQ( |
+ " %v0 = load float* %p0, align 0;\n" |
+ "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
+ DumpMunger.getLinesWithSubstring("load")); |
+} |
+ |
+// Test how we recognize alignments in store instructions. |
+TEST(NaClParseInstsTests, StoreAlignment) { |
+ 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, |
+ 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(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 = 10; // index for FUNC_CODE_INST_STORE |
+ |
+ // Show text when alignment is 1. |
+ NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
+ Terminator); |
+ EXPECT_TRUE(DumpMunger.runTestForAssembly("Good Store Alignment 1")); |
+ 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()); |
+ IceTest::SubzeroBitcodeMunger Munger( |
+ BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
+ EXPECT_TRUE(Munger.runTest("Good store alignment")); |
+ |
+ // Show what happens when changing alignment to 0. |
+ const uint64_t Align0[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
+ }; |
+ EXPECT_FALSE( |
+ Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); |
+ EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 0>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, |
+ array_lengthof(Align0))); |
+ EXPECT_EQ( |
+ " store float %p1, float* %p0, align 0;\n" |
+ "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
+ DumpMunger.getLinesWithSubstring("store")); |
+ |
+ // Show what happens when changing alignment to 4. |
+ const uint64_t Align4[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, |
+ }; |
+ EXPECT_TRUE( |
+ Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); |
+ EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, |
+ array_lengthof(Align4))); |
+ |
+ // Show what happens when changing alignment to 8. |
+ const uint64_t Align8[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, |
+ }; |
+ EXPECT_FALSE( |
+ Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); |
+ EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 4>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, |
+ array_lengthof(Align8))); |
+ EXPECT_EQ( |
+ " store float %p1, float* %p0, align 8;\n" |
+ "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
+ DumpMunger.getLinesWithSubstring("store")); |
+ |
+ // Show what happens when changing alignment to 2**29. |
+ const uint64_t Align29[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, |
+ array_lengthof(Align29))); |
+ EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 30>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, |
+ array_lengthof(Align29))); |
+ EXPECT_EQ( |
+ " store float %p1, float* %p0, align 536870912;\n" |
+ "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
+ DumpMunger.getLinesWithSubstring("store")); |
+ |
+ const uint64_t Align30[] = { |
+ ReplaceIndex, NaClBitcodeMunger::Replace, |
+ // Note: alignment stored as 0 or log2(Alignment)+1. |
+ 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
+ }; |
+ EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, |
+ array_lengthof(Align30))); |
+ EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 31>\n", |
+ Munger.getTestResults()); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, |
+ array_lengthof(Align30))); |
+ EXPECT_EQ( |
+ " store float %p1, float* %p0, align 0;\n" |
+ "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
+ DumpMunger.getLinesWithSubstring("store")); |
+} |
+ |
} // end of anonymous namespace |