Chromium Code Reviews| OLD | NEW |
|---|---|
| 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" |
| 11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" | 11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" |
| 12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" | 12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" |
| 13 | 13 |
| 14 #include "BitcodeMunge.h" | 14 #include "BitcodeMunge.h" |
| 15 | 15 |
| 16 #include "gtest/gtest.h" | 16 #include "gtest/gtest.h" |
| 17 | 17 |
| 18 using namespace llvm; | 18 using namespace llvm; |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 static const uint64_t Terminator = 0x5768798008978675LL; | 22 static const uint64_t Terminator = 0x5768798008978675LL; |
| 23 | 23 |
| 24 // Note: alignment stored as 0 or log2(Alignment)+1. | 24 // Note: alignment stored as 0 or log2(Alignment)+1. |
| 25 uint64_t getEncAlignPower(unsigned Power) { | 25 uint64_t getEncAlignPower(unsigned Power) { return Power + 1; } |
| 26 return Power + 1; | |
| 27 } | |
| 28 uint64_t getEncAlignZero() { return 0; } | 26 uint64_t getEncAlignZero() { return 0; } |
| 29 | 27 |
| 30 /// Test how we report a call arg that refers to nonexistent call argument | 28 /// Test how we report a call arg that refers to nonexistent call argument |
| 31 TEST(IceParseInstsTest, NonexistentCallArg) { | 29 TEST(IceParseInstsTest, NonexistentCallArg) { |
| 32 const uint64_t BitcodeRecords[] = { | 30 const uint64_t BitcodeRecords[] = { |
| 33 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 31 1, naclbitc::BLK_CODE_ENTER, |
|
jvoung (off chromium)
2015/01/27 18:08:11
Hmm... these used to be arranged such that each ro
Jim Stichnoth
2015/01/27 19:24:11
Ugh. Reverting the whole file change, and quarant
| |
| 34 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 32 naclbitc::MODULE_BLOCK_ID, 2, |
| 35 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 33 Terminator, 1, |
| 36 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 34 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, |
| 37 3, naclbitc::TYPE_CODE_VOID, Terminator, | 35 2, Terminator, |
| 38 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, | 36 3, naclbitc::TYPE_CODE_NUMENTRY, |
| 39 0, naclbitc::BLK_CODE_EXIT, Terminator, | 37 3, Terminator, |
| 40 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, | 38 3, naclbitc::TYPE_CODE_INTEGER, |
| 41 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 39 32, Terminator, |
| 42 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 40 3, naclbitc::TYPE_CODE_VOID, |
| 43 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 41 Terminator, 3, |
| 44 // Note: 100 is a bad value index in next line. | 42 naclbitc::TYPE_CODE_FUNCTION, 0, |
| 45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 43 1, 0, |
| 46 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 44 0, Terminator, |
| 47 0, naclbitc::BLK_CODE_EXIT, Terminator, | 45 0, naclbitc::BLK_CODE_EXIT, |
| 48 0, naclbitc::BLK_CODE_EXIT, Terminator | 46 Terminator, 3, |
| 49 }; | 47 naclbitc::MODULE_CODE_FUNCTION, 2, |
| 48 0, 1, | |
| 49 0, Terminator, | |
| 50 3, naclbitc::MODULE_CODE_FUNCTION, | |
| 51 2, 0, | |
| 52 0, 0, | |
| 53 Terminator, 1, | |
| 54 naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, | |
| 55 2, Terminator, | |
| 56 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, | |
| 57 1, Terminator, | |
| 58 // Note: 100 is a bad value index in next line. | |
| 59 3, naclbitc::FUNC_CODE_INST_CALL, | |
| 60 0, 4, | |
| 61 2, 100, | |
| 62 Terminator, 3, | |
| 63 naclbitc::FUNC_CODE_INST_RET, Terminator, | |
| 64 0, naclbitc::BLK_CODE_EXIT, | |
| 65 Terminator, 0, | |
| 66 naclbitc::BLK_CODE_EXIT, Terminator}; | |
| 50 | 67 |
| 51 // Show bitcode objdump for BitcodeRecords. | 68 // Show bitcode objdump for BitcodeRecords. |
| 52 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 69 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 53 array_lengthof(BitcodeRecords), Terminator); | 70 Terminator); |
| 54 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); | 71 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); |
| 55 EXPECT_EQ( | 72 EXPECT_EQ("module { // BlockID = 8\n" |
| 56 "module { // BlockID = 8\n" | 73 " types { // BlockID = 17\n" |
| 57 " types { // BlockID = 17\n" | 74 " count 3;\n" |
| 58 " count 3;\n" | 75 " @t0 = i32;\n" |
| 59 " @t0 = i32;\n" | 76 " @t1 = void;\n" |
| 60 " @t1 = void;\n" | 77 " @t2 = void (i32, i32);\n" |
| 61 " @t2 = void (i32, i32);\n" | 78 " }\n" |
| 62 " }\n" | 79 " declare external void @f0(i32, i32);\n" |
| 63 " declare external void @f0(i32, i32);\n" | 80 " define external void @f1(i32, i32);\n" |
| 64 " define external void @f1(i32, i32);\n" | 81 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" |
| 65 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" | 82 " blocks 1;\n" |
| 66 " blocks 1;\n" | 83 " %b0:\n" |
| 67 " %b0:\n" | 84 " call void @f0(i32 %p0, i32 @f0);\n" |
| 68 " call void @f0(i32 %p0, i32 @f0);\n" | 85 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" |
| 69 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" | 86 " ret void;\n" |
| 70 " ret void;\n" | 87 " }\n" |
| 71 " }\n" | 88 "}\n", |
| 72 "}\n", | 89 DumpMunger.getTestResults()); |
| 73 DumpMunger.getTestResults()); | |
| 74 | 90 |
| 75 // Show that we get appropriate error when parsing in Subzero. | 91 // Show that we get appropriate error when parsing in Subzero. |
| 76 IceTest::SubzeroBitcodeMunger Munger( | 92 IceTest::SubzeroBitcodeMunger Munger( |
| 77 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 93 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 78 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); | 94 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); |
| 79 EXPECT_EQ( | 95 EXPECT_EQ("Error: (66:4) Invalid function record: <34 0 4 2 100>\n", |
| 80 "Error: (66:4) Invalid function record: <34 0 4 2 100>\n", | 96 Munger.getTestResults()); |
| 81 Munger.getTestResults()); | |
| 82 } | 97 } |
| 83 | 98 |
| 84 /// Test how we recognize alignments in alloca instructions. | 99 /// Test how we recognize alignments in alloca instructions. |
| 85 TEST(IceParseInstsTests, AllocaAlignment) { | 100 TEST(IceParseInstsTests, AllocaAlignment) { |
| 86 const uint64_t BitcodeRecords[] = { | 101 const uint64_t BitcodeRecords[] = { |
| 87 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 102 1, naclbitc::BLK_CODE_ENTER, |
| 88 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 103 naclbitc::MODULE_BLOCK_ID, 2, |
| 89 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | 104 Terminator, 1, |
| 90 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 105 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, |
| 91 3, naclbitc::TYPE_CODE_VOID, Terminator, | 106 2, Terminator, |
| 92 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | 107 3, naclbitc::TYPE_CODE_NUMENTRY, |
| 93 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | 108 4, Terminator, |
| 94 0, naclbitc::BLK_CODE_EXIT, Terminator, | 109 3, naclbitc::TYPE_CODE_INTEGER, |
| 95 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 110 32, Terminator, |
| 96 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 111 3, naclbitc::TYPE_CODE_VOID, |
| 97 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 112 Terminator, 3, |
| 98 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, | 113 naclbitc::TYPE_CODE_FUNCTION, 0, |
| 99 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 114 1, 0, |
| 100 0, naclbitc::BLK_CODE_EXIT, Terminator, | 115 Terminator, 3, |
| 101 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 116 naclbitc::TYPE_CODE_INTEGER, 8, |
| 117 Terminator, 0, | |
| 118 naclbitc::BLK_CODE_EXIT, Terminator, | |
| 119 3, naclbitc::MODULE_CODE_FUNCTION, | |
| 120 2, 0, | |
| 121 0, 0, | |
| 122 Terminator, 1, | |
| 123 naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, | |
| 124 2, Terminator, | |
| 125 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, | |
| 126 1, Terminator, | |
| 127 3, naclbitc::FUNC_CODE_INST_ALLOCA, | |
| 128 1, getEncAlignPower(0), | |
| 129 Terminator, 3, | |
| 130 naclbitc::FUNC_CODE_INST_RET, Terminator, | |
| 131 0, naclbitc::BLK_CODE_EXIT, | |
| 132 Terminator, 0, | |
| 133 naclbitc::BLK_CODE_EXIT, Terminator}; | |
| 102 | 134 |
| 103 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | 135 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA |
| 104 | 136 |
| 105 // Show text when alignment is 1. | 137 // Show text when alignment is 1. |
| 106 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 138 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 107 Terminator); | 139 Terminator); |
| 108 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 1")); | 140 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 1")); |
| 109 EXPECT_EQ("module { // BlockID = 8\n" | 141 EXPECT_EQ("module { // BlockID = 8\n" |
| 110 " types { // BlockID = 17\n" | 142 " types { // BlockID = 17\n" |
| 111 " count 4;\n" | 143 " count 4;\n" |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 125 DumpMunger.getTestResults()); | 157 DumpMunger.getTestResults()); |
| 126 | 158 |
| 127 // Show that we can handle alignment of 1. | 159 // Show that we can handle alignment of 1. |
| 128 IceTest::SubzeroBitcodeMunger Munger( | 160 IceTest::SubzeroBitcodeMunger Munger( |
| 129 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 161 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 130 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); | 162 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); |
| 131 | 163 |
| 132 // Show what happens when changing alignment to 0. | 164 // Show what happens when changing alignment to 0. |
| 133 const uint64_t Align0[] = { | 165 const uint64_t Align0[] = { |
| 134 ReplaceIndex, NaClBitcodeMunger::Replace, | 166 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 135 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, | 167 3, naclbitc::FUNC_CODE_INST_ALLOCA, |
| 168 1, getEncAlignZero(), | |
| 169 Terminator, | |
| 136 }; | 170 }; |
| 137 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, | 171 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, |
| 138 array_lengthof(Align0))); | 172 array_lengthof(Align0))); |
| 139 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, | 173 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, |
| 140 array_lengthof(Align0))); | 174 array_lengthof(Align0))); |
| 141 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 175 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 142 DumpMunger.getLinesWithSubstring("alloca")); | 176 DumpMunger.getLinesWithSubstring("alloca")); |
| 143 | 177 |
| 144 // Show what happens when changing alignment to 2**30. | 178 // Show what happens when changing alignment to 2**30. |
| 145 const uint64_t Align30[] = { | 179 const uint64_t Align30[] = { |
| 146 ReplaceIndex, NaClBitcodeMunger::Replace, | 180 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 147 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 181 3, naclbitc::FUNC_CODE_INST_ALLOCA, |
| 182 1, getEncAlignPower(30), | |
| 183 Terminator, | |
| 148 }; | 184 }; |
| 149 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, | 185 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, |
| 150 array_lengthof(Align30))); | 186 array_lengthof(Align30))); |
| 151 EXPECT_EQ("Error: (62:4) Invalid function record: <19 1 31>\n", | 187 EXPECT_EQ("Error: (62:4) Invalid function record: <19 1 31>\n", |
| 152 Munger.getTestResults()); | 188 Munger.getTestResults()); |
| 153 | 189 |
| 154 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, | 190 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, |
| 155 array_lengthof(Align30))); | 191 array_lengthof(Align30))); |
| 156 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 192 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 157 DumpMunger.getLinesWithSubstring("alloca")); | 193 DumpMunger.getLinesWithSubstring("alloca")); |
| 158 EXPECT_EQ( | 194 EXPECT_EQ( |
| 159 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 195 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
| 160 DumpMunger.getLinesWithSubstring("Error")); | 196 DumpMunger.getLinesWithSubstring("Error")); |
| 161 | 197 |
| 162 // Show what happens when changing alignment to 2**29. | 198 // Show what happens when changing alignment to 2**29. |
| 163 const uint64_t Align29[] = { | 199 const uint64_t Align29[] = { |
| 164 ReplaceIndex, NaClBitcodeMunger::Replace, | 200 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 165 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, | 201 3, naclbitc::FUNC_CODE_INST_ALLOCA, |
| 202 1, getEncAlignPower(29), | |
| 203 Terminator, | |
| 166 }; | 204 }; |
| 167 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, | 205 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, |
| 168 array_lengthof(Align29))); | 206 array_lengthof(Align29))); |
| 169 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, | 207 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, |
| 170 array_lengthof(Align29))); | 208 array_lengthof(Align29))); |
| 171 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", | 209 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", |
| 172 DumpMunger.getLinesWithSubstring("alloca")); | 210 DumpMunger.getLinesWithSubstring("alloca")); |
| 173 } | 211 } |
| 174 | 212 |
| 175 // Test how we recognize alignments in load i32 instructions. | 213 // Test how we recognize alignments in load i32 instructions. |
| 176 TEST(IceParseInstsTests, LoadI32Alignment) { | 214 TEST(IceParseInstsTests, LoadI32Alignment) { |
| 177 const uint64_t BitcodeRecords[] = { | 215 const uint64_t BitcodeRecords[] = { |
| 178 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 216 1, naclbitc::BLK_CODE_ENTER, |
| 179 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 217 naclbitc::MODULE_BLOCK_ID, 2, |
| 180 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, | 218 Terminator, 1, |
| 181 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 219 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, |
| 182 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, | 220 2, Terminator, |
| 183 0, naclbitc::BLK_CODE_EXIT, Terminator, | 221 3, naclbitc::TYPE_CODE_NUMENTRY, |
| 184 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, | 222 2, Terminator, |
| 185 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 223 3, naclbitc::TYPE_CODE_INTEGER, |
| 186 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 224 32, Terminator, |
| 187 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, | 225 3, naclbitc::TYPE_CODE_FUNCTION, |
| 188 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 226 0, 0, |
| 189 0, naclbitc::BLK_CODE_EXIT, Terminator, | 227 0, Terminator, |
| 190 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 228 0, naclbitc::BLK_CODE_EXIT, |
| 229 Terminator, 3, | |
| 230 naclbitc::MODULE_CODE_FUNCTION, 1, | |
| 231 0, 0, | |
| 232 0, Terminator, | |
| 233 1, naclbitc::BLK_CODE_ENTER, | |
| 234 naclbitc::FUNCTION_BLOCK_ID, 2, | |
| 235 Terminator, 3, | |
| 236 naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, | |
| 237 Terminator, 3, | |
| 238 naclbitc::FUNC_CODE_INST_LOAD, 1, | |
| 239 getEncAlignPower(0), 0, | |
| 240 Terminator, 3, | |
| 241 naclbitc::FUNC_CODE_INST_RET, 1, | |
| 242 Terminator, 0, | |
| 243 naclbitc::BLK_CODE_EXIT, Terminator, | |
| 244 0, naclbitc::BLK_CODE_EXIT, | |
| 245 Terminator}; | |
| 191 | 246 |
| 192 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | 247 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD |
| 193 | 248 |
| 194 // Show text when alignment is 1. | 249 // Show text when alignment is 1. |
| 195 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 250 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 196 Terminator); | 251 Terminator); |
| 197 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load i32 alignment 1")); | 252 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load i32 alignment 1")); |
| 198 EXPECT_EQ("module { // BlockID = 8\n" | 253 EXPECT_EQ("module { // BlockID = 8\n" |
| 199 " types { // BlockID = 17\n" | 254 " types { // BlockID = 17\n" |
| 200 " count 2;\n" | 255 " count 2;\n" |
| 201 " @t0 = i32;\n" | 256 " @t0 = i32;\n" |
| 202 " @t1 = i32 (i32);\n" | 257 " @t1 = i32 (i32);\n" |
| 203 " }\n" | 258 " }\n" |
| 204 " define external i32 @f0(i32);\n" | 259 " define external i32 @f0(i32);\n" |
| 205 " function i32 @f0(i32 %p0) { // BlockID = 12\n" | 260 " function i32 @f0(i32 %p0) { // BlockID = 12\n" |
| 206 " blocks 1;\n" | 261 " blocks 1;\n" |
| 207 " %b0:\n" | 262 " %b0:\n" |
| 208 " %v0 = load i32* %p0, align 1;\n" | 263 " %v0 = load i32* %p0, align 1;\n" |
| 209 " ret i32 %v0;\n" | 264 " ret i32 %v0;\n" |
| 210 " }\n" | 265 " }\n" |
| 211 "}\n", | 266 "}\n", |
| 212 DumpMunger.getTestResults()); | 267 DumpMunger.getTestResults()); |
| 213 IceTest::SubzeroBitcodeMunger Munger( | 268 IceTest::SubzeroBitcodeMunger Munger( |
| 214 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 269 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 215 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); | 270 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); |
| 216 | 271 |
| 217 // Show what happens when changing alignment to 0. | 272 // Show what happens when changing alignment to 0. |
| 218 const uint64_t Align0[] = { | 273 const uint64_t Align0[] = { |
| 219 ReplaceIndex, NaClBitcodeMunger::Replace, | 274 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 220 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 275 3, naclbitc::FUNC_CODE_INST_LOAD, |
| 276 1, getEncAlignZero(), | |
| 277 0, Terminator, | |
| 221 }; | 278 }; |
| 222 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, | 279 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, |
| 223 array_lengthof(Align0))); | 280 array_lengthof(Align0))); |
| 224 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | 281 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", |
| 225 Munger.getTestResults()); | 282 Munger.getTestResults()); |
| 226 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, | 283 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, |
| 227 array_lengthof(Align0))); | 284 array_lengthof(Align0))); |
| 228 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 285 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 229 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 286 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 230 DumpMunger.getLinesWithSubstring("load")); | 287 DumpMunger.getLinesWithSubstring("load")); |
| 231 | 288 |
| 232 // Show what happens when changing alignment to 4. | 289 // Show what happens when changing alignment to 4. |
| 233 const uint64_t Align4[] = { | 290 const uint64_t Align4[] = { |
| 234 ReplaceIndex, NaClBitcodeMunger::Replace, | 291 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 235 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 292 3, naclbitc::FUNC_CODE_INST_LOAD, |
| 293 1, getEncAlignPower(2), | |
| 294 0, Terminator, | |
| 236 }; | 295 }; |
| 237 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, | 296 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, |
| 238 array_lengthof(Align4))); | 297 array_lengthof(Align4))); |
| 239 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 3 0>\n", | 298 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 3 0>\n", |
| 240 Munger.getTestResults()); | 299 Munger.getTestResults()); |
| 241 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, | 300 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, |
| 242 array_lengthof(Align4))); | 301 array_lengthof(Align4))); |
| 243 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" | 302 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" |
| 244 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 303 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 245 DumpMunger.getLinesWithSubstring("load")); | 304 DumpMunger.getLinesWithSubstring("load")); |
| 246 | 305 |
| 247 // Show what happens when changing alignment to 2**29. | 306 // Show what happens when changing alignment to 2**29. |
| 248 const uint64_t Align29[] = { | 307 const uint64_t Align29[] = { |
| 249 ReplaceIndex, NaClBitcodeMunger::Replace, | 308 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 250 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 309 3, naclbitc::FUNC_CODE_INST_LOAD, |
| 310 1, getEncAlignPower(29), | |
| 311 0, Terminator, | |
| 251 }; | 312 }; |
| 252 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, | 313 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, |
| 253 array_lengthof(Align29))); | 314 array_lengthof(Align29))); |
| 254 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | 315 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", |
| 255 Munger.getTestResults()); | 316 Munger.getTestResults()); |
| 256 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", | 317 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", |
| 257 Align29, array_lengthof(Align29))); | 318 Align29, array_lengthof(Align29))); |
| 258 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" | 319 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" |
| 259 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 320 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 260 DumpMunger.getLinesWithSubstring("load")); | 321 DumpMunger.getLinesWithSubstring("load")); |
| 261 | 322 |
| 262 // Show what happens when changing alignment to 2**30. | 323 // Show what happens when changing alignment to 2**30. |
| 263 const uint64_t Align30[] = { | 324 const uint64_t Align30[] = { |
| 264 ReplaceIndex, NaClBitcodeMunger::Replace, | 325 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 265 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 326 3, naclbitc::FUNC_CODE_INST_LOAD, |
| 327 1, getEncAlignPower(30), | |
| 328 0, Terminator, | |
| 266 }; | 329 }; |
| 267 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, | 330 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, |
| 268 array_lengthof(Align30))); | 331 array_lengthof(Align30))); |
| 269 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | 332 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", |
| 270 Munger.getTestResults()); | 333 Munger.getTestResults()); |
| 271 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", | 334 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", |
| 272 Align30, array_lengthof(Align30))); | 335 Align30, array_lengthof(Align30))); |
| 273 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 336 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 274 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 337 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 275 DumpMunger.getLinesWithSubstring("load")); | 338 DumpMunger.getLinesWithSubstring("load")); |
| 276 } | 339 } |
| 277 | 340 |
| 278 // Test how we recognize alignments in load float instructions. | 341 // Test how we recognize alignments in load float instructions. |
| 279 TEST(IceParseInstsTests, LoadFloatAlignment) { | 342 TEST(IceParseInstsTests, LoadFloatAlignment) { |
| 280 const uint64_t BitcodeRecords[] = { | 343 const uint64_t BitcodeRecords[] = { |
| 281 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 344 1, naclbitc::BLK_CODE_ENTER, |
| 282 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 345 naclbitc::MODULE_BLOCK_ID, 2, |
| 283 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 346 Terminator, 1, |
| 284 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | 347 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, |
| 285 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 348 2, Terminator, |
| 286 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, Terminator, | 349 3, naclbitc::TYPE_CODE_NUMENTRY, |
| 287 0, naclbitc::BLK_CODE_EXIT, Terminator, | 350 3, Terminator, |
| 288 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 351 3, naclbitc::TYPE_CODE_FLOAT, |
| 289 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 352 Terminator, 3, |
| 290 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 353 naclbitc::TYPE_CODE_INTEGER, 32, |
| 291 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, | 354 Terminator, 3, |
| 292 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 355 naclbitc::TYPE_CODE_FUNCTION, 0, |
| 293 0, naclbitc::BLK_CODE_EXIT, Terminator, | 356 0, 1, |
| 294 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 357 Terminator, 0, |
| 358 naclbitc::BLK_CODE_EXIT, Terminator, | |
| 359 3, naclbitc::MODULE_CODE_FUNCTION, | |
| 360 2, 0, | |
| 361 0, 0, | |
| 362 Terminator, 1, | |
| 363 naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, | |
| 364 2, Terminator, | |
| 365 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, | |
| 366 1, Terminator, | |
| 367 3, naclbitc::FUNC_CODE_INST_LOAD, | |
| 368 1, getEncAlignPower(0), | |
| 369 0, Terminator, | |
| 370 3, naclbitc::FUNC_CODE_INST_RET, | |
| 371 1, Terminator, | |
| 372 0, naclbitc::BLK_CODE_EXIT, | |
| 373 Terminator, 0, | |
| 374 naclbitc::BLK_CODE_EXIT, Terminator}; | |
| 295 | 375 |
| 296 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD | 376 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD |
| 297 | 377 |
| 298 // Show text when alignment is 1. | 378 // Show text when alignment is 1. |
| 299 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 379 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 300 Terminator); | 380 Terminator); |
| 301 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 1")); | 381 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 1")); |
| 302 EXPECT_EQ("module { // BlockID = 8\n" | 382 EXPECT_EQ("module { // BlockID = 8\n" |
| 303 " types { // BlockID = 17\n" | 383 " types { // BlockID = 17\n" |
| 304 " count 3;\n" | 384 " count 3;\n" |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 315 " }\n" | 395 " }\n" |
| 316 "}\n", | 396 "}\n", |
| 317 DumpMunger.getTestResults()); | 397 DumpMunger.getTestResults()); |
| 318 IceTest::SubzeroBitcodeMunger Munger( | 398 IceTest::SubzeroBitcodeMunger Munger( |
| 319 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 399 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 320 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); | 400 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); |
| 321 | 401 |
| 322 // Show what happens when changing alignment to 0. | 402 // Show what happens when changing alignment to 0. |
| 323 const uint64_t Align0[] = { | 403 const uint64_t Align0[] = { |
| 324 ReplaceIndex, NaClBitcodeMunger::Replace, | 404 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 325 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 405 3, naclbitc::FUNC_CODE_INST_LOAD, |
| 406 1, getEncAlignZero(), | |
| 407 0, Terminator, | |
| 326 }; | 408 }; |
| 327 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, | 409 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, |
| 328 array_lengthof(Align0))); | 410 array_lengthof(Align0))); |
| 329 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | 411 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", |
| 330 Munger.getTestResults()); | 412 Munger.getTestResults()); |
| 331 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", | 413 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", |
| 332 Align0, array_lengthof(Align0))); | 414 Align0, array_lengthof(Align0))); |
| 333 EXPECT_EQ( | 415 EXPECT_EQ(" %v0 = load float* %p0, align 0;\n" |
| 334 " %v0 = load float* %p0, align 0;\n" | 416 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 335 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 417 DumpMunger.getLinesWithSubstring("load")); |
| 336 DumpMunger.getLinesWithSubstring("load")); | |
| 337 | 418 |
| 338 // Show what happens when changing alignment to 4. | 419 // Show what happens when changing alignment to 4. |
| 339 const uint64_t Align4[] = { | 420 const uint64_t Align4[] = { |
| 340 ReplaceIndex, NaClBitcodeMunger::Replace, | 421 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 341 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 422 3, naclbitc::FUNC_CODE_INST_LOAD, |
| 423 1, getEncAlignPower(2), | |
| 424 0, Terminator, | |
| 342 }; | 425 }; |
| 343 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, | 426 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, |
| 344 array_lengthof(Align4))); | 427 array_lengthof(Align4))); |
| 345 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", | 428 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", |
| 346 Align4, array_lengthof(Align4))); | 429 Align4, array_lengthof(Align4))); |
| 347 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | 430 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
| 348 DumpMunger.getLinesWithSubstring("load")); | 431 DumpMunger.getLinesWithSubstring("load")); |
| 349 | 432 |
| 350 const uint64_t Align29[] = { | 433 const uint64_t Align29[] = { |
| 351 ReplaceIndex, NaClBitcodeMunger::Replace, | 434 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 352 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 435 3, naclbitc::FUNC_CODE_INST_LOAD, |
| 436 1, getEncAlignPower(29), | |
| 437 0, Terminator, | |
| 353 }; | 438 }; |
| 354 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, | 439 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, |
| 355 array_lengthof(Align29))); | 440 array_lengthof(Align29))); |
| 356 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | 441 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", |
| 357 Munger.getTestResults()); | 442 Munger.getTestResults()); |
| 358 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", | 443 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", |
| 359 Align29, array_lengthof(Align29))); | 444 Align29, array_lengthof(Align29))); |
| 360 EXPECT_EQ( | 445 EXPECT_EQ(" %v0 = load float* %p0, align 536870912;\n" |
| 361 " %v0 = load float* %p0, align 536870912;\n" | 446 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 362 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 447 DumpMunger.getLinesWithSubstring("load")); |
| 363 DumpMunger.getLinesWithSubstring("load")); | |
| 364 | 448 |
| 365 // Show what happens when changing alignment to 2**30. | 449 // Show what happens when changing alignment to 2**30. |
| 366 const uint64_t Align30[] = { | 450 const uint64_t Align30[] = { |
| 367 ReplaceIndex, NaClBitcodeMunger::Replace, | 451 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 368 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 452 3, naclbitc::FUNC_CODE_INST_LOAD, |
| 453 1, getEncAlignPower(30), | |
| 454 0, Terminator, | |
| 369 }; | 455 }; |
| 370 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, | 456 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, |
| 371 array_lengthof(Align30))); | 457 array_lengthof(Align30))); |
| 372 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | 458 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", |
| 373 Munger.getTestResults()); | 459 Munger.getTestResults()); |
| 374 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", | 460 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", |
| 375 Align30, array_lengthof(Align30))); | 461 Align30, array_lengthof(Align30))); |
| 376 EXPECT_EQ( | 462 EXPECT_EQ(" %v0 = load float* %p0, align 0;\n" |
| 377 " %v0 = load float* %p0, align 0;\n" | 463 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 378 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 464 DumpMunger.getLinesWithSubstring("load")); |
| 379 DumpMunger.getLinesWithSubstring("load")); | |
| 380 } | 465 } |
| 381 | 466 |
| 382 // Test how we recognize alignments in store instructions. | 467 // Test how we recognize alignments in store instructions. |
| 383 TEST(NaClParseInstsTests, StoreAlignment) { | 468 TEST(NaClParseInstsTests, StoreAlignment) { |
| 384 const uint64_t BitcodeRecords[] = { | 469 const uint64_t BitcodeRecords[] = { |
| 385 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 470 1, naclbitc::BLK_CODE_ENTER, |
| 386 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 471 naclbitc::MODULE_BLOCK_ID, 2, |
| 387 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 472 Terminator, 1, |
| 388 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | 473 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, |
| 389 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 474 2, Terminator, |
| 390 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, | 475 3, naclbitc::TYPE_CODE_NUMENTRY, |
| 391 0, naclbitc::BLK_CODE_EXIT, Terminator, | 476 3, Terminator, |
| 392 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 477 3, naclbitc::TYPE_CODE_FLOAT, |
| 393 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 478 Terminator, 3, |
| 394 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 479 naclbitc::TYPE_CODE_INTEGER, 32, |
| 395 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator, | 480 Terminator, 3, |
| 396 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 481 naclbitc::TYPE_CODE_FUNCTION, 0, |
| 397 0, naclbitc::BLK_CODE_EXIT, Terminator, | 482 0, 1, |
| 398 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 483 0, Terminator, |
| 484 0, naclbitc::BLK_CODE_EXIT, | |
| 485 Terminator, 3, | |
| 486 naclbitc::MODULE_CODE_FUNCTION, 2, | |
| 487 0, 0, | |
| 488 0, Terminator, | |
| 489 1, naclbitc::BLK_CODE_ENTER, | |
| 490 naclbitc::FUNCTION_BLOCK_ID, 2, | |
| 491 Terminator, 3, | |
| 492 naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, | |
| 493 Terminator, 3, | |
| 494 naclbitc::FUNC_CODE_INST_STORE, 2, | |
| 495 1, getEncAlignPower(0), | |
| 496 Terminator, 3, | |
| 497 naclbitc::FUNC_CODE_INST_RET, 1, | |
| 498 Terminator, 0, | |
| 499 naclbitc::BLK_CODE_EXIT, Terminator, | |
| 500 0, naclbitc::BLK_CODE_EXIT, | |
| 501 Terminator}; | |
| 399 | 502 |
| 400 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE | 503 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE |
| 401 | 504 |
| 402 // Show text when alignment is 1. | 505 // Show text when alignment is 1. |
| 403 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 506 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 404 Terminator); | 507 Terminator); |
| 405 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good Store Alignment 1")); | 508 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good Store Alignment 1")); |
| 406 EXPECT_EQ("module { // BlockID = 8\n" | 509 EXPECT_EQ("module { // BlockID = 8\n" |
| 407 " types { // BlockID = 17\n" | 510 " types { // BlockID = 17\n" |
| 408 " count 3;\n" | 511 " count 3;\n" |
| 409 " @t0 = float;\n" | 512 " @t0 = float;\n" |
| 410 " @t1 = i32;\n" | 513 " @t1 = i32;\n" |
| 411 " @t2 = float (i32, float);\n" | 514 " @t2 = float (i32, float);\n" |
| 412 " }\n" | 515 " }\n" |
| 413 " define external float @f0(i32, float);\n" | 516 " define external float @f0(i32, float);\n" |
| 414 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" | 517 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" |
| 415 " blocks 1;\n" | 518 " blocks 1;\n" |
| 416 " %b0:\n" | 519 " %b0:\n" |
| 417 " store float %p1, float* %p0, align 1;\n" | 520 " store float %p1, float* %p0, align 1;\n" |
| 418 " ret float %p1;\n" | 521 " ret float %p1;\n" |
| 419 " }\n" | 522 " }\n" |
| 420 "}\n", | 523 "}\n", |
| 421 DumpMunger.getTestResults()); | 524 DumpMunger.getTestResults()); |
| 422 IceTest::SubzeroBitcodeMunger Munger( | 525 IceTest::SubzeroBitcodeMunger Munger( |
| 423 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 526 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 424 EXPECT_TRUE(Munger.runTest("Good store alignment")); | 527 EXPECT_TRUE(Munger.runTest("Good store alignment")); |
| 425 | 528 |
| 426 // Show what happens when changing alignment to 0. | 529 // Show what happens when changing alignment to 0. |
| 427 const uint64_t Align0[] = { | 530 const uint64_t Align0[] = { |
| 428 ReplaceIndex, NaClBitcodeMunger::Replace, | 531 ReplaceIndex, NaClBitcodeMunger::Replace, 3, |
| 429 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 532 naclbitc::FUNC_CODE_INST_STORE, 2, 1, |
| 533 getEncAlignZero(), Terminator, | |
| 430 }; | 534 }; |
| 431 EXPECT_FALSE( | 535 EXPECT_FALSE( |
| 432 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); | 536 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); |
| 433 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 0>\n", | 537 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 0>\n", |
| 434 Munger.getTestResults()); | 538 Munger.getTestResults()); |
| 435 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, | 539 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, |
| 436 array_lengthof(Align0))); | 540 array_lengthof(Align0))); |
| 437 EXPECT_EQ( | 541 EXPECT_EQ( |
| 438 " store float %p1, float* %p0, align 0;\n" | 542 " store float %p1, float* %p0, align 0;\n" |
| 439 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 543 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 440 DumpMunger.getLinesWithSubstring("store")); | 544 DumpMunger.getLinesWithSubstring("store")); |
| 441 | 545 |
| 442 // Show what happens when changing alignment to 4. | 546 // Show what happens when changing alignment to 4. |
| 443 const uint64_t Align4[] = { | 547 const uint64_t Align4[] = { |
| 444 ReplaceIndex, NaClBitcodeMunger::Replace, | 548 ReplaceIndex, NaClBitcodeMunger::Replace, 3, |
| 445 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, | 549 naclbitc::FUNC_CODE_INST_STORE, 2, 1, |
| 550 getEncAlignPower(2), Terminator, | |
| 446 }; | 551 }; |
| 447 EXPECT_TRUE( | 552 EXPECT_TRUE( |
| 448 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); | 553 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); |
| 449 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, | 554 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, |
| 450 array_lengthof(Align4))); | 555 array_lengthof(Align4))); |
| 451 | 556 |
| 452 // Show what happens when changing alignment to 8. | 557 // Show what happens when changing alignment to 8. |
| 453 const uint64_t Align8[] = { | 558 const uint64_t Align8[] = { |
| 454 ReplaceIndex, NaClBitcodeMunger::Replace, | 559 ReplaceIndex, NaClBitcodeMunger::Replace, 3, |
| 455 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, | 560 naclbitc::FUNC_CODE_INST_STORE, 2, 1, |
| 561 getEncAlignPower(3), Terminator, | |
| 456 }; | 562 }; |
| 457 EXPECT_FALSE( | 563 EXPECT_FALSE( |
| 458 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); | 564 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); |
| 459 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 4>\n", | 565 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 4>\n", |
| 460 Munger.getTestResults()); | 566 Munger.getTestResults()); |
| 461 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, | 567 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, |
| 462 array_lengthof(Align8))); | 568 array_lengthof(Align8))); |
| 463 EXPECT_EQ( | 569 EXPECT_EQ( |
| 464 " store float %p1, float* %p0, align 8;\n" | 570 " store float %p1, float* %p0, align 8;\n" |
| 465 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 571 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 466 DumpMunger.getLinesWithSubstring("store")); | 572 DumpMunger.getLinesWithSubstring("store")); |
| 467 | 573 |
| 468 // Show what happens when changing alignment to 2**29. | 574 // Show what happens when changing alignment to 2**29. |
| 469 const uint64_t Align29[] = { | 575 const uint64_t Align29[] = { |
| 470 ReplaceIndex, NaClBitcodeMunger::Replace, | 576 ReplaceIndex, NaClBitcodeMunger::Replace, 3, |
| 471 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, | 577 naclbitc::FUNC_CODE_INST_STORE, 2, 1, |
| 578 getEncAlignPower(29), Terminator, | |
| 472 }; | 579 }; |
| 473 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, | 580 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, |
| 474 array_lengthof(Align29))); | 581 array_lengthof(Align29))); |
| 475 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 30>\n", | 582 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 30>\n", |
| 476 Munger.getTestResults()); | 583 Munger.getTestResults()); |
| 477 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, | 584 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, |
| 478 array_lengthof(Align29))); | 585 array_lengthof(Align29))); |
| 479 EXPECT_EQ( | 586 EXPECT_EQ( |
| 480 " store float %p1, float* %p0, align 536870912;\n" | 587 " store float %p1, float* %p0, align 536870912;\n" |
| 481 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 588 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 482 DumpMunger.getLinesWithSubstring("store")); | 589 DumpMunger.getLinesWithSubstring("store")); |
| 483 | 590 |
| 484 const uint64_t Align30[] = { | 591 const uint64_t Align30[] = { |
| 485 ReplaceIndex, NaClBitcodeMunger::Replace, | 592 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 486 // Note: alignment stored as 0 or log2(Alignment)+1. | 593 // Note: alignment stored as 0 or log2(Alignment)+1. |
| 487 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 594 3, naclbitc::FUNC_CODE_INST_STORE, 2, |
| 595 1, getEncAlignPower(30), Terminator, | |
| 488 }; | 596 }; |
| 489 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, | 597 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, |
| 490 array_lengthof(Align30))); | 598 array_lengthof(Align30))); |
| 491 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 31>\n", | 599 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 31>\n", |
| 492 Munger.getTestResults()); | 600 Munger.getTestResults()); |
| 493 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, | 601 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, |
| 494 array_lengthof(Align30))); | 602 array_lengthof(Align30))); |
| 495 EXPECT_EQ( | 603 EXPECT_EQ( |
| 496 " store float %p1, float* %p0, align 0;\n" | 604 " store float %p1, float* %p0, align 0;\n" |
| 497 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 605 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 498 DumpMunger.getLinesWithSubstring("store")); | 606 DumpMunger.getLinesWithSubstring("store")); |
| 499 } | 607 } |
| 500 | 608 |
| 501 } // end of anonymous namespace | 609 } // end of anonymous namespace |
| OLD | NEW |