| OLD | NEW |
| 1 //===- llvm/unittest/Bitcode/NaClParseInstsTest.cpp ----------------------===// | 1 //===- llvm/unittest/Bitcode/NaClParseInstsTest.cpp ----------------------===// |
| 2 // Tests parser for PNaCl bitcode instructions. | 2 // Tests parser for PNaCl bitcode instructions. |
| 3 // | 3 // |
| 4 // The LLVM Compiler Infrastructure | 4 // The LLVM Compiler Infrastructure |
| 5 // | 5 // |
| 6 // This file is distributed under the University of Illinois Open Source | 6 // This file is distributed under the University of Illinois Open Source |
| 7 // License. See LICENSE.TXT for details. | 7 // License. See LICENSE.TXT for details. |
| 8 // | 8 // |
| 9 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// |
| 10 | 10 |
| 11 // Tests record errors in the function block when parsing PNaCl bitcode. | 11 // Tests record errors in the function block when parsing PNaCl bitcode. |
| 12 | 12 |
| 13 // TODO(kschimpf) Add more tests. | 13 // TODO(kschimpf) Add more tests. |
| 14 | 14 |
| 15 #include "llvm/ADT/STLExtras.h" | 15 |
| 16 #include "llvm/Bitcode/NaCl/NaClBitcodeMunge.h" | 16 #include "NaClMungeTest.h" |
| 17 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" | 17 |
| 18 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" | 18 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" |
| 19 | 19 |
| 20 #include "gtest/gtest.h" | |
| 21 | |
| 22 using namespace llvm; | 20 using namespace llvm; |
| 23 | 21 |
| 24 namespace { | 22 namespace naclmungetest { |
| 25 | |
| 26 static const uint64_t Terminator = 0x5768798008978675LL; | |
| 27 | 23 |
| 28 // Note: alignment stored as 0 or log2(Alignment)+1. | 24 // Note: alignment stored as 0 or log2(Alignment)+1. |
| 29 uint64_t getEncAlignPower(unsigned Power) { | 25 uint64_t getEncAlignPower(unsigned Power) { |
| 30 return Power + 1; | 26 return Power + 1; |
| 31 } | 27 } |
| 32 uint64_t getEncAlignZero() { return 0; } | 28 uint64_t getEncAlignZero() { return 0; } |
| 33 | 29 |
| 34 /// Test how we report a call arg that refers to nonexistent call argument | 30 /// Test how we report a call arg that refers to nonexistent call argument |
| 35 TEST(NaClParseInstsTest, NonexistantCallArg) { | 31 TEST(NaClParseInstsTest, NonexistantCallArg) { |
| 36 const uint64_t BitcodeRecords[] = { | 32 const uint64_t BitcodeRecords[] = { |
| 37 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 33 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 38 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, |
| 39 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 35 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
| 40 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 36 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 41 3, naclbitc::TYPE_CODE_VOID, Terminator, | 37 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| 42 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, | 38 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, |
| 43 0, naclbitc::BLK_CODE_EXIT, Terminator, | 39 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 44 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, | 40 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, |
| 45 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 41 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 46 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 42 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 47 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 43 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 48 // Note: 100 is a bad value index in next line. | 44 // Note: 100 is a bad value index in next line. |
| 49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
| 50 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 46 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 51 0, naclbitc::BLK_CODE_EXIT, Terminator, | 47 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 52 0, naclbitc::BLK_CODE_EXIT, Terminator | 48 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 53 }; | 49 }; |
| 54 | 50 |
| 55 // Show text of base input. | 51 // Show text of base input. |
| 56 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 52 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 57 array_lengthof(BitcodeRecords), Terminator); | 53 EXPECT_FALSE(DumpMunger.runTest()); |
| 58 EXPECT_FALSE(DumpMunger.runTest("Nonexistant call arg")); | |
| 59 EXPECT_EQ( | 54 EXPECT_EQ( |
| 60 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " | 55 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
| 61 "88, 69)\n" | 56 "88, 69)\n" |
| 62 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" | 57 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
| 63 " | 0> |\n" | 58 " | 0> |\n" |
| 64 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" | 59 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
| 65 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" | 60 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
| 66 " 32:0| 3: <1, 3> | count 3;\n" | 61 " 32:0| 3: <1, 3> | count 3;\n" |
| 67 " 34:4| 3: <7, 32> | @t0 = i32;\n" | 62 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
| 68 " 37:6| 3: <2> | @t1 = void;\n" | 63 " 37:6| 3: <2> | @t1 = void;\n" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 79 " 64:0| 3: <1, 1> | blocks 1;\n" | 74 " 64:0| 3: <1, 1> | blocks 1;\n" |
| 80 " | | %b0:\n" | 75 " | | %b0:\n" |
| 81 " 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 %p0, i32" | 76 " 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 %p0, i32" |
| 82 " @f0);\n" | 77 " @f0);\n" |
| 83 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" | 78 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" |
| 84 " 72:6| 3: <10> | ret void;\n" | 79 " 72:6| 3: <10> | ret void;\n" |
| 85 " 74:4| 0: <65534> | }\n" | 80 " 74:4| 0: <65534> | }\n" |
| 86 " 76:0|0: <65534> |}\n", | 81 " 76:0|0: <65534> |}\n", |
| 87 DumpMunger.getTestResults()); | 82 DumpMunger.getTestResults()); |
| 88 | 83 |
| 89 NaClParseBitcodeMunger Munger(BitcodeRecords, | 84 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 90 array_lengthof(BitcodeRecords), Terminator); | 85 EXPECT_FALSE(Munger.runTest(true)); |
| 91 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true)); | |
| 92 EXPECT_EQ( | 86 EXPECT_EQ( |
| 93 "Error(72:6): Invalid call argument: Index 1\n" | 87 "Error(72:6): Invalid call argument: Index 1\n" |
| 94 "Error: Invalid value in record\n", | 88 "Error: Invalid value in record\n", |
| 95 Munger.getTestResults()); | 89 Munger.getTestResults()); |
| 96 } | 90 } |
| 97 | 91 |
| 98 /// Test how we recognize alignments in alloca instructions. | 92 /// Test how we recognize alignments in alloca instructions. |
| 99 TEST(NaClParseInstsTests, BadAllocaAlignment) { | 93 TEST(NaClParseInstsTests, BadAllocaAlignment) { |
| 100 const uint64_t BitcodeRecords[] = { | 94 const uint64_t BitcodeRecords[] = { |
| 101 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 95 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 102 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 96 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 103 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | 97 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
| 104 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 98 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 105 3, naclbitc::TYPE_CODE_VOID, Terminator, | 99 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| 106 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | 100 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, |
| 107 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | 101 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, |
| 108 0, naclbitc::BLK_CODE_EXIT, Terminator, | 102 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 109 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 103 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 110 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 104 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 111 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 105 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 112 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, | 106 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, |
| 113 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 107 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 114 0, naclbitc::BLK_CODE_EXIT, Terminator, | 108 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 115 0, naclbitc::BLK_CODE_EXIT, Terminator | 109 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 116 }; | 110 }; |
| 117 | 111 |
| 118 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | 112 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA |
| 119 | 113 |
| 120 // Show text when alignment is 1. | 114 // Show text when alignment is 1. |
| 121 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 115 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 122 array_lengthof(BitcodeRecords), Terminator); | 116 EXPECT_TRUE(DumpMunger.runTest()); |
| 123 EXPECT_TRUE(DumpMunger.runTest("BadAllocaAlignment")); | |
| 124 EXPECT_EQ( | 117 EXPECT_EQ( |
| 125 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " | 118 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
| 126 "88, 69)\n" | 119 "88, 69)\n" |
| 127 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" | 120 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
| 128 " | 0> |\n" | 121 " | 0> |\n" |
| 129 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" | 122 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
| 130 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" | 123 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
| 131 " 32:0| 3: <1, 4> | count 4;\n" | 124 " 32:0| 3: <1, 4> | count 4;\n" |
| 132 " 34:4| 3: <7, 32> | @t0 = i32;\n" | 125 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
| 133 " 37:6| 3: <2> | @t1 = void;\n" | 126 " 37:6| 3: <2> | @t1 = void;\n" |
| 134 " 39:4| 3: <21, 0, 1, 0> | @t2 = void (i32);\n" | 127 " 39:4| 3: <21, 0, 1, 0> | @t2 = void (i32);\n" |
| 135 " 43:4| 3: <7, 8> | @t3 = i8;\n" | 128 " 43:4| 3: <7, 8> | @t3 = i8;\n" |
| 136 " 46:0| 0: <65534> | }\n" | 129 " 46:0| 0: <65534> | }\n" |
| 137 " 48:0| 3: <8, 2, 0, 0, 0> | define external void @f0(i32" | 130 " 48:0| 3: <8, 2, 0, 0, 0> | define external void @f0(i32" |
| 138 ");\n" | 131 ");\n" |
| 139 " 52:6| 1: <65535, 12, 2> | function void @f0(i32 %p0) {" | 132 " 52:6| 1: <65535, 12, 2> | function void @f0(i32 %p0) {" |
| 140 " \n" | 133 " \n" |
| 141 " | | // BlockID " | 134 " | | // BlockID " |
| 142 "= 12\n" | 135 "= 12\n" |
| 143 " 60:0| 3: <1, 1> | blocks 1;\n" | 136 " 60:0| 3: <1, 1> | blocks 1;\n" |
| 144 " | | %b0:\n" | 137 " | | %b0:\n" |
| 145 " 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 %p0, " | 138 " 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 %p0, " |
| 146 "align 1;\n" | 139 "align 1;\n" |
| 147 " 65:6| 3: <10> | ret void;\n" | 140 " 65:6| 3: <10> | ret void;\n" |
| 148 " 67:4| 0: <65534> | }\n" | 141 " 67:4| 0: <65534> | }\n" |
| 149 " 68:0|0: <65534> |}\n", | 142 " 68:0|0: <65534> |}\n", |
| 150 DumpMunger.getTestResults()); | 143 DumpMunger.getTestResults()); |
| 151 NaClParseBitcodeMunger Munger(BitcodeRecords, | 144 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 152 array_lengthof(BitcodeRecords), Terminator); | 145 EXPECT_TRUE(Munger.runTest(true)); |
| 153 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true)); | |
| 154 | 146 |
| 155 // Show what happens when changing alignment to 0. | 147 // Show what happens when changing alignment to 0. |
| 156 const uint64_t Align0[] = { | 148 const uint64_t Align0[] = { |
| 157 ReplaceIndex, NaClMungedBitcode::Replace, | 149 ReplaceIndex, NaClMungedBitcode::Replace, |
| 158 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, | 150 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, |
| 159 }; | 151 }; |
| 160 EXPECT_TRUE(Munger.runTest( | 152 EXPECT_TRUE(Munger.runTest(ARRAY(Align0), true)); |
| 161 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true)); | 153 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 162 EXPECT_TRUE(DumpMunger.runTestForAssembly( | |
| 163 "BadAllocaAlignment-0", Align0, array_lengthof(Align0))); | |
| 164 EXPECT_EQ( | 154 EXPECT_EQ( |
| 165 " %v0 = alloca i8, i32 %p0, align 0;\n", | 155 " %v0 = alloca i8, i32 %p0, align 0;\n", |
| 166 DumpMunger.getLinesWithSubstring("alloca")); | 156 DumpMunger.getLinesWithSubstring("alloca")); |
| 167 | 157 |
| 168 // Show what happens when changing alignment to 2**30. | 158 // Show what happens when changing alignment to 2**30. |
| 169 const uint64_t Align30[] = { | 159 const uint64_t Align30[] = { |
| 170 ReplaceIndex, NaClMungedBitcode::Replace, | 160 ReplaceIndex, NaClMungedBitcode::Replace, |
| 171 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 161 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
| 172 }; | 162 }; |
| 173 EXPECT_FALSE(Munger.runTest( | 163 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), true)); |
| 174 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true)); | |
| 175 EXPECT_EQ( | 164 EXPECT_EQ( |
| 176 "Error(65:6): Alignment can't be greater than 2**29. Found: 2**30\n" | 165 "Error(65:6): Alignment can't be greater than 2**29. Found: 2**30\n" |
| 177 "Error: Invalid value in record\n", | 166 "Error: Invalid value in record\n", |
| 178 Munger.getTestResults()); | 167 Munger.getTestResults()); |
| 179 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 168 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 180 "BadAllocaAlignment-30", Align30, array_lengthof(Align30))); | |
| 181 EXPECT_EQ( | 169 EXPECT_EQ( |
| 182 " %v0 = alloca i8, i32 %p0, align 0;\n", | 170 " %v0 = alloca i8, i32 %p0, align 0;\n", |
| 183 DumpMunger.getLinesWithSubstring("alloca")); | 171 DumpMunger.getLinesWithSubstring("alloca")); |
| 184 EXPECT_EQ( | 172 EXPECT_EQ( |
| 185 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 173 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
| 186 DumpMunger.getLinesWithSubstring("Error")); | 174 DumpMunger.getLinesWithSubstring("Error")); |
| 187 | 175 |
| 188 // Show what happens when changing alignment to 2**29. | 176 // Show what happens when changing alignment to 2**29. |
| 189 const uint64_t Align29[] = { | 177 const uint64_t Align29[] = { |
| 190 ReplaceIndex, NaClMungedBitcode::Replace, | 178 ReplaceIndex, NaClMungedBitcode::Replace, |
| 191 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, | 179 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, |
| 192 }; | 180 }; |
| 193 EXPECT_TRUE(Munger.runTest( | 181 EXPECT_TRUE(Munger.runTest(ARRAY(Align29), true)); |
| 194 "BadAllocaAlignment-29", Align29, array_lengthof(Align29), true)); | |
| 195 EXPECT_EQ( | 182 EXPECT_EQ( |
| 196 "Successful parse!\n", | 183 "Successful parse!\n", |
| 197 Munger.getTestResults()); | 184 Munger.getTestResults()); |
| 198 EXPECT_TRUE(DumpMunger.runTestForAssembly( | 185 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 199 "BadAllocaAlignment-29", Align29, array_lengthof(Align29))); | |
| 200 EXPECT_EQ( | 186 EXPECT_EQ( |
| 201 " %v0 = alloca i8, i32 %p0, align 536870912;\n", | 187 " %v0 = alloca i8, i32 %p0, align 536870912;\n", |
| 202 DumpMunger.getLinesWithSubstring("alloca")); | 188 DumpMunger.getLinesWithSubstring("alloca")); |
| 203 } | 189 } |
| 204 | 190 |
| 205 // Test how we recognize alignments in load instructions. | 191 // Test how we recognize alignments in load instructions. |
| 206 TEST(NaClParseInstsTests, BadLoadAlignment) { | 192 TEST(NaClParseInstsTests, BadLoadAlignment) { |
| 207 const uint64_t BitcodeRecords[] = { | 193 const uint64_t BitcodeRecords[] = { |
| 208 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 194 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 209 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 195 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 210 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, | 196 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, |
| 211 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 197 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 212 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, | 198 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, |
| 213 0, naclbitc::BLK_CODE_EXIT, Terminator, | 199 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 214 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, | 200 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, |
| 215 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 201 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 216 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 202 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 217 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, | 203 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, |
| 218 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 204 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| 219 0, naclbitc::BLK_CODE_EXIT, Terminator, | 205 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 220 0, naclbitc::BLK_CODE_EXIT, Terminator | 206 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 221 }; | 207 }; |
| 222 | 208 |
| 223 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | 209 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD |
| 224 | 210 |
| 225 // Show text when alignment is 1. | 211 // Show text when alignment is 1. |
| 226 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 212 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 227 array_lengthof(BitcodeRecords), Terminator); | 213 EXPECT_TRUE(DumpMunger.runTest()); |
| 228 EXPECT_TRUE(DumpMunger.runTest("BadLoadAlignment-1")); | |
| 229 EXPECT_EQ( | 214 EXPECT_EQ( |
| 230 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " | 215 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
| 231 "88, 69)\n" | 216 "88, 69)\n" |
| 232 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" | 217 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
| 233 " | 0> |\n" | 218 " | 0> |\n" |
| 234 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" | 219 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
| 235 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" | 220 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
| 236 " 32:0| 3: <1, 2> | count 2;\n" | 221 " 32:0| 3: <1, 2> | count 2;\n" |
| 237 " 34:4| 3: <7, 32> | @t0 = i32;\n" | 222 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
| 238 " 37:6| 3: <21, 0, 0, 0> | @t1 = i32 (i32);\n" | 223 " 37:6| 3: <21, 0, 0, 0> | @t1 = i32 (i32);\n" |
| 239 " 41:6| 0: <65534> | }\n" | 224 " 41:6| 0: <65534> | }\n" |
| 240 " 44:0| 3: <8, 1, 0, 0, 0> | define external i32 @f0(i32" | 225 " 44:0| 3: <8, 1, 0, 0, 0> | define external i32 @f0(i32" |
| 241 ");\n" | 226 ");\n" |
| 242 " 48:6| 1: <65535, 12, 2> | function i32 @f0(i32 %p0) {" | 227 " 48:6| 1: <65535, 12, 2> | function i32 @f0(i32 %p0) {" |
| 243 " \n" | 228 " \n" |
| 244 " | | // BlockID " | 229 " | | // BlockID " |
| 245 "= 12\n" | 230 "= 12\n" |
| 246 " 56:0| 3: <1, 1> | blocks 1;\n" | 231 " 56:0| 3: <1, 1> | blocks 1;\n" |
| 247 " | | %b0:\n" | 232 " | | %b0:\n" |
| 248 " 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " | 233 " 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " |
| 249 "align 1;\n" | 234 "align 1;\n" |
| 250 " 62:4| 3: <10, 1> | ret i32 %v0;\n" | 235 " 62:4| 3: <10, 1> | ret i32 %v0;\n" |
| 251 " 65:0| 0: <65534> | }\n" | 236 " 65:0| 0: <65534> | }\n" |
| 252 " 68:0|0: <65534> |}\n", | 237 " 68:0|0: <65534> |}\n", |
| 253 DumpMunger.getTestResults()); | 238 DumpMunger.getTestResults()); |
| 254 NaClParseBitcodeMunger Munger(BitcodeRecords, | 239 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 255 array_lengthof(BitcodeRecords), Terminator); | 240 EXPECT_TRUE(Munger.runTest(true)); |
| 256 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true)); | |
| 257 | 241 |
| 258 // Show what happens when changing alignment to 0. | 242 // Show what happens when changing alignment to 0. |
| 259 const uint64_t Align0[] = { | 243 const uint64_t Align0[] = { |
| 260 ReplaceIndex, NaClMungedBitcode::Replace, | 244 ReplaceIndex, NaClMungedBitcode::Replace, |
| 261 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 245 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 262 }; | 246 }; |
| 263 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl | 247 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl |
| 264 // bitcode reader). It is checked later by the PNaCl ABI checker in | 248 // bitcode reader). It is checked later by the PNaCl ABI checker in |
| 265 // pnacl-llc. On the other hand, the DumpMunger checks alignment for | 249 // pnacl-llc. On the other hand, the DumpMunger checks alignment for |
| 266 // loads while parsing. | 250 // loads while parsing. |
| 267 EXPECT_TRUE(Munger.runTest( | 251 EXPECT_TRUE(Munger.runTest(ARRAY(Align0), true)); |
| 268 "BadLoadAlignment-0", Align0, array_lengthof(Align0), true)); | 252 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 269 EXPECT_FALSE(DumpMunger.runTestForAssembly( | |
| 270 "BadLoadAlignment-0", Align0, array_lengthof(Align0))); | |
| 271 EXPECT_EQ( | 253 EXPECT_EQ( |
| 272 " %v0 = load i32* %p0, align 0;\n" | 254 " %v0 = load i32* %p0, align 0;\n" |
| 273 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 255 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 274 DumpMunger.getLinesWithSubstring("load")); | 256 DumpMunger.getLinesWithSubstring("load")); |
| 275 | 257 |
| 276 // Show what happens when changing alignment to 4. | 258 // Show what happens when changing alignment to 4. |
| 277 const uint64_t Align4[] = { | 259 const uint64_t Align4[] = { |
| 278 ReplaceIndex, NaClMungedBitcode::Replace, | 260 ReplaceIndex, NaClMungedBitcode::Replace, |
| 279 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 261 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 280 }; | 262 }; |
| 281 EXPECT_TRUE(Munger.runTest( | 263 EXPECT_TRUE(Munger.runTest(ARRAY(Align4), true)); |
| 282 "BadLoadAlignment-4", Align4, array_lengthof(Align4), true)); | 264 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
| 283 EXPECT_FALSE(DumpMunger.runTestForAssembly( | |
| 284 "BadLoadAlignment-4", Align4, array_lengthof(Align4))); | |
| 285 EXPECT_EQ( | 265 EXPECT_EQ( |
| 286 " %v0 = load i32* %p0, align 4;\n" | 266 " %v0 = load i32* %p0, align 4;\n" |
| 287 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 267 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 288 DumpMunger.getLinesWithSubstring("load")); | 268 DumpMunger.getLinesWithSubstring("load")); |
| 289 | 269 |
| 290 // Show what happens when changing alignment to 2**29. | 270 // Show what happens when changing alignment to 2**29. |
| 291 const uint64_t Align29[] = { | 271 const uint64_t Align29[] = { |
| 292 ReplaceIndex, NaClMungedBitcode::Replace, | 272 ReplaceIndex, NaClMungedBitcode::Replace, |
| 293 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 273 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 294 }; | 274 }; |
| 295 EXPECT_TRUE(Munger.runTest( | 275 EXPECT_TRUE(Munger.runTest(ARRAY(Align29), true)); |
| 296 "BadLoadAlignment-29", Align29, array_lengthof(Align29), true)); | 276 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 297 EXPECT_FALSE(DumpMunger.runTestForAssembly( | |
| 298 "BadLoadAlignment-29", Align29, array_lengthof(Align29))); | |
| 299 EXPECT_EQ( | 277 EXPECT_EQ( |
| 300 " %v0 = load i32* %p0, align 536870912;\n" | 278 " %v0 = load i32* %p0, align 536870912;\n" |
| 301 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 279 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 302 DumpMunger.getLinesWithSubstring("load")); | 280 DumpMunger.getLinesWithSubstring("load")); |
| 303 | 281 |
| 304 // Show what happens when changing alignment to 2**30. | 282 // Show what happens when changing alignment to 2**30. |
| 305 const uint64_t Align30[] = { | 283 const uint64_t Align30[] = { |
| 306 ReplaceIndex, NaClMungedBitcode::Replace, | 284 ReplaceIndex, NaClMungedBitcode::Replace, |
| 307 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 285 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 308 }; | 286 }; |
| 309 EXPECT_FALSE(Munger.runTest( | 287 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), true)); |
| 310 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true)); | |
| 311 EXPECT_EQ( | 288 EXPECT_EQ( |
| 312 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n" | 289 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n" |
| 313 "Error: Invalid value in record\n", | 290 "Error: Invalid value in record\n", |
| 314 Munger.getTestResults()); | 291 Munger.getTestResults()); |
| 315 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 292 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 316 "BadLoadAlignment-30", Align30, array_lengthof(Align30))); | |
| 317 EXPECT_EQ( | 293 EXPECT_EQ( |
| 318 " %v0 = load i32* %p0, align 0;\n" | 294 " %v0 = load i32* %p0, align 0;\n" |
| 319 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 295 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 320 DumpMunger.getLinesWithSubstring("load")); | 296 DumpMunger.getLinesWithSubstring("load")); |
| 321 } | 297 } |
| 322 | 298 |
| 323 // Test how we recognize alignments in store instructions. | 299 // Test how we recognize alignments in store instructions. |
| 324 TEST(NaClParseInstsTests, BadStoreAlignment) { | 300 TEST(NaClParseInstsTests, BadStoreAlignment) { |
| 325 const uint64_t BitcodeRecords[] = { | 301 const uint64_t BitcodeRecords[] = { |
| 326 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 302 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 327 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 303 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 328 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 304 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
| 329 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | 305 3, naclbitc::TYPE_CODE_FLOAT, Terminator, |
| 330 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 306 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 331 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, | 307 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, |
| 332 0, naclbitc::BLK_CODE_EXIT, Terminator, | 308 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 333 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 309 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 334 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 310 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 335 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 311 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 336 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator, | 312 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator, |
| 337 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 313 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| 338 0, naclbitc::BLK_CODE_EXIT, Terminator, | 314 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 339 0, naclbitc::BLK_CODE_EXIT, Terminator | 315 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 340 }; | 316 }; |
| 341 | 317 |
| 342 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE | 318 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE |
| 343 | 319 |
| 344 // Show text when alignment is 1. | 320 // Show text when alignment is 1. |
| 345 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 321 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 346 array_lengthof(BitcodeRecords), Terminator); | 322 EXPECT_TRUE(DumpMunger.runTest()); |
| 347 EXPECT_TRUE(DumpMunger.runTest("BadStoreAlignment")); | |
| 348 EXPECT_EQ( | 323 EXPECT_EQ( |
| 349 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " | 324 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
| 350 "88, 69)\n" | 325 "88, 69)\n" |
| 351 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" | 326 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
| 352 " | 0> |\n" | 327 " | 0> |\n" |
| 353 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" | 328 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
| 354 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" | 329 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
| 355 " 32:0| 3: <1, 3> | count 3;\n" | 330 " 32:0| 3: <1, 3> | count 3;\n" |
| 356 " 34:4| 3: <3> | @t0 = float;\n" | 331 " 34:4| 3: <3> | @t0 = float;\n" |
| 357 " 36:2| 3: <7, 32> | @t1 = i32;\n" | 332 " 36:2| 3: <7, 32> | @t1 = i32;\n" |
| 358 " 39:4| 3: <21, 0, 0, 1, 0> | @t2 = float (i32, float);\n" | 333 " 39:4| 3: <21, 0, 0, 1, 0> | @t2 = float (i32, float);\n" |
| 359 " 44:2| 0: <65534> | }\n" | 334 " 44:2| 0: <65534> | }\n" |
| 360 " 48:0| 3: <8, 2, 0, 0, 0> | define external \n" | 335 " 48:0| 3: <8, 2, 0, 0, 0> | define external \n" |
| 361 " | | float @f0(i32, float);\n" | 336 " | | float @f0(i32, float);\n" |
| 362 " 52:6| 1: <65535, 12, 2> | function \n" | 337 " 52:6| 1: <65535, 12, 2> | function \n" |
| 363 " | | float @f0(i32 %p0, float " | 338 " | | float @f0(i32 %p0, float " |
| 364 "%p1) { \n" | 339 "%p1) { \n" |
| 365 " | | // BlockID " | 340 " | | // BlockID " |
| 366 "= 12\n" | 341 "= 12\n" |
| 367 " 60:0| 3: <1, 1> | blocks 1;\n" | 342 " 60:0| 3: <1, 1> | blocks 1;\n" |
| 368 " | | %b0:\n" | 343 " | | %b0:\n" |
| 369 " 62:4| 3: <24, 2, 1, 1> | store float %p1, float* " | 344 " 62:4| 3: <24, 2, 1, 1> | store float %p1, float* " |
| 370 "%p0, \n" | 345 "%p0, \n" |
| 371 " | | align 1;\n" | 346 " | | align 1;\n" |
| 372 " 66:4| 3: <10, 1> | ret float %p1;\n" | 347 " 66:4| 3: <10, 1> | ret float %p1;\n" |
| 373 " 69:0| 0: <65534> | }\n" | 348 " 69:0| 0: <65534> | }\n" |
| 374 " 72:0|0: <65534> |}\n", | 349 " 72:0|0: <65534> |}\n", |
| 375 DumpMunger.getTestResults()); | 350 DumpMunger.getTestResults()); |
| 376 NaClParseBitcodeMunger Munger(BitcodeRecords, | 351 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 377 array_lengthof(BitcodeRecords), Terminator); | 352 EXPECT_TRUE(Munger.runTest(true)); |
| 378 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true)); | |
| 379 | 353 |
| 380 // Show what happens when changing alignment to 0. | 354 // Show what happens when changing alignment to 0. |
| 381 const uint64_t Align0[] = { | 355 const uint64_t Align0[] = { |
| 382 ReplaceIndex, NaClMungedBitcode::Replace, | 356 ReplaceIndex, NaClMungedBitcode::Replace, |
| 383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 357 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
| 384 }; | 358 }; |
| 385 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl | 359 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl |
| 386 // bitcode reader). It is checked later by the PNaCl ABI checker in | 360 // bitcode reader). It is checked later by the PNaCl ABI checker in |
| 387 // pnacl-llc. On the other hand, the DumpMunger checks alignment for | 361 // pnacl-llc. On the other hand, the DumpMunger checks alignment for |
| 388 // stores while parsing. | 362 // stores while parsing. |
| 389 EXPECT_TRUE(Munger.runTest( | 363 EXPECT_TRUE(Munger.runTest(ARRAY(Align0), true)); |
| 390 "BadStoreAlignment-0", Align0, array_lengthof(Align0), true)); | 364 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 391 EXPECT_FALSE(DumpMunger.runTestForAssembly( | |
| 392 "BadStoreAlignment-0", Align0, array_lengthof(Align0))); | |
| 393 EXPECT_EQ( | 365 EXPECT_EQ( |
| 394 " store float %p1, float* %p0, align 0;\n" | 366 " store float %p1, float* %p0, align 0;\n" |
| 395 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 367 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 396 DumpMunger.getLinesWithSubstring("store")); | 368 DumpMunger.getLinesWithSubstring("store")); |
| 397 | 369 |
| 398 // Show what happens when changing alignment to 4. | 370 // Show what happens when changing alignment to 4. |
| 399 const uint64_t Align4[] = { | 371 const uint64_t Align4[] = { |
| 400 ReplaceIndex, NaClMungedBitcode::Replace, | 372 ReplaceIndex, NaClMungedBitcode::Replace, |
| 401 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, | 373 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, |
| 402 }; | 374 }; |
| 403 EXPECT_TRUE(Munger.runTest( | 375 EXPECT_TRUE(Munger.runTest(ARRAY(Align4), true)); |
| 404 "BadStoreAlignment-4", Align4, array_lengthof(Align4), true)); | 376 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
| 405 EXPECT_TRUE(DumpMunger.runTestForAssembly( | |
| 406 "BadStoreAlignment-4", Align4, array_lengthof(Align4))); | |
| 407 | 377 |
| 408 // Show what happens when changing alignment to 8. | 378 // Show what happens when changing alignment to 8. |
| 409 const uint64_t Align8[] = { | 379 const uint64_t Align8[] = { |
| 410 ReplaceIndex, NaClMungedBitcode::Replace, | 380 ReplaceIndex, NaClMungedBitcode::Replace, |
| 411 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, | 381 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, |
| 412 }; | 382 }; |
| 413 EXPECT_TRUE(Munger.runTest( | 383 EXPECT_TRUE(Munger.runTest(ARRAY(Align8), true)); |
| 414 "BadStoreAlignment-8", Align8, array_lengthof(Align8), true)); | 384 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8))); |
| 415 EXPECT_FALSE(DumpMunger.runTestForAssembly( | |
| 416 "BadStoreAlignment-8", Align8, array_lengthof(Align8))); | |
| 417 EXPECT_EQ( | 385 EXPECT_EQ( |
| 418 " store float %p1, float* %p0, align 8;\n" | 386 " store float %p1, float* %p0, align 8;\n" |
| 419 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 387 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 420 DumpMunger.getLinesWithSubstring("store")); | 388 DumpMunger.getLinesWithSubstring("store")); |
| 421 | 389 |
| 422 // Show what happens when changing alignment to 2**29. | 390 // Show what happens when changing alignment to 2**29. |
| 423 const uint64_t Align29[] = { | 391 const uint64_t Align29[] = { |
| 424 ReplaceIndex, NaClMungedBitcode::Replace, | 392 ReplaceIndex, NaClMungedBitcode::Replace, |
| 425 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, | 393 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, |
| 426 }; | 394 }; |
| 427 EXPECT_TRUE(Munger.runTest( | 395 EXPECT_TRUE(Munger.runTest(ARRAY(Align29), true)); |
| 428 "BadStoreAlignment-29", Align29, array_lengthof(Align29), true)); | 396 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 429 EXPECT_FALSE(DumpMunger.runTestForAssembly( | |
| 430 "BadStoreAlignment-29", Align29, array_lengthof(Align29))); | |
| 431 EXPECT_EQ( | 397 EXPECT_EQ( |
| 432 " store float %p1, float* %p0, align 536870912;\n" | 398 " store float %p1, float* %p0, align 536870912;\n" |
| 433 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 399 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 434 DumpMunger.getLinesWithSubstring("store")); | 400 DumpMunger.getLinesWithSubstring("store")); |
| 435 | 401 |
| 436 // Show what happens when changing alignment to 2**30. | 402 // Show what happens when changing alignment to 2**30. |
| 437 const uint64_t Align30[] = { | 403 const uint64_t Align30[] = { |
| 438 ReplaceIndex, NaClMungedBitcode::Replace, | 404 ReplaceIndex, NaClMungedBitcode::Replace, |
| 439 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 405 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
| 440 }; | 406 }; |
| 441 EXPECT_FALSE(Munger.runTest( | 407 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), true)); |
| 442 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true)); | |
| 443 EXPECT_EQ( | 408 EXPECT_EQ( |
| 444 "Error(66:4): Alignment can't be greater than 2**29. Found: 2**30\n" | 409 "Error(66:4): Alignment can't be greater than 2**29. Found: 2**30\n" |
| 445 "Error: Invalid value in record\n", | 410 "Error: Invalid value in record\n", |
| 446 Munger.getTestResults()); | 411 Munger.getTestResults()); |
| 447 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 412 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 448 "BadStoreAlignment-30", Align30, array_lengthof(Align30))); | |
| 449 EXPECT_EQ( | 413 EXPECT_EQ( |
| 450 " store float %p1, float* %p0, align 0;\n" | 414 " store float %p1, float* %p0, align 0;\n" |
| 451 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 415 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 452 DumpMunger.getLinesWithSubstring("store")); | 416 DumpMunger.getLinesWithSubstring("store")); |
| 453 } | 417 } |
| 454 | 418 |
| 455 } // end of anonamous namespace. | 419 } // end of namespace naclmungetest |
| OLD | NEW |