| 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 <string> |
| 11 |
| 10 #include "llvm/ADT/STLExtras.h" | 12 #include "llvm/ADT/STLExtras.h" |
| 11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" | 13 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" |
| 12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" | 14 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" |
| 13 | 15 |
| 14 #include "BitcodeMunge.h" | 16 #include "BitcodeMunge.h" |
| 15 #include "unittests/Bitcode/NaClMungeTest.h" | 17 #include "unittests/Bitcode/NaClMungeTest.h" |
| 16 | 18 |
| 17 using namespace llvm; | 19 using namespace llvm; |
| 18 using namespace naclmungetest; | 20 using namespace naclmungetest; |
| 19 | 21 |
| 20 namespace { | 22 namespace { |
| 21 | 23 |
| 24 // The ParseError constant is passed to the BitcodeMunger to prevent translation |
| 25 // when we expect a Parse error. |
| 26 constexpr bool ParseError = true; |
| 27 |
| 22 // Note: alignment stored as 0 or log2(Alignment)+1. | 28 // Note: alignment stored as 0 or log2(Alignment)+1. |
| 23 uint64_t getEncAlignPower(unsigned Power) { | 29 uint64_t getEncAlignPower(unsigned Power) { |
| 24 return Power + 1; | 30 return Power + 1; |
| 25 } | 31 } |
| 26 uint64_t getEncAlignZero() { return 0; } | 32 uint64_t getEncAlignZero() { return 0; } |
| 27 | 33 |
| 28 /// Test how we report a call arg that refers to nonexistent call argument | 34 /// Test how we report a call arg that refers to nonexistent call argument |
| 29 TEST(IceParseInstsTest, NonexistentCallArg) { | 35 TEST(IceParseInstsTest, NonexistentCallArg) { |
| 30 const uint64_t BitcodeRecords[] = { | 36 const uint64_t BitcodeRecords[] = { |
| 31 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 37 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 49 // Show bitcode objdump for BitcodeRecords. | 55 // Show bitcode objdump for BitcodeRecords. |
| 50 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); | 56 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 51 EXPECT_FALSE(DumpMunger.runTest()); | 57 EXPECT_FALSE(DumpMunger.runTest()); |
| 52 EXPECT_EQ(" 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 " | 58 EXPECT_EQ(" 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 " |
| 53 "%p0, i32 @f0);\n" | 59 "%p0, i32 @f0);\n" |
| 54 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n", | 60 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n", |
| 55 DumpMunger.getLinesWithSubstring("66:4")); | 61 DumpMunger.getLinesWithSubstring("66:4")); |
| 56 | 62 |
| 57 // Show that we get appropriate error when parsing in Subzero. | 63 // Show that we get appropriate error when parsing in Subzero. |
| 58 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); | 64 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 59 EXPECT_FALSE(Munger.runTest()); | 65 EXPECT_FALSE(Munger.runTest(ParseError)); |
| 60 EXPECT_EQ("Error(66:4): Invalid function record: <34 0 4 2 100>\n", | 66 EXPECT_EQ("Error(66:4): Invalid function record: <34 0 4 2 100>\n", |
| 61 Munger.getTestResults()); | 67 Munger.getTestResults()); |
| 62 | 68 |
| 63 // Show that we generate a fatal error when not allowing error recovery. | 69 // Show that we generate a fatal error when not allowing error recovery. |
| 64 Munger.Flags.setAllowErrorRecovery(false); | 70 Munger.Flags.setAllowErrorRecovery(false); |
| 65 EXPECT_DEATH(Munger.runTest(), ".*ERROR: Unable to continue.*"); | 71 EXPECT_DEATH(Munger.runTest(ParseError), ".*ERROR: Unable to continue.*"); |
| 66 } | 72 } |
| 67 | 73 |
| 68 /// Test how we recognize alignments in alloca instructions. | 74 /// Test how we recognize alignments in alloca instructions. |
| 69 TEST(IceParseInstsTests, AllocaAlignment) { | 75 TEST(IceParseInstsTests, AllocaAlignment) { |
| 70 const uint64_t BitcodeRecords[] = { | 76 const uint64_t BitcodeRecords[] = { |
| 71 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 77 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 72 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 78 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 73 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | 79 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
| 74 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 80 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 75 3, naclbitc::TYPE_CODE_VOID, Terminator, | 81 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 105 EXPECT_TRUE(Munger.runTest(ARRAY(Align0))); | 111 EXPECT_TRUE(Munger.runTest(ARRAY(Align0))); |
| 106 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0))); | 112 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 107 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 113 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 108 DumpMunger.getLinesWithSubstring("alloca")); | 114 DumpMunger.getLinesWithSubstring("alloca")); |
| 109 | 115 |
| 110 // Show what happens when changing alignment to 2**30. | 116 // Show what happens when changing alignment to 2**30. |
| 111 const uint64_t Align30[] = { | 117 const uint64_t Align30[] = { |
| 112 ReplaceIndex, NaClMungedBitcode::Replace, | 118 ReplaceIndex, NaClMungedBitcode::Replace, |
| 113 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 119 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
| 114 }; | 120 }; |
| 115 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); | 121 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError)); |
| 116 EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", | 122 EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", |
| 117 Munger.getTestResults()); | 123 Munger.getTestResults()); |
| 118 | 124 |
| 119 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); | 125 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 120 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 126 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 121 DumpMunger.getLinesWithSubstring("alloca")); | 127 DumpMunger.getLinesWithSubstring("alloca")); |
| 122 EXPECT_EQ( | 128 EXPECT_EQ( |
| 123 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 129 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
| 124 DumpMunger.getLinesWithSubstring("Error")); | 130 DumpMunger.getLinesWithSubstring("Error")); |
| 125 | 131 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 "align 1;\n", | 166 "align 1;\n", |
| 161 DumpMunger.getLinesWithSubstring("58:4")); | 167 DumpMunger.getLinesWithSubstring("58:4")); |
| 162 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); | 168 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 163 EXPECT_TRUE(Munger.runTest()); | 169 EXPECT_TRUE(Munger.runTest()); |
| 164 | 170 |
| 165 // Show what happens when changing alignment to 0. | 171 // Show what happens when changing alignment to 0. |
| 166 const uint64_t Align0[] = { | 172 const uint64_t Align0[] = { |
| 167 ReplaceIndex, NaClMungedBitcode::Replace, | 173 ReplaceIndex, NaClMungedBitcode::Replace, |
| 168 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 174 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 169 }; | 175 }; |
| 170 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); | 176 EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError)); |
| 171 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", | 177 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
| 172 Munger.getTestResults()); | 178 Munger.getTestResults()); |
| 173 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); | 179 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 174 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 180 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 175 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 181 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 176 DumpMunger.getLinesWithSubstring("load")); | 182 DumpMunger.getLinesWithSubstring("load")); |
| 177 | 183 |
| 178 // Show what happens when changing alignment to 4. | 184 // Show what happens when changing alignment to 4. |
| 179 const uint64_t Align4[] = { | 185 const uint64_t Align4[] = { |
| 180 ReplaceIndex, NaClMungedBitcode::Replace, | 186 ReplaceIndex, NaClMungedBitcode::Replace, |
| 181 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 187 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 182 }; | 188 }; |
| 183 EXPECT_FALSE(Munger.runTest(ARRAY(Align4))); | 189 EXPECT_FALSE(Munger.runTest(ARRAY(Align4), ParseError)); |
| 184 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", | 190 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", |
| 185 Munger.getTestResults()); | 191 Munger.getTestResults()); |
| 186 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4))); | 192 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
| 187 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" | 193 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" |
| 188 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 194 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 189 DumpMunger.getLinesWithSubstring("load")); | 195 DumpMunger.getLinesWithSubstring("load")); |
| 190 | 196 |
| 191 // Show what happens when changing alignment to 2**29. | 197 // Show what happens when changing alignment to 2**29. |
| 192 const uint64_t Align29[] = { | 198 const uint64_t Align29[] = { |
| 193 ReplaceIndex, NaClMungedBitcode::Replace, | 199 ReplaceIndex, NaClMungedBitcode::Replace, |
| 194 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 200 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 195 }; | 201 }; |
| 196 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); | 202 EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError)); |
| 197 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", | 203 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
| 198 Munger.getTestResults()); | 204 Munger.getTestResults()); |
| 199 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); | 205 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 200 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" | 206 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" |
| 201 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 207 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 202 DumpMunger.getLinesWithSubstring("load")); | 208 DumpMunger.getLinesWithSubstring("load")); |
| 203 | 209 |
| 204 // Show what happens when changing alignment to 2**30. | 210 // Show what happens when changing alignment to 2**30. |
| 205 const uint64_t Align30[] = { | 211 const uint64_t Align30[] = { |
| 206 ReplaceIndex, NaClMungedBitcode::Replace, | 212 ReplaceIndex, NaClMungedBitcode::Replace, |
| 207 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 213 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 208 }; | 214 }; |
| 209 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); | 215 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError)); |
| 210 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", | 216 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
| 211 Munger.getTestResults()); | 217 Munger.getTestResults()); |
| 212 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); | 218 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 213 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 219 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 214 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 220 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 215 DumpMunger.getLinesWithSubstring("load")); | 221 DumpMunger.getLinesWithSubstring("load")); |
| 216 } | 222 } |
| 217 | 223 |
| 218 // Test how we recognize alignments in load float instructions. | 224 // Test how we recognize alignments in load float instructions. |
| 219 TEST(IceParseInstsTests, LoadFloatAlignment) { | 225 TEST(IceParseInstsTests, LoadFloatAlignment) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 242 "%p0, align 1;\n", | 248 "%p0, align 1;\n", |
| 243 DumpMunger.getLinesWithSubstring("58:4")); | 249 DumpMunger.getLinesWithSubstring("58:4")); |
| 244 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); | 250 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 245 EXPECT_TRUE(Munger.runTest()); | 251 EXPECT_TRUE(Munger.runTest()); |
| 246 | 252 |
| 247 // Show what happens when changing alignment to 0. | 253 // Show what happens when changing alignment to 0. |
| 248 const uint64_t Align0[] = { | 254 const uint64_t Align0[] = { |
| 249 ReplaceIndex, NaClMungedBitcode::Replace, | 255 ReplaceIndex, NaClMungedBitcode::Replace, |
| 250 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 256 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 251 }; | 257 }; |
| 252 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); | 258 EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError)); |
| 253 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", | 259 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
| 254 Munger.getTestResults()); | 260 Munger.getTestResults()); |
| 255 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); | 261 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 256 EXPECT_EQ( | 262 EXPECT_EQ( |
| 257 " %v0 = load float* %p0, align 0;\n" | 263 " %v0 = load float* %p0, align 0;\n" |
| 258 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 264 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 259 DumpMunger.getLinesWithSubstring("load")); | 265 DumpMunger.getLinesWithSubstring("load")); |
| 260 | 266 |
| 261 // Show what happens when changing alignment to 4. | 267 // Show what happens when changing alignment to 4. |
| 262 const uint64_t Align4[] = { | 268 const uint64_t Align4[] = { |
| 263 ReplaceIndex, NaClMungedBitcode::Replace, | 269 ReplaceIndex, NaClMungedBitcode::Replace, |
| 264 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 270 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 265 }; | 271 }; |
| 266 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); | 272 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); |
| 267 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); | 273 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
| 268 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | 274 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
| 269 DumpMunger.getLinesWithSubstring("load")); | 275 DumpMunger.getLinesWithSubstring("load")); |
| 270 | 276 |
| 271 const uint64_t Align29[] = { | 277 const uint64_t Align29[] = { |
| 272 ReplaceIndex, NaClMungedBitcode::Replace, | 278 ReplaceIndex, NaClMungedBitcode::Replace, |
| 273 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 279 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 274 }; | 280 }; |
| 275 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); | 281 EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError)); |
| 276 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", | 282 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
| 277 Munger.getTestResults()); | 283 Munger.getTestResults()); |
| 278 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); | 284 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 279 EXPECT_EQ( | 285 EXPECT_EQ( |
| 280 " %v0 = load float* %p0, align 536870912;\n" | 286 " %v0 = load float* %p0, align 536870912;\n" |
| 281 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 287 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 282 DumpMunger.getLinesWithSubstring("load")); | 288 DumpMunger.getLinesWithSubstring("load")); |
| 283 | 289 |
| 284 // Show what happens when changing alignment to 2**30. | 290 // Show what happens when changing alignment to 2**30. |
| 285 const uint64_t Align30[] = { | 291 const uint64_t Align30[] = { |
| 286 ReplaceIndex, NaClMungedBitcode::Replace, | 292 ReplaceIndex, NaClMungedBitcode::Replace, |
| 287 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 293 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 288 }; | 294 }; |
| 289 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); | 295 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError)); |
| 290 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", | 296 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
| 291 Munger.getTestResults()); | 297 Munger.getTestResults()); |
| 292 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); | 298 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 293 EXPECT_EQ( | 299 EXPECT_EQ( |
| 294 " %v0 = load float* %p0, align 0;\n" | 300 " %v0 = load float* %p0, align 0;\n" |
| 295 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 301 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 296 DumpMunger.getLinesWithSubstring("load")); | 302 DumpMunger.getLinesWithSubstring("load")); |
| 297 } | 303 } |
| 298 | 304 |
| 299 // Test how we recognize alignments in store instructions. | 305 // Test how we recognize alignments in store instructions. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 325 DumpMunger.getLinesWithSubstring("62:4")); | 331 DumpMunger.getLinesWithSubstring("62:4")); |
| 326 IceTest::SubzeroBitcodeMunger Munger( | 332 IceTest::SubzeroBitcodeMunger Munger( |
| 327 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 333 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 328 EXPECT_TRUE(Munger.runTest()); | 334 EXPECT_TRUE(Munger.runTest()); |
| 329 | 335 |
| 330 // Show what happens when changing alignment to 0. | 336 // Show what happens when changing alignment to 0. |
| 331 const uint64_t Align0[] = { | 337 const uint64_t Align0[] = { |
| 332 ReplaceIndex, NaClMungedBitcode::Replace, | 338 ReplaceIndex, NaClMungedBitcode::Replace, |
| 333 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 339 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
| 334 }; | 340 }; |
| 335 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); | 341 EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError)); |
| 336 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", | 342 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", |
| 337 Munger.getTestResults()); | 343 Munger.getTestResults()); |
| 338 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); | 344 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 339 EXPECT_EQ( | 345 EXPECT_EQ( |
| 340 " store float %p1, float* %p0, align 0;\n" | 346 " store float %p1, float* %p0, align 0;\n" |
| 341 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 347 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 342 DumpMunger.getLinesWithSubstring("store")); | 348 DumpMunger.getLinesWithSubstring("store")); |
| 343 | 349 |
| 344 // Show what happens when changing alignment to 4. | 350 // Show what happens when changing alignment to 4. |
| 345 const uint64_t Align4[] = { | 351 const uint64_t Align4[] = { |
| 346 ReplaceIndex, NaClMungedBitcode::Replace, | 352 ReplaceIndex, NaClMungedBitcode::Replace, |
| 347 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, | 353 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, |
| 348 }; | 354 }; |
| 349 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); | 355 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); |
| 350 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); | 356 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
| 351 | 357 |
| 352 // Show what happens when changing alignment to 8. | 358 // Show what happens when changing alignment to 8. |
| 353 const uint64_t Align8[] = { | 359 const uint64_t Align8[] = { |
| 354 ReplaceIndex, NaClMungedBitcode::Replace, | 360 ReplaceIndex, NaClMungedBitcode::Replace, |
| 355 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, | 361 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, |
| 356 }; | 362 }; |
| 357 EXPECT_FALSE(Munger.runTest(ARRAY(Align8))); | 363 EXPECT_FALSE(Munger.runTest(ARRAY(Align8), ParseError)); |
| 358 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", | 364 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", |
| 359 Munger.getTestResults()); | 365 Munger.getTestResults()); |
| 360 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8))); | 366 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8))); |
| 361 EXPECT_EQ( | 367 EXPECT_EQ( |
| 362 " store float %p1, float* %p0, align 8;\n" | 368 " store float %p1, float* %p0, align 8;\n" |
| 363 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 369 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 364 DumpMunger.getLinesWithSubstring("store")); | 370 DumpMunger.getLinesWithSubstring("store")); |
| 365 | 371 |
| 366 // Show what happens when changing alignment to 2**29. | 372 // Show what happens when changing alignment to 2**29. |
| 367 const uint64_t Align29[] = { | 373 const uint64_t Align29[] = { |
| 368 ReplaceIndex, NaClMungedBitcode::Replace, | 374 ReplaceIndex, NaClMungedBitcode::Replace, |
| 369 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, | 375 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, |
| 370 }; | 376 }; |
| 371 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); | 377 EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError)); |
| 372 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", | 378 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", |
| 373 Munger.getTestResults()); | 379 Munger.getTestResults()); |
| 374 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); | 380 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 375 EXPECT_EQ( | 381 EXPECT_EQ( |
| 376 " store float %p1, float* %p0, align 536870912;\n" | 382 " store float %p1, float* %p0, align 536870912;\n" |
| 377 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 383 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 378 DumpMunger.getLinesWithSubstring("store")); | 384 DumpMunger.getLinesWithSubstring("store")); |
| 379 | 385 |
| 380 const uint64_t Align30[] = { | 386 const uint64_t Align30[] = { |
| 381 ReplaceIndex, NaClMungedBitcode::Replace, | 387 ReplaceIndex, NaClMungedBitcode::Replace, |
| 382 // Note: alignment stored as 0 or log2(Alignment)+1. | 388 // Note: alignment stored as 0 or log2(Alignment)+1. |
| 383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 389 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
| 384 }; | 390 }; |
| 385 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); | 391 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError)); |
| 386 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", | 392 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", |
| 387 Munger.getTestResults()); | 393 Munger.getTestResults()); |
| 388 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); | 394 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 389 EXPECT_EQ( | 395 EXPECT_EQ( |
| 390 " store float %p1, float* %p0, align 0;\n" | 396 " store float %p1, float* %p0, align 0;\n" |
| 391 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 397 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 392 DumpMunger.getLinesWithSubstring("store")); | 398 DumpMunger.getLinesWithSubstring("store")); |
| 393 } | 399 } |
| 394 | 400 |
| 395 } // end of anonymous namespace | 401 } // end of anonymous namespace |
| OLD | NEW |