| 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" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 34 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 35 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 35 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
| 36 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 36 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 37 3, naclbitc::TYPE_CODE_VOID, Terminator, | 37 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| 38 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, | 38 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, |
| 39 0, naclbitc::BLK_CODE_EXIT, Terminator, | 39 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 40 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, | 40 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, |
| 41 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 41 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 42 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 42 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 43 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 43 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 44 // Note: 100 is a bad value index in next line. | 44 // Note: 100 is a bad value index in next line. |
| 45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
| 46 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 46 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 47 0, naclbitc::BLK_CODE_EXIT, Terminator, | 47 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 48 0, naclbitc::BLK_CODE_EXIT, Terminator | 48 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 49 }; | 49 }; |
| 50 | 50 |
| 51 // Show bitcode objdump for BitcodeRecords. | 51 // Show bitcode objdump for BitcodeRecords. |
| 52 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 52 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
| 53 array_lengthof(BitcodeRecords), Terminator); | 53 array_lengthof(BitcodeRecords), Terminator); |
| 54 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); | 54 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); |
| 55 EXPECT_EQ( | 55 EXPECT_EQ( |
| 56 "module { // BlockID = 8\n" | 56 "module { // BlockID = 8\n" |
| 57 " types { // BlockID = 17\n" | 57 " types { // BlockID = 17\n" |
| 58 " count 3;\n" | 58 " count 3;\n" |
| 59 " @t0 = i32;\n" | 59 " @t0 = i32;\n" |
| 60 " @t1 = void;\n" | 60 " @t1 = void;\n" |
| 61 " @t2 = void (i32, i32);\n" | 61 " @t2 = void (i32, i32);\n" |
| 62 " }\n" | 62 " }\n" |
| 63 " declare external void @f0(i32, i32);\n" | 63 " declare external void @f0(i32, i32);\n" |
| 64 " define external void @f1(i32, i32);\n" | 64 " define external void @f1(i32, i32);\n" |
| 65 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" | 65 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" |
| 66 " blocks 1;\n" | 66 " blocks 1;\n" |
| 67 " %b0:\n" | 67 " %b0:\n" |
| 68 " call void @f0(i32 %p0, i32 @f0);\n" | 68 " call void @f0(i32 %p0, i32 @f0);\n" |
| 69 "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" |
| 70 " ret void;\n" | 70 " ret void;\n" |
| 71 " }\n" | 71 " }\n" |
| 72 "}\n", | 72 "}\n", |
| 73 DumpMunger.getTestResults()); | 73 DumpMunger.getTestResults()); |
| 74 | 74 |
| 75 // Show that we get appropriate error when parsing in Subzero. | 75 // Show that we get appropriate error when parsing in Subzero. |
| 76 IceTest::SubzeroBitcodeMunger Munger( | 76 IceTest::SubzeroBitcodeMunger Munger( |
| 77 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 77 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 78 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); | 78 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); |
| 79 EXPECT_EQ( | 79 EXPECT_EQ( |
| 80 "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", |
| 81 Munger.getTestResults()); | 81 Munger.getTestResults()); |
| 82 } | 82 } |
| 83 | 83 |
| 84 /// Test how we recognize alignments in alloca instructions. | 84 /// Test how we recognize alignments in alloca instructions. |
| 85 TEST(IceParseInstsTests, AllocaAlignment) { | 85 TEST(IceParseInstsTests, AllocaAlignment) { |
| 86 const uint64_t BitcodeRecords[] = { | 86 const uint64_t BitcodeRecords[] = { |
| 87 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 87 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 88 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 88 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 89 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | 89 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
| 90 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 90 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 91 3, naclbitc::TYPE_CODE_VOID, Terminator, | 91 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 325 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 326 }; | 326 }; |
| 327 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, | 327 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, |
| 328 array_lengthof(Align0))); | 328 array_lengthof(Align0))); |
| 329 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | 329 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", |
| 330 Munger.getTestResults()); | 330 Munger.getTestResults()); |
| 331 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", | 331 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", |
| 332 Align0, array_lengthof(Align0))); | 332 Align0, array_lengthof(Align0))); |
| 333 EXPECT_EQ( | 333 EXPECT_EQ( |
| 334 " %v0 = load float* %p0, align 0;\n" | 334 " %v0 = load float* %p0, align 0;\n" |
| 335 "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", |
| 336 DumpMunger.getLinesWithSubstring("load")); | 336 DumpMunger.getLinesWithSubstring("load")); |
| 337 | 337 |
| 338 // Show what happens when changing alignment to 4. | 338 // Show what happens when changing alignment to 4. |
| 339 const uint64_t Align4[] = { | 339 const uint64_t Align4[] = { |
| 340 ReplaceIndex, NaClBitcodeMunger::Replace, | 340 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 341 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 341 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 342 }; | 342 }; |
| 343 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, | 343 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, |
| 344 array_lengthof(Align4))); | 344 array_lengthof(Align4))); |
| 345 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", | 345 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", |
| 346 Align4, array_lengthof(Align4))); | 346 Align4, array_lengthof(Align4))); |
| 347 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | 347 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
| 348 DumpMunger.getLinesWithSubstring("load")); | 348 DumpMunger.getLinesWithSubstring("load")); |
| 349 | 349 |
| 350 const uint64_t Align29[] = { | 350 const uint64_t Align29[] = { |
| 351 ReplaceIndex, NaClBitcodeMunger::Replace, | 351 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 352 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 352 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 353 }; | 353 }; |
| 354 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, | 354 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, |
| 355 array_lengthof(Align29))); | 355 array_lengthof(Align29))); |
| 356 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | 356 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", |
| 357 Munger.getTestResults()); | 357 Munger.getTestResults()); |
| 358 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", | 358 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", |
| 359 Align29, array_lengthof(Align29))); | 359 Align29, array_lengthof(Align29))); |
| 360 EXPECT_EQ( | 360 EXPECT_EQ( |
| 361 " %v0 = load float* %p0, align 536870912;\n" | 361 " %v0 = load float* %p0, align 536870912;\n" |
| 362 "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", |
| 363 DumpMunger.getLinesWithSubstring("load")); | 363 DumpMunger.getLinesWithSubstring("load")); |
| 364 | 364 |
| 365 // Show what happens when changing alignment to 2**30. | 365 // Show what happens when changing alignment to 2**30. |
| 366 const uint64_t Align30[] = { | 366 const uint64_t Align30[] = { |
| 367 ReplaceIndex, NaClBitcodeMunger::Replace, | 367 ReplaceIndex, NaClBitcodeMunger::Replace, |
| 368 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 368 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 369 }; | 369 }; |
| 370 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, | 370 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, |
| 371 array_lengthof(Align30))); | 371 array_lengthof(Align30))); |
| 372 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | 372 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", |
| 373 Munger.getTestResults()); | 373 Munger.getTestResults()); |
| 374 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", | 374 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", |
| 375 Align30, array_lengthof(Align30))); | 375 Align30, array_lengthof(Align30))); |
| 376 EXPECT_EQ( | 376 EXPECT_EQ( |
| 377 " %v0 = load float* %p0, align 0;\n" | 377 " %v0 = load float* %p0, align 0;\n" |
| 378 "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", |
| 379 DumpMunger.getLinesWithSubstring("load")); | 379 DumpMunger.getLinesWithSubstring("load")); |
| 380 } | 380 } |
| 381 | 381 |
| 382 // Test how we recognize alignments in store instructions. | 382 // Test how we recognize alignments in store instructions. |
| 383 TEST(NaClParseInstsTests, StoreAlignment) { | 383 TEST(NaClParseInstsTests, StoreAlignment) { |
| 384 const uint64_t BitcodeRecords[] = { | 384 const uint64_t BitcodeRecords[] = { |
| 385 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 385 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 386 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 386 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 387 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 387 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
| 388 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | 388 3, naclbitc::TYPE_CODE_FLOAT, Terminator, |
| 389 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 389 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 Munger.getTestResults()); | 492 Munger.getTestResults()); |
| 493 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, | 493 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, |
| 494 array_lengthof(Align30))); | 494 array_lengthof(Align30))); |
| 495 EXPECT_EQ( | 495 EXPECT_EQ( |
| 496 " store float %p1, float* %p0, align 0;\n" | 496 " store float %p1, float* %p0, align 0;\n" |
| 497 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 497 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 498 DumpMunger.getLinesWithSubstring("store")); | 498 DumpMunger.getLinesWithSubstring("store")); |
| 499 } | 499 } |
| 500 | 500 |
| 501 } // end of anonymous namespace | 501 } // end of anonymous namespace |
| OLD | NEW |