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 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 // Note: 100 is a bad value index in next line. | 48 // Note: 100 is a bad value index in next line. |
49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
50 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 50 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
51 0, naclbitc::BLK_CODE_EXIT, Terminator, | 51 0, naclbitc::BLK_CODE_EXIT, Terminator, |
52 0, naclbitc::BLK_CODE_EXIT, Terminator | 52 0, naclbitc::BLK_CODE_EXIT, Terminator |
53 }; | 53 }; |
54 | 54 |
55 // Show text of base input. | 55 // Show text of base input. |
56 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 56 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
57 array_lengthof(BitcodeRecords), Terminator); | 57 array_lengthof(BitcodeRecords), Terminator); |
58 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistant call arg")); | 58 EXPECT_FALSE(DumpMunger.runTest("Nonexistant call arg")); |
59 EXPECT_EQ( | 59 EXPECT_EQ( |
60 "module { // BlockID = 8\n" | 60 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
61 " types { // BlockID = 17\n" | 61 "88, 69)\n" |
62 " count 3;\n" | 62 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
63 " @t0 = i32;\n" | 63 " | 0> |\n" |
64 " @t1 = void;\n" | 64 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
65 " @t2 = void (i32, i32);\n" | 65 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
66 " }\n" | 66 " 32:0| 3: <1, 3> | count 3;\n" |
67 " declare external void @f0(i32, i32);\n" | 67 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
68 " define external void @f1(i32, i32);\n" | 68 " 37:6| 3: <2> | @t1 = void;\n" |
69 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" | 69 " 39:4| 3: <21, 0, 1, 0, 0> | @t2 = void (i32, i32);\n" |
70 " blocks 1;\n" | 70 " 44:2| 0: <65534> | }\n" |
71 " %b0:\n" | 71 " 48:0| 3: <8, 2, 0, 1, 0> | declare external void @f0(i32" |
72 " call void @f0(i32 %p0, i32 @f0);\n" | 72 ", i32);\n" |
| 73 " 52:6| 3: <8, 2, 0, 0, 0> | define external void @f1(i32," |
| 74 " i32);\n" |
| 75 " 57:4| 1: <65535, 12, 2> | function void @f1(i32 %p0, " |
| 76 "i32 %p1) {\n" |
| 77 " | | // BlockID " |
| 78 "= 12\n" |
| 79 " 64:0| 3: <1, 1> | blocks 1;\n" |
| 80 " | | %b0:\n" |
| 81 " 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 %p0, i32" |
| 82 " @f0);\n" |
73 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" | 83 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" |
74 " ret void;\n" | 84 " 72:6| 3: <10> | ret void;\n" |
75 " }\n" | 85 " 74:4| 0: <65534> | }\n" |
76 "}\n", | 86 " 76:0|0: <65534> |}\n", |
77 DumpMunger.getTestResults()); | 87 DumpMunger.getTestResults()); |
78 | 88 |
79 NaClParseBitcodeMunger Munger(BitcodeRecords, | 89 NaClParseBitcodeMunger Munger(BitcodeRecords, |
80 array_lengthof(BitcodeRecords), Terminator); | 90 array_lengthof(BitcodeRecords), Terminator); |
81 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true)); | 91 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true)); |
82 EXPECT_EQ( | 92 EXPECT_EQ( |
83 "Error: (56:6) Invalid call argument: Index 1\n" | 93 "Error: (72:6) Invalid call argument: Index 1\n" |
84 "Error: Invalid value in record\n", | 94 "Error: Invalid value in record\n", |
85 Munger.getTestResults()); | 95 Munger.getTestResults()); |
86 } | 96 } |
87 | 97 |
88 /// Test how we recognize alignments in alloca instructions. | 98 /// Test how we recognize alignments in alloca instructions. |
89 TEST(NaClParseInstsTests, BadAllocaAlignment) { | 99 TEST(NaClParseInstsTests, BadAllocaAlignment) { |
90 const uint64_t BitcodeRecords[] = { | 100 const uint64_t BitcodeRecords[] = { |
91 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 101 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
92 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 102 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
93 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | 103 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
94 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 104 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
95 3, naclbitc::TYPE_CODE_VOID, Terminator, | 105 3, naclbitc::TYPE_CODE_VOID, Terminator, |
96 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | 106 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, |
97 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | 107 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, |
98 0, naclbitc::BLK_CODE_EXIT, Terminator, | 108 0, naclbitc::BLK_CODE_EXIT, Terminator, |
99 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 109 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
100 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 110 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
101 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 111 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
102 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, | 112 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, |
103 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 113 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
104 0, naclbitc::BLK_CODE_EXIT, Terminator, | 114 0, naclbitc::BLK_CODE_EXIT, Terminator, |
105 0, naclbitc::BLK_CODE_EXIT, Terminator | 115 0, naclbitc::BLK_CODE_EXIT, Terminator |
106 }; | 116 }; |
107 | 117 |
108 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | 118 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA |
109 | 119 |
110 // Show text when alignment is 1. | 120 // Show text when alignment is 1. |
111 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 121 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
112 array_lengthof(BitcodeRecords), Terminator); | 122 array_lengthof(BitcodeRecords), Terminator); |
113 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadAllocaAlignment")); | 123 EXPECT_TRUE(DumpMunger.runTest("BadAllocaAlignment")); |
114 EXPECT_EQ( | 124 EXPECT_EQ( |
115 "module { // BlockID = 8\n" | 125 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
116 " types { // BlockID = 17\n" | 126 "88, 69)\n" |
117 " count 4;\n" | 127 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
118 " @t0 = i32;\n" | 128 " | 0> |\n" |
119 " @t1 = void;\n" | 129 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
120 " @t2 = void (i32);\n" | 130 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
121 " @t3 = i8;\n" | 131 " 32:0| 3: <1, 4> | count 4;\n" |
122 " }\n" | 132 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
123 " define external void @f0(i32);\n" | 133 " 37:6| 3: <2> | @t1 = void;\n" |
124 " function void @f0(i32 %p0) { // BlockID = 12\n" | 134 " 39:4| 3: <21, 0, 1, 0> | @t2 = void (i32);\n" |
125 " blocks 1;\n" | 135 " 43:4| 3: <7, 8> | @t3 = i8;\n" |
126 " %b0:\n" | 136 " 46:0| 0: <65534> | }\n" |
127 " %v0 = alloca i8, i32 %p0, align 1;\n" | 137 " 48:0| 3: <8, 2, 0, 0, 0> | define external void @f0(i32" |
128 " ret void;\n" | 138 ");\n" |
129 " }\n" | 139 " 52:6| 1: <65535, 12, 2> | function void @f0(i32 %p0) {" |
130 "}\n", | 140 " \n" |
| 141 " | | // BlockID " |
| 142 "= 12\n" |
| 143 " 60:0| 3: <1, 1> | blocks 1;\n" |
| 144 " | | %b0:\n" |
| 145 " 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 %p0, " |
| 146 "align 1;\n" |
| 147 " 65:6| 3: <10> | ret void;\n" |
| 148 " 67:4| 0: <65534> | }\n" |
| 149 " 68:0|0: <65534> |}\n", |
131 DumpMunger.getTestResults()); | 150 DumpMunger.getTestResults()); |
132 NaClParseBitcodeMunger Munger(BitcodeRecords, | 151 NaClParseBitcodeMunger Munger(BitcodeRecords, |
133 array_lengthof(BitcodeRecords), Terminator); | 152 array_lengthof(BitcodeRecords), Terminator); |
134 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true)); | 153 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true)); |
135 | 154 |
136 // Show what happens when changing alignment to 0. | 155 // Show what happens when changing alignment to 0. |
137 const uint64_t Align0[] = { | 156 const uint64_t Align0[] = { |
138 ReplaceIndex, NaClBitcodeMunger::Replace, | 157 ReplaceIndex, NaClBitcodeMunger::Replace, |
139 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, | 158 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, |
140 }; | 159 }; |
141 EXPECT_TRUE(Munger.runTest( | 160 EXPECT_TRUE(Munger.runTest( |
142 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true)); | 161 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true)); |
143 EXPECT_TRUE(DumpMunger.runTestForAssembly( | 162 EXPECT_TRUE(DumpMunger.runTestForAssembly( |
144 "BadAllocaAlignment-0", Align0, array_lengthof(Align0))); | 163 "BadAllocaAlignment-0", Align0, array_lengthof(Align0))); |
145 EXPECT_EQ( | 164 EXPECT_EQ( |
146 " %v0 = alloca i8, i32 %p0, align 0;\n", | 165 " %v0 = alloca i8, i32 %p0, align 0;\n", |
147 DumpMunger.getLinesWithSubstring("alloca")); | 166 DumpMunger.getLinesWithSubstring("alloca")); |
148 | 167 |
149 // Show what happens when changing alignment to 2**30. | 168 // Show what happens when changing alignment to 2**30. |
150 const uint64_t Align30[] = { | 169 const uint64_t Align30[] = { |
151 ReplaceIndex, NaClBitcodeMunger::Replace, | 170 ReplaceIndex, NaClBitcodeMunger::Replace, |
152 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 171 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
153 }; | 172 }; |
154 EXPECT_FALSE(Munger.runTest( | 173 EXPECT_FALSE(Munger.runTest( |
155 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true)); | 174 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true)); |
156 EXPECT_EQ( | 175 EXPECT_EQ( |
157 "Error: (49:6) Alignment can't be greater than 2**29. Found: 2**30\n" | 176 "Error: (65:6) Alignment can't be greater than 2**29. Found: 2**30\n" |
158 "Error: Invalid value in record\n", | 177 "Error: Invalid value in record\n", |
159 Munger.getTestResults()); | 178 Munger.getTestResults()); |
160 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 179 EXPECT_FALSE(DumpMunger.runTestForAssembly( |
161 "BadAllocaAlignment-30", Align30, array_lengthof(Align30))); | 180 "BadAllocaAlignment-30", Align30, array_lengthof(Align30))); |
162 EXPECT_EQ( | 181 EXPECT_EQ( |
163 " %v0 = alloca i8, i32 %p0, align 0;\n", | 182 " %v0 = alloca i8, i32 %p0, align 0;\n", |
164 DumpMunger.getLinesWithSubstring("alloca")); | 183 DumpMunger.getLinesWithSubstring("alloca")); |
165 EXPECT_EQ( | 184 EXPECT_EQ( |
166 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 185 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
167 DumpMunger.getLinesWithSubstring("Error")); | 186 DumpMunger.getLinesWithSubstring("Error")); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 218 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
200 0, naclbitc::BLK_CODE_EXIT, Terminator, | 219 0, naclbitc::BLK_CODE_EXIT, Terminator, |
201 0, naclbitc::BLK_CODE_EXIT, Terminator | 220 0, naclbitc::BLK_CODE_EXIT, Terminator |
202 }; | 221 }; |
203 | 222 |
204 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | 223 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD |
205 | 224 |
206 // Show text when alignment is 1. | 225 // Show text when alignment is 1. |
207 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 226 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
208 array_lengthof(BitcodeRecords), Terminator); | 227 array_lengthof(BitcodeRecords), Terminator); |
209 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadLoadAlignment-1")); | 228 EXPECT_TRUE(DumpMunger.runTest("BadLoadAlignment-1")); |
210 EXPECT_EQ( | 229 EXPECT_EQ( |
211 "module { // BlockID = 8\n" | 230 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
212 " types { // BlockID = 17\n" | 231 "88, 69)\n" |
213 " count 2;\n" | 232 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
214 " @t0 = i32;\n" | 233 " | 0> |\n" |
215 " @t1 = i32 (i32);\n" | 234 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
216 " }\n" | 235 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
217 " define external i32 @f0(i32);\n" | 236 " 32:0| 3: <1, 2> | count 2;\n" |
218 " function i32 @f0(i32 %p0) { // BlockID = 12\n" | 237 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
219 " blocks 1;\n" | 238 " 37:6| 3: <21, 0, 0, 0> | @t1 = i32 (i32);\n" |
220 " %b0:\n" | 239 " 41:6| 0: <65534> | }\n" |
221 " %v0 = load i32* %p0, align 1;\n" | 240 " 44:0| 3: <8, 1, 0, 0, 0> | define external i32 @f0(i32" |
222 " ret i32 %v0;\n" | 241 ");\n" |
223 " }\n" | 242 " 48:6| 1: <65535, 12, 2> | function i32 @f0(i32 %p0) {" |
224 "}\n", | 243 " \n" |
| 244 " | | // BlockID " |
| 245 "= 12\n" |
| 246 " 56:0| 3: <1, 1> | blocks 1;\n" |
| 247 " | | %b0:\n" |
| 248 " 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " |
| 249 "align 1;\n" |
| 250 " 62:4| 3: <10, 1> | ret i32 %v0;\n" |
| 251 " 65:0| 0: <65534> | }\n" |
| 252 " 68:0|0: <65534> |}\n", |
225 DumpMunger.getTestResults()); | 253 DumpMunger.getTestResults()); |
226 NaClParseBitcodeMunger Munger(BitcodeRecords, | 254 NaClParseBitcodeMunger Munger(BitcodeRecords, |
227 array_lengthof(BitcodeRecords), Terminator); | 255 array_lengthof(BitcodeRecords), Terminator); |
228 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true)); | 256 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true)); |
229 | 257 |
230 // Show what happens when changing alignment to 0. | 258 // Show what happens when changing alignment to 0. |
231 const uint64_t Align0[] = { | 259 const uint64_t Align0[] = { |
232 ReplaceIndex, NaClBitcodeMunger::Replace, | 260 ReplaceIndex, NaClBitcodeMunger::Replace, |
233 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 261 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
234 }; | 262 }; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 DumpMunger.getLinesWithSubstring("load")); | 302 DumpMunger.getLinesWithSubstring("load")); |
275 | 303 |
276 // Show what happens when changing alignment to 2**30. | 304 // Show what happens when changing alignment to 2**30. |
277 const uint64_t Align30[] = { | 305 const uint64_t Align30[] = { |
278 ReplaceIndex, NaClBitcodeMunger::Replace, | 306 ReplaceIndex, NaClBitcodeMunger::Replace, |
279 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 307 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
280 }; | 308 }; |
281 EXPECT_FALSE(Munger.runTest( | 309 EXPECT_FALSE(Munger.runTest( |
282 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true)); | 310 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true)); |
283 EXPECT_EQ( | 311 EXPECT_EQ( |
284 "Error: (46:4) Alignment can't be greater than 2**29. Found: 2**30\n" | 312 "Error: (62:4) Alignment can't be greater than 2**29. Found: 2**30\n" |
285 "Error: Invalid value in record\n", | 313 "Error: Invalid value in record\n", |
286 Munger.getTestResults()); | 314 Munger.getTestResults()); |
287 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 315 EXPECT_FALSE(DumpMunger.runTestForAssembly( |
288 "BadLoadAlignment-30", Align30, array_lengthof(Align30))); | 316 "BadLoadAlignment-30", Align30, array_lengthof(Align30))); |
289 EXPECT_EQ( | 317 EXPECT_EQ( |
290 " %v0 = load i32* %p0, align 0;\n" | 318 " %v0 = load i32* %p0, align 0;\n" |
291 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 319 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
292 DumpMunger.getLinesWithSubstring("load")); | 320 DumpMunger.getLinesWithSubstring("load")); |
293 } | 321 } |
294 | 322 |
(...skipping 14 matching lines...) Expand all Loading... |
309 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 337 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
310 0, naclbitc::BLK_CODE_EXIT, Terminator, | 338 0, naclbitc::BLK_CODE_EXIT, Terminator, |
311 0, naclbitc::BLK_CODE_EXIT, Terminator | 339 0, naclbitc::BLK_CODE_EXIT, Terminator |
312 }; | 340 }; |
313 | 341 |
314 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE | 342 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE |
315 | 343 |
316 // Show text when alignment is 1. | 344 // Show text when alignment is 1. |
317 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 345 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
318 array_lengthof(BitcodeRecords), Terminator); | 346 array_lengthof(BitcodeRecords), Terminator); |
319 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadStoreAlignment")); | 347 EXPECT_TRUE(DumpMunger.runTest("BadStoreAlignment")); |
320 EXPECT_EQ( | 348 EXPECT_EQ( |
321 "module { // BlockID = 8\n" | 349 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
322 " types { // BlockID = 17\n" | 350 "88, 69)\n" |
323 " count 3;\n" | 351 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
324 " @t0 = float;\n" | 352 " | 0> |\n" |
325 " @t1 = i32;\n" | 353 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
326 " @t2 = float (i32, float);\n" | 354 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
327 " }\n" | 355 " 32:0| 3: <1, 3> | count 3;\n" |
328 " define external float @f0(i32, float);\n" | 356 " 34:4| 3: <3> | @t0 = float;\n" |
329 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" | 357 " 36:2| 3: <7, 32> | @t1 = i32;\n" |
330 " blocks 1;\n" | 358 " 39:4| 3: <21, 0, 0, 1, 0> | @t2 = float (i32, float);\n" |
331 " %b0:\n" | 359 " 44:2| 0: <65534> | }\n" |
332 " store float %p1, float* %p0, align 1;\n" | 360 " 48:0| 3: <8, 2, 0, 0, 0> | define external \n" |
333 " ret float %p1;\n" | 361 " | | float @f0(i32, float);\n" |
334 " }\n" | 362 " 52:6| 1: <65535, 12, 2> | function \n" |
335 "}\n", | 363 " | | float @f0(i32 %p0, float " |
| 364 "%p1) { \n" |
| 365 " | | // BlockID " |
| 366 "= 12\n" |
| 367 " 60:0| 3: <1, 1> | blocks 1;\n" |
| 368 " | | %b0:\n" |
| 369 " 62:4| 3: <24, 2, 1, 1> | store float %p1, float* " |
| 370 "%p0, \n" |
| 371 " | | align 1;\n" |
| 372 " 66:4| 3: <10, 1> | ret float %p1;\n" |
| 373 " 69:0| 0: <65534> | }\n" |
| 374 " 72:0|0: <65534> |}\n", |
336 DumpMunger.getTestResults()); | 375 DumpMunger.getTestResults()); |
337 NaClParseBitcodeMunger Munger(BitcodeRecords, | 376 NaClParseBitcodeMunger Munger(BitcodeRecords, |
338 array_lengthof(BitcodeRecords), Terminator); | 377 array_lengthof(BitcodeRecords), Terminator); |
339 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true)); | 378 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true)); |
340 | 379 |
341 // Show what happens when changing alignment to 0. | 380 // Show what happens when changing alignment to 0. |
342 const uint64_t Align0[] = { | 381 const uint64_t Align0[] = { |
343 ReplaceIndex, NaClBitcodeMunger::Replace, | 382 ReplaceIndex, NaClBitcodeMunger::Replace, |
344 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
345 }; | 384 }; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 DumpMunger.getLinesWithSubstring("store")); | 434 DumpMunger.getLinesWithSubstring("store")); |
396 | 435 |
397 // Show what happens when changing alignment to 2**30. | 436 // Show what happens when changing alignment to 2**30. |
398 const uint64_t Align30[] = { | 437 const uint64_t Align30[] = { |
399 ReplaceIndex, NaClBitcodeMunger::Replace, | 438 ReplaceIndex, NaClBitcodeMunger::Replace, |
400 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 439 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
401 }; | 440 }; |
402 EXPECT_FALSE(Munger.runTest( | 441 EXPECT_FALSE(Munger.runTest( |
403 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true)); | 442 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true)); |
404 EXPECT_EQ( | 443 EXPECT_EQ( |
405 "Error: (50:4) Alignment can't be greater than 2**29. Found: 2**30\n" | 444 "Error: (66:4) Alignment can't be greater than 2**29. Found: 2**30\n" |
406 "Error: Invalid value in record\n", | 445 "Error: Invalid value in record\n", |
407 Munger.getTestResults()); | 446 Munger.getTestResults()); |
408 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 447 EXPECT_FALSE(DumpMunger.runTestForAssembly( |
409 "BadStoreAlignment-30", Align30, array_lengthof(Align30))); | 448 "BadStoreAlignment-30", Align30, array_lengthof(Align30))); |
410 EXPECT_EQ( | 449 EXPECT_EQ( |
411 " store float %p1, float* %p0, align 0;\n" | 450 " store float %p1, float* %p0, align 0;\n" |
412 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 451 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
413 DumpMunger.getLinesWithSubstring("store")); | 452 DumpMunger.getLinesWithSubstring("store")); |
414 } | 453 } |
415 | 454 |
416 } // end of anonamous namespace. | 455 } // end of anonamous namespace. |
OLD | NEW |