summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Bitcode/BitstreamReaderTest.cpp
diff options
context:
space:
mode:
authorJF Bastien <jfbastien@apple.com>2019-06-26 19:50:12 +0000
committerJF Bastien <jfbastien@apple.com>2019-06-26 19:50:12 +0000
commit0e828958264734e60115ba2482437008c822d7db (patch)
tree3fc2aa5876f36d46ae328df9b7a5ee7dfa781894 /llvm/unittests/Bitcode/BitstreamReaderTest.cpp
parentafa58b6ba19a54e6fd41ab3994e114f0f6bcb239 (diff)
downloadbcm5719-llvm-0e828958264734e60115ba2482437008c822d7db.tar.gz
bcm5719-llvm-0e828958264734e60115ba2482437008c822d7db.zip
BitStream reader: propagate errors
The bitstream reader handles errors poorly. This has two effects: * Bugs in file handling (especially modules) manifest as an "unexpected end of file" crash * Users of clang as a library end up aborting because the code unconditionally calls `report_fatal_error` The bitstream reader should be more resilient and return Expected / Error as soon as an error is encountered, not way late like it does now. This patch starts doing so and adopting the error handling where I think it makes sense. There's plenty more to do: this patch propagates errors to be minimally useful, and follow-ups will propagate them further and improve diagnostics. https://bugs.llvm.org/show_bug.cgi?id=42311 <rdar://problem/33159405> Differential Revision: https://reviews.llvm.org/D63518 llvm-svn: 364464
Diffstat (limited to 'llvm/unittests/Bitcode/BitstreamReaderTest.cpp')
-rw-r--r--llvm/unittests/Bitcode/BitstreamReaderTest.cpp36
1 files changed, 25 insertions, 11 deletions
diff --git a/llvm/unittests/Bitcode/BitstreamReaderTest.cpp b/llvm/unittests/Bitcode/BitstreamReaderTest.cpp
index 85954858609..89657d9e992 100644
--- a/llvm/unittests/Bitcode/BitstreamReaderTest.cpp
+++ b/llvm/unittests/Bitcode/BitstreamReaderTest.cpp
@@ -22,15 +22,17 @@ TEST(BitstreamReaderTest, AtEndOfStream) {
BitstreamCursor Cursor(Bytes);
EXPECT_FALSE(Cursor.AtEndOfStream());
- (void)Cursor.Read(8);
+ Expected<SimpleBitstreamCursor::word_t> MaybeRead = Cursor.Read(8);
+ EXPECT_TRUE((bool)MaybeRead);
EXPECT_FALSE(Cursor.AtEndOfStream());
- (void)Cursor.Read(24);
+ MaybeRead = Cursor.Read(24);
+ EXPECT_TRUE((bool)MaybeRead);
EXPECT_TRUE(Cursor.AtEndOfStream());
- Cursor.JumpToBit(0);
+ EXPECT_FALSE(Cursor.JumpToBit(0));
EXPECT_FALSE(Cursor.AtEndOfStream());
- Cursor.JumpToBit(32);
+ EXPECT_FALSE(Cursor.JumpToBit(32));
EXPECT_TRUE(Cursor.AtEndOfStream());
}
@@ -40,7 +42,7 @@ TEST(BitstreamReaderTest, AtEndOfStreamJump) {
};
BitstreamCursor Cursor(Bytes);
- Cursor.JumpToBit(32);
+ EXPECT_FALSE(Cursor.JumpToBit(32));
EXPECT_TRUE(Cursor.AtEndOfStream());
}
@@ -56,7 +58,8 @@ TEST(BitstreamReaderTest, getCurrentByteNo) {
for (unsigned I = 0, E = 32; I != E; ++I) {
EXPECT_EQ(I / 8, Cursor.getCurrentByteNo());
- (void)Cursor.Read(1);
+ Expected<SimpleBitstreamCursor::word_t> MaybeRead = Cursor.Read(1);
+ EXPECT_TRUE((bool)MaybeRead);
}
EXPECT_EQ(4u, Cursor.getCurrentByteNo());
}
@@ -116,24 +119,33 @@ TEST(BitstreamReaderTest, readRecordWithBlobWhileStreaming) {
// Header. Included in test so that we can run llvm-bcanalyzer to debug
// when there are problems.
- ASSERT_EQ(Magic, Stream.Read(32));
+ Expected<SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(32);
+ ASSERT_TRUE((bool)MaybeRead);
+ ASSERT_EQ(Magic, MaybeRead.get());
// Block.
- BitstreamEntry Entry =
+ Expected<BitstreamEntry> MaybeEntry =
Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs);
+ ASSERT_TRUE((bool)MaybeEntry);
+ BitstreamEntry Entry = MaybeEntry.get();
ASSERT_EQ(BitstreamEntry::SubBlock, Entry.Kind);
ASSERT_EQ(BlockID, Entry.ID);
ASSERT_FALSE(Stream.EnterSubBlock(BlockID));
// Abbreviation.
- Entry = Stream.advance();
+ MaybeEntry = Stream.advance();
+ ASSERT_TRUE((bool)MaybeEntry);
+ Entry = MaybeEntry.get();
ASSERT_EQ(BitstreamEntry::Record, Entry.Kind);
ASSERT_EQ(AbbrevID, Entry.ID);
// Record.
StringRef BlobOut;
SmallVector<uint64_t, 1> Record;
- ASSERT_EQ(RecordID, Stream.readRecord(Entry.ID, Record, &BlobOut));
+ Expected<unsigned> MaybeRecord =
+ Stream.readRecord(Entry.ID, Record, &BlobOut);
+ ASSERT_TRUE((bool)MaybeRecord);
+ ASSERT_EQ(RecordID, MaybeRecord.get());
EXPECT_TRUE(Record.empty());
EXPECT_EQ(BlobIn, BlobOut);
}
@@ -143,7 +155,9 @@ TEST(BitstreamReaderTest, shortRead) {
uint8_t Bytes[] = {8, 7, 6, 5, 4, 3, 2, 1};
for (unsigned I = 1; I != 8; ++I) {
SimpleBitstreamCursor Cursor(ArrayRef<uint8_t>(Bytes, I));
- EXPECT_EQ(8ull, Cursor.Read(8));
+ Expected<SimpleBitstreamCursor::word_t> MaybeRead = Cursor.Read(8);
+ ASSERT_TRUE((bool)MaybeRead);
+ EXPECT_EQ(8ull, MaybeRead.get());
}
}
OpenPOWER on IntegriCloud