diff options
Diffstat (limited to 'include/llvm/Bitcode/BitstreamReader.h')
| -rw-r--r-- | include/llvm/Bitcode/BitstreamReader.h | 26 | 
1 files changed, 13 insertions, 13 deletions
| diff --git a/include/llvm/Bitcode/BitstreamReader.h b/include/llvm/Bitcode/BitstreamReader.h index 865a3e668428..46e64d112ea7 100644 --- a/include/llvm/Bitcode/BitstreamReader.h +++ b/include/llvm/Bitcode/BitstreamReader.h @@ -24,8 +24,6 @@  namespace llvm { -class Deserializer; -  /// This class is used to read from an LLVM bitcode stream, maintaining  /// information that is global to decoding the entire file. While a file is  /// being read, multiple cursors can be independently advanced or skipped around @@ -50,8 +48,8 @@ private:    /// information in the BlockInfo block. Only llvm-bcanalyzer uses this.    bool IgnoreBlockInfoNames; -  BitstreamReader(const BitstreamReader&) LLVM_DELETED_FUNCTION; -  void operator=(const BitstreamReader&) LLVM_DELETED_FUNCTION; +  BitstreamReader(const BitstreamReader&) = delete; +  void operator=(const BitstreamReader&) = delete;  public:    BitstreamReader() : IgnoreBlockInfoNames(true) {    } @@ -164,7 +162,6 @@ struct BitstreamEntry {  /// Unlike iterators, BitstreamCursors are heavy-weight objects that should not  /// be passed by value.  class BitstreamCursor { -  friend class Deserializer;    BitstreamReader *BitStream;    size_t NextChar; @@ -201,6 +198,8 @@ class BitstreamCursor {  public: +  static const size_t MaxChunkSize = sizeof(word_t) * 8; +    BitstreamCursor() { init(nullptr); }    explicit BitstreamCursor(BitstreamReader &R) { init(&R); } @@ -258,8 +257,8 @@ public:      AF_DontAutoprocessAbbrevs = 2    }; -      /// Advance the current bitstream, returning the next entry in the stream. -      BitstreamEntry advance(unsigned Flags = 0) { +  /// Advance the current bitstream, returning the next entry in the stream. +  BitstreamEntry advance(unsigned Flags = 0) {      while (1) {        unsigned Code = ReadCode();        if (Code == bitc::END_BLOCK) { @@ -301,7 +300,7 @@ public:    /// Reset the stream to the specified bit number.    void JumpToBit(uint64_t BitNo) { -    uintptr_t ByteNo = uintptr_t(BitNo/8) & ~(sizeof(word_t)-1); +    size_t ByteNo = size_t(BitNo/8) & ~(sizeof(word_t)-1);      unsigned WordBitNo = unsigned(BitNo & (sizeof(word_t)*8-1));      assert(canSkipToPos(ByteNo) && "Invalid location"); @@ -315,7 +314,8 @@ public:    }    void fillCurWord() { -    assert(Size == 0 || NextChar < (unsigned)Size); +    if (Size != 0 && NextChar >= Size) +      report_fatal_error("Unexpected end of file");      // Read the next word from the stream.      uint8_t Array[sizeof(word_t)] = {0}; @@ -337,7 +337,7 @@ public:    }    word_t Read(unsigned NumBits) { -    static const unsigned BitsInWord = sizeof(word_t) * 8; +    static const unsigned BitsInWord = MaxChunkSize;      assert(NumBits && NumBits <= BitsInWord &&             "Cannot return zero or more than BitsInWord bits!"); @@ -490,11 +490,11 @@ private:    //===--------------------------------------------------------------------===//  public: -    /// Return the abbreviation for the specified AbbrevId.    const BitCodeAbbrev *getAbbrev(unsigned AbbrevID) { -    unsigned AbbrevNo = AbbrevID-bitc::FIRST_APPLICATION_ABBREV; -    assert(AbbrevNo < CurAbbrevs.size() && "Invalid abbrev #!"); +    unsigned AbbrevNo = AbbrevID - bitc::FIRST_APPLICATION_ABBREV; +    if (AbbrevNo >= CurAbbrevs.size()) +      report_fatal_error("Invalid abbrev number");      return CurAbbrevs[AbbrevNo].get();    } | 
