Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- llvm/unittest/Bitcode/NaClMungeWriteErrorTests.cpp -----------------===// | 1 //===- llvm/unittest/Bitcode/NaClMungeWriteErrorTests.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 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 252 "Error \\(Block 17\\)\\: Uses illegal abbreviation index\\: 4\\: \\[2\\]" | 252 "Error \\(Block 17\\)\\: Uses illegal abbreviation index\\: 4\\: \\[2\\]" |
| 253 ".*" | 253 ".*" |
| 254 // Corresponding error while parsing. | 254 // Corresponding error while parsing. |
| 255 "Fatal\\(35\\:0)\\: Invalid abbreviation \\# 4 defined for record" | 255 "Fatal\\(35\\:0)\\: Invalid abbreviation \\# 4 defined for record" |
| 256 ".*" | 256 ".*" |
| 257 // Output of report_fatal_error. | 257 // Output of report_fatal_error. |
| 258 "LLVM ERROR\\: Unable to continue" | 258 "LLVM ERROR\\: Unable to continue" |
| 259 ".*"); | 259 ".*"); |
| 260 } | 260 } |
| 261 | 261 |
| 262 // Show that we check that the abbreviation actually applies to the | |
| 263 // record associated with that abbreviation. Also shows that we repair | |
| 264 // the problem by applying the default abbreviation instead.o | |
|
jvoung (off chromium)
2015/05/20 22:40:10
instead.o --> instead.
Karl
2015/05/21 18:22:08
Done.
| |
| 265 TEST(NaClMungeWriteErrorsTests, TestMismatchedAbbreviation) { | |
| 266 // Create edits to: | |
| 267 // 1) Expand the number of abbreviation index bits for the block from 2 to 3. | |
| 268 // 2) Introduce the incorrect abbreviation for the return instruction. | |
| 269 // i.e. [9] instead of [10]. | |
| 270 // 3) Apply the bad abbreviation to record "ret" | |
| 271 const uint64_t FunctionEnterIndex = 7; | |
| 272 const uint64_t Edits[] { | |
| 273 FunctionEnterIndex, NaClMungedBitcode::Replace, | |
| 274 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 3, Terminator, | |
| 275 RetVoidIndex, NaClMungedBitcode::AddBefore, | |
|
jvoung (off chromium)
2015/05/20 22:40:10
I guess it is kind of cool/weird that you can defi
Karl
2015/05/21 18:22:08
It is.
| |
| 276 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, 1, | |
| 277 naclbitc::FUNC_CODE_INST_RET - 1, Terminator, | |
| 278 RetVoidIndex, NaClMungedBitcode::Replace, | |
| 279 4, naclbitc::FUNC_CODE_INST_RET, Terminator | |
| 280 }; | |
| 281 | |
| 282 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | |
| 283 Munger.munge(ARRAY(Edits)); | |
| 284 EXPECT_EQ( | |
| 285 " 1: [65535, 8, 2]\n" | |
| 286 " 1: [65535, 17, 3]\n" | |
| 287 " 3: [1, 2]\n" | |
| 288 " 3: [2]\n" | |
| 289 " 3: [21, 0, 0]\n" | |
| 290 " 0: [65534]\n" | |
| 291 " 3: [8, 1, 0, 0, 0]\n" | |
| 292 " 1: [65535, 12, 3]\n" // Upped abbreviation index bits to 3 | |
| 293 " 3: [1, 1]\n" | |
| 294 " 2: [65533, 1, 1, 9]\n" // added abbrev 4: [9] | |
| 295 " 4: [10]\n" // "ret" with bad abbreviation. | |
| 296 " 0: [65534]\n" | |
| 297 " 0: [65534]\n", | |
| 298 stringify(Munger)); | |
| 299 Munger.setTryToRecoverOnWrite(true); | |
| 300 EXPECT_TRUE(Munger.runTest()); | |
|
jvoung (off chromium)
2015/05/20 22:40:10
Add a run without recovery too?
Karl
2015/05/21 18:22:08
Done.
| |
| 301 EXPECT_EQ( | |
| 302 "Error (Block 12): Abbreviation doesn't apply to record: 4: [10]\n" | |
| 303 " 1: [65535, 8, 2]\n" | |
| 304 " 1: [65535, 17, 3]\n" | |
| 305 " 3: [1, 2]\n" | |
| 306 " 3: [2]\n" | |
| 307 " 3: [21, 0, 0]\n" | |
| 308 " 0: [65534]\n" | |
| 309 " 3: [8, 1, 0, 0, 0]\n" | |
| 310 " 1: [65535, 12, 3]\n" | |
| 311 " 3: [1, 1]\n" | |
| 312 " 2: [65533, 1, 1, 9]\n" | |
| 313 " 3: [10]\n" // Implicit repair here. | |
| 314 " 0: [65534]\n" | |
| 315 " 0: [65534]\n", | |
| 316 Munger.getTestResults()); | |
| 317 } | |
| 318 | |
| 319 // Show that we recognize when an abbreviation definition record is | |
| 320 // malformed. Also show that we repair the problem by removing the | |
| 321 // definition. | |
| 322 TEST(NaClMungeWriteErrorsTests, TestWritingMalformedAbbreviation) { | |
| 323 // Create edits to: | |
| 324 // 1) Expand the number of abbreviation index bits for the block from 2 to 3. | |
| 325 // 2) Leave out the "literal" operand encoding out. | |
| 326 const uint64_t FunctionEnterIndex = 7; | |
| 327 const uint64_t Edits[] { | |
| 328 FunctionEnterIndex, NaClMungedBitcode::Replace, // Set Abbrev bits = 3 | |
| 329 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 3, Terminator, | |
| 330 RetVoidIndex, NaClMungedBitcode::AddBefore, // bad abbreviation! | |
| 331 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, // 1, | |
|
jvoung (off chromium)
2015/05/20 22:40:10
How about expand on why the "// 1,"? E.g.,
// 1,
Karl
2015/05/21 18:22:08
Done.
| |
| 332 naclbitc::FUNC_CODE_INST_RET, Terminator, | |
| 333 }; | |
| 334 | |
| 335 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | |
| 336 Munger.setTryToRecoverOnWrite(true); | |
| 337 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); | |
| 338 EXPECT_EQ( | |
| 339 "Error (Block 12): Error: Bad abbreviation operand encoding 10: " | |
| 340 "2: [65533, 1, 10]\n" | |
| 341 " 1: [65535, 8, 2]\n" | |
| 342 " 1: [65535, 17, 3]\n" | |
| 343 " 3: [1, 2]\n" | |
| 344 " 3: [2]\n" | |
| 345 " 3: [21, 0, 0]\n" | |
| 346 " 0: [65534]\n" | |
| 347 " 3: [8, 1, 0, 0, 0]\n" | |
| 348 " 1: [65535, 12, 3]\n" // Note: not followed by abbreviation def. | |
| 349 " 3: [1, 1]\n" | |
| 350 " 3: [10]\n" | |
| 351 " 0: [65534]\n" | |
| 352 " 0: [65534]\n", | |
| 353 Munger.getTestResults()); | |
| 354 } | |
| 355 | |
| 356 // Show how we deal with additional abbreviations defined for a block, | |
| 357 // once a bad abbreviation definition record is found. That is, we | |
| 358 // remove all succeeding abbreviations definitions for that block. In | |
| 359 // addition, any record refering to a remove abbreviation is changed | |
| 360 // to use the default abbreviation. | |
| 361 TEST(NaClMungedWriteErrorTests, TestRemovingAbbrevWithMultAbbrevs) { | |
| 362 NaClWriteMunger Munger(ARRAY_TERM(BitcodeRecords)); | |
| 363 const uint64_t FunctionEnterIndex = 7; | |
| 364 const uint64_t Edits[] { | |
| 365 FunctionEnterIndex, NaClMungedBitcode::Replace, // Set Abbrev bits = 3 | |
| 366 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 3, Terminator, | |
| 367 RetVoidIndex, NaClMungedBitcode::AddBefore, // bad abbreviation! | |
| 368 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, // 1, | |
| 369 naclbitc::FUNC_CODE_INST_RET - 1, Terminator, | |
| 370 RetVoidIndex, NaClMungedBitcode::AddBefore, // good abbreviation to ignore. | |
| 371 2, naclbitc::BLK_CODE_DEFINE_ABBREV, 1, 1, | |
| 372 naclbitc::FUNC_CODE_INST_RET, Terminator, | |
| 373 RetVoidIndex, NaClMungedBitcode::Replace, // reference to good abreviation. | |
| 374 5, naclbitc::FUNC_CODE_INST_RET, Terminator | |
| 375 }; | |
| 376 | |
| 377 Munger.setTryToRecoverOnWrite(true); | |
| 378 EXPECT_TRUE(Munger.runTest(ARRAY(Edits))); | |
| 379 EXPECT_EQ( | |
| 380 "Error (Block 12): Error: Bad abbreviation operand encoding 9:" | |
| 381 " 2: [65533, 1, 9]\n" | |
| 382 "Error (Block 12): Ignoring abbreviation: 2: [65533, 1, 1, 10]\n" | |
| 383 "Error (Block 12): Uses illegal abbreviation index: 5: [10]\n" | |
| 384 " 1: [65535, 8, 2]\n" | |
| 385 " 1: [65535, 17, 3]\n" | |
| 386 " 3: [1, 2]\n" | |
| 387 " 3: [2]\n" | |
| 388 " 3: [21, 0, 0]\n" | |
| 389 " 0: [65534]\n" | |
| 390 " 3: [8, 1, 0, 0, 0]\n" | |
| 391 " 1: [65535, 12, 3]\n" | |
| 392 " 3: [1, 1]\n" | |
| 393 " 3: [10]\n" // Abbreviation index 5 replaced with default. | |
| 394 " 0: [65534]\n" | |
| 395 " 0: [65534]\n", | |
| 396 Munger.getTestResults()); | |
| 397 } | |
| 398 | |
| 262 // Show that error recovery works when writing an illegal abbreviation | 399 // Show that error recovery works when writing an illegal abbreviation |
| 263 // index. Show success by parsing fixed bitcode. | 400 // index. Show success by parsing fixed bitcode. |
| 264 TEST(NaClMungeWriteErrorTests, RecoverWhenParsingBadAbbrevIndex) { | 401 TEST(NaClMungeWriteErrorTests, RecoverWhenParsingBadAbbrevIndex) { |
| 265 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); | 402 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 266 Munger.setTryToRecoverOnWrite(true); | 403 Munger.setTryToRecoverOnWrite(true); |
| 267 EXPECT_TRUE( | 404 EXPECT_TRUE( |
| 268 Munger.runTest(ARRAY(AbbrevIndex4VoidTypeEdit), true)); | 405 Munger.runTest(ARRAY(AbbrevIndex4VoidTypeEdit), true)); |
| 269 EXPECT_EQ( | 406 EXPECT_EQ( |
| 270 "Error (Block 17): Uses illegal abbreviation index: 4: [2]\n" | 407 "Error (Block 17): Uses illegal abbreviation index: 4: [2]\n" |
| 271 "Successful parse!\n", | 408 "Successful parse!\n", |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 383 " 3: [10]\n" | 520 " 3: [10]\n" |
| 384 " 0: [65534]\n" | 521 " 0: [65534]\n" |
| 385 " 0: [65534]\n" | 522 " 0: [65534]\n" |
| 386 " 1: [65535, 4294967295, 3]\n" | 523 " 1: [65535, 4294967295, 3]\n" |
| 387 " 3: [1, 4]\n" | 524 " 3: [1, 4]\n" |
| 388 " 0: [65534]\n", | 525 " 0: [65534]\n", |
| 389 Munger.getTestResults()); | 526 Munger.getTestResults()); |
| 390 } | 527 } |
| 391 | 528 |
| 392 } // end of namespace naclmungetest | 529 } // end of namespace naclmungetest |
| OLD | NEW |