From: Peter Collingbourne Date: Wed, 2 Nov 2016 02:58:47 +0000 (+0000) Subject: Bitcode: Fix short read implementation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7cfe6227d35d228e273d3686b93e6c3fd96015eb;p=llvm Bitcode: Fix short read implementation. We need to zero extend the byte in order to correctly shift it into a 64-bit value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285785 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Bitcode/BitstreamReader.h b/include/llvm/Bitcode/BitstreamReader.h index 8808935837a..b258e806e67 100644 --- a/include/llvm/Bitcode/BitstreamReader.h +++ b/include/llvm/Bitcode/BitstreamReader.h @@ -232,7 +232,7 @@ public: BytesRead = Buf.size() - NextChar; CurWord = 0; for (unsigned B = 0; B != BytesRead; ++B) - CurWord |= NextCharPtr[B] << (B * 8); + CurWord |= uint64_t(NextCharPtr[B]) << (B * 8); } NextChar += BytesRead; BitsInCurWord = BytesRead * 8; diff --git a/unittests/Bitcode/BitstreamReaderTest.cpp b/unittests/Bitcode/BitstreamReaderTest.cpp index b5bd4a6fb5a..986023ee3e9 100644 --- a/unittests/Bitcode/BitstreamReaderTest.cpp +++ b/unittests/Bitcode/BitstreamReaderTest.cpp @@ -158,4 +158,13 @@ TEST(BitstreamReaderTest, readRecordWithBlobWhileStreaming) { } } +TEST(BitstreamReaderTest, shortRead) { + uint8_t Bytes[] = {8, 7, 6, 5, 4, 3, 2, 1}; + for (unsigned I = 1; I != 8; ++I) { + BitstreamReader Reader(ArrayRef(Bytes, I)); + SimpleBitstreamCursor Cursor(Reader); + EXPECT_EQ(8ull, Cursor.Read(8)); + } +} + } // end anonymous namespace