Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: include/llvm/Bitcode/NaCl/NaClBitcodeParser.h

Issue 932953002: Fix the NaCl bitstream reader to report fatal errors. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Merge with master Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- NaClBitcodeParser.h -----------------------------------*- C++ -*-===// 1 //===- NaClBitcodeParser.h -----------------------------------*- C++ -*-===//
2 // Low-level bitcode driver to parse PNaCl bitcode files. 2 // Low-level bitcode driver to parse PNaCl bitcode files.
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 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 /// The block ID to use if a global abbreviation. Note: This field is 406 /// The block ID to use if a global abbreviation. Note: This field is
407 /// updated by calls to method SetBID. 407 /// updated by calls to method SetBID.
408 unsigned GlobalBlockID; 408 unsigned GlobalBlockID;
409 }; 409 };
410 410
411 /// Parses a block in the PNaCl bitcode stream. 411 /// Parses a block in the PNaCl bitcode stream.
412 class NaClBitcodeParser { 412 class NaClBitcodeParser {
413 // Allow listener privledges, so that it can update/call the parser 413 // Allow listener privledges, so that it can update/call the parser
414 // using a clean API. 414 // using a clean API.
415 friend class NaClBitcodeParserListener; 415 friend class NaClBitcodeParserListener;
416
417 // Implements an error handler for errors in the bitstream reader.
418 // Redirects bitstream reader errors to corresponding parrser error
419 // reporting function.
420 class ErrorHandler : public NaClBitstreamCursor::ErrorHandler {
421 NaClBitcodeParser *Parser;
422 public:
423 ErrorHandler(NaClBitcodeParser *Parser,
424 NaClBitstreamCursor &Cursor):
425 NaClBitstreamCursor::ErrorHandler(Cursor), Parser(Parser) {}
426 LLVM_ATTRIBUTE_NORETURN
427 void Fatal(const std::string &ErrorMessage) const final {
428 Parser->FatalAt(getCurrentBitNo(), ErrorMessage);
429 }
430 ~ErrorHandler() override {}
431 };
432
416 public: 433 public:
417
418 // Creates a parser to parse the the block at the given cursor in 434 // Creates a parser to parse the the block at the given cursor in
419 // the PNaCl bitcode stream. This instance is a "dummy" instance 435 // the PNaCl bitcode stream. This instance is a "dummy" instance
420 // that starts the parser. 436 // that starts the parser.
421 explicit NaClBitcodeParser(NaClBitstreamCursor &Cursor) 437 explicit NaClBitcodeParser(NaClBitstreamCursor &Cursor)
422 : EnclosingParser(0), 438 : EnclosingParser(0),
423 Block(ILLEGAL_BLOCK_ID, Cursor), 439 Block(ILLEGAL_BLOCK_ID, Cursor),
424 Record(Block), 440 Record(Block),
425 Listener(0), 441 Listener(0),
426 ErrStream(&errs()) 442 ErrStream(&errs()) {
427 {} 443 std::unique_ptr<NaClBitstreamCursor::ErrorHandler>
444 ErrHandler(new ErrorHandler(this, Cursor));
445 Cursor.setErrorHandler(ErrHandler);
446 }
428 447
429 virtual ~NaClBitcodeParser(); 448 virtual ~NaClBitcodeParser();
430 449
431 /// Reads the (top-level) block associated with the given block 450 /// Reads the (top-level) block associated with the given block
432 /// record at the stream cursor. Returns true if unable to parse. 451 /// record at the stream cursor. Returns true if unable to parse.
433 /// Can be called multiple times to parse multiple blocks. 452 /// Can be called multiple times to parse multiple blocks.
434 bool Parse(); 453 bool Parse();
435 454
436 // Called once the bitstream reader has entered the corresponding 455 // Called once the bitstream reader has entered the corresponding
437 // subblock. Argument NumWords is set to the number of words in the 456 // subblock. Argument NumWords is set to the number of words in the
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 // 2) Temporarily modify it for a single error message. In this context, 495 // 2) Temporarily modify it for a single error message. In this context,
477 // the method Error() is overridden in the derived class, and 496 // the method Error() is overridden in the derived class, and
478 // calls this method twice. Once before calling base method Error(), 497 // calls this method twice. Once before calling base method Error(),
479 // and followed by a second call to restore the default error stream. 498 // and followed by a second call to restore the default error stream.
480 raw_ostream &setErrStream(raw_ostream &Stream) { 499 raw_ostream &setErrStream(raw_ostream &Stream) {
481 raw_ostream &OldErrStream = *ErrStream; 500 raw_ostream &OldErrStream = *ErrStream;
482 ErrStream = &Stream; 501 ErrStream = &Stream;
483 return OldErrStream; 502 return OldErrStream;
484 } 503 }
485 504
486 // Called when error occurs. Message is the error to report. Always 505 // Called when an error occurs. BitPosition is the bit position the
506 // error was found, and Message is the error to report. Always
487 // returns true (the error return value of Parse). 507 // returns true (the error return value of Parse).
488 virtual bool Error(const std::string &Message) { 508 virtual bool ErrorAt(uint64_t BitPosition, const std::string &Message);
489 *ErrStream << "Error: " << Message << "\n"; 509
490 return true; 510 // Called when an error occurs. Message is the error to
511 // report. Always returns true (the error return value of Parse).
512 bool Error(const std::string &Message) {
513 return ErrorAt(Record.GetStartBit(), Message);
514 }
515
516 // Called when a fatal error occurs. BitPosition is the bit position
517 // the error was found, and Message is the error to report. Does not
518 // return.
519 LLVM_ATTRIBUTE_NORETURN
520 virtual void FatalAt(uint64_t BitPosition, const std::string &Message);
521
522 // Called when a fatal error occurs. Message is the error to
523 // report. Does not return.
524 LLVM_ATTRIBUTE_NORETURN
525 void Fatal(const std::string &Message) {
526 FatalAt(Record.GetStartBit(), Message);
527 }
528
529 // Generates fatal generic error message.
530 LLVM_ATTRIBUTE_NORETURN
531 void Fatal() {
532 Fatal("Fatal error occurred!");
491 } 533 }
492 534
493 // Returns the number of bits in this block, including nested blocks. 535 // Returns the number of bits in this block, including nested blocks.
494 unsigned GetBlockNumBits() const { 536 unsigned GetBlockNumBits() const {
495 return Block.GetNumBits(); 537 return Block.GetNumBits();
496 } 538 }
497 539
498 // Returns the number of bits in this block, excluding nested blocks. 540 // Returns the number of bits in this block, excluding nested blocks.
499 unsigned GetBlockLocalNumBits() const { 541 unsigned GetBlockLocalNumBits() const {
500 return Block.GetLocalNumBits(); 542 return Block.GetLocalNumBits();
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 } 635 }
594 636
595 // Parses a BlockInfo block, where processing is handled through 637 // Parses a BlockInfo block, where processing is handled through
596 // a listener in the bitstream reader. 638 // a listener in the bitstream reader.
597 bool ParseBlockInfoInternal(); 639 bool ParseBlockInfoInternal();
598 640
599 // Parses the non-BlockInfo block. Returns true if unable to parse the 641 // Parses the non-BlockInfo block. Returns true if unable to parse the
600 // block. 642 // block.
601 bool ParseBlockInternal(); 643 bool ParseBlockInternal();
602 644
603
604 void operator=(const NaClBitcodeParser &Parser) LLVM_DELETED_FUNCTION; 645 void operator=(const NaClBitcodeParser &Parser) LLVM_DELETED_FUNCTION;
605 NaClBitcodeParser(const NaClBitcodeParser &Parser) LLVM_DELETED_FUNCTION; 646 NaClBitcodeParser(const NaClBitcodeParser &Parser) LLVM_DELETED_FUNCTION;
606 647
607 }; 648 };
608 649
609 } // namespace llvm 650 } // namespace llvm
610 651
611 #endif 652 #endif
OLDNEW
« no previous file with comments | « include/llvm/Bitcode/NaCl/NaClBitcodeMunge.h ('k') | include/llvm/Bitcode/NaCl/NaClBitstreamReader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698