Skip to content

Commit d779dda

Browse files
committed
Fix index while building following bitstream reader API update
Upstream change in rL364464 broke downstream index while building. apple-llvm-split-commit: 994094aa63b43bc0bc2d900ce27c0f376ac10f5c apple-llvm-split-dir: clang/
1 parent af93446 commit d779dda

File tree

3 files changed

+87
-26
lines changed

3 files changed

+87
-26
lines changed

clang/lib/Index/BitstreamVisitor.h

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ struct SavedStreamPosition {
2626
: Cursor(Cursor), Offset(Cursor.GetCurrentBitNo()) { }
2727

2828
~SavedStreamPosition() {
29-
Cursor.JumpToBit(Offset);
29+
if (llvm::Error Err = Cursor.JumpToBit(Offset))
30+
llvm::report_fatal_error("SavedStreamPosition failed jumping: " +
31+
toString(std::move(Err)));
3032
}
3133

3234
private:
@@ -62,7 +64,12 @@ class BitstreamVisitor {
6264

6365
ASTReader::RecordData Record;
6466
while (1) {
65-
llvm::BitstreamEntry Entry = Stream.advance(llvm::BitstreamCursor::AF_DontPopBlockAtEnd);
67+
Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(llvm::BitstreamCursor::AF_DontPopBlockAtEnd);
68+
if (!MaybeEntry) {
69+
Error = toString(MaybeEntry.takeError());
70+
return false;
71+
}
72+
llvm::BitstreamEntry Entry = MaybeEntry.get();
6673

6774
switch (Entry.Kind) {
6875
case llvm::BitstreamEntry::Error:
@@ -83,7 +90,12 @@ class BitstreamVisitor {
8390

8491
case llvm::BitstreamEntry::SubBlock: {
8592
if (Entry.ID == llvm::bitc::BLOCKINFO_BLOCK_ID) {
86-
BlockInfo = Stream.ReadBlockInfoBlock();
93+
Expected<Optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo = Stream.ReadBlockInfoBlock();
94+
if (!MaybeBlockInfo) {
95+
Error = toString(MaybeBlockInfo.takeError());
96+
return false;
97+
}
98+
BlockInfo = MaybeBlockInfo.get();
8799
if (!BlockInfo) {
88100
Error = "malformed BlockInfoBlock";
89101
return false;
@@ -99,7 +111,10 @@ class BitstreamVisitor {
99111
Error = "malformed block record";
100112
return false;
101113
}
102-
readBlockAbbrevs(Stream);
114+
if (llvm::Error Err = readBlockAbbrevs(Stream)) {
115+
Error = toString(std::move(Err));
116+
return false;
117+
}
103118
BlockStack.push_back(Entry.ID);
104119
break;
105120

@@ -121,15 +136,23 @@ class BitstreamVisitor {
121136
case llvm::BitstreamEntry::Record: {
122137
Record.clear();
123138
StringRef Blob;
124-
unsigned RecID = Stream.readRecord(Entry.ID, Record, &Blob);
139+
Expected<unsigned> MaybeRecID = Stream.readRecord(Entry.ID, Record, &Blob);
140+
if (!MaybeRecID) {
141+
Error = toString(MaybeRecID.takeError());
142+
return false;
143+
}
144+
unsigned RecID = MaybeRecID.get();
125145
unsigned BlockID = BlockStack.empty() ? 0 : BlockStack.back();
126146
StreamVisit Ret = static_cast<ImplClass*>(this)->visitRecord(BlockID, RecID, Record, Blob);
127147
switch (Ret) {
128148
case StreamVisit::Continue:
129149
break;
130150

131151
case StreamVisit::Skip:
132-
Stream.skipRecord(Entry.ID);
152+
if (Expected<unsigned> Skipped = Stream.skipRecord(Entry.ID)) {
153+
Error = toString(Skipped.takeError());
154+
return false;
155+
}
133156
break;
134157

135158
case StreamVisit::Abort:
@@ -141,17 +164,22 @@ class BitstreamVisitor {
141164
}
142165
}
143166

144-
static void readBlockAbbrevs(llvm::BitstreamCursor &Cursor) {
167+
static llvm::Error readBlockAbbrevs(llvm::BitstreamCursor &Cursor) {
145168
while (true) {
146169
uint64_t Offset = Cursor.GetCurrentBitNo();
147-
unsigned Code = Cursor.ReadCode();
170+
Expected<unsigned> MaybeCode = Cursor.ReadCode();
171+
if (!MaybeCode)
172+
return MaybeCode.takeError();
173+
unsigned Code = MaybeCode.get();
148174

149175
// We expect all abbrevs to be at the start of the block.
150176
if (Code != llvm::bitc::DEFINE_ABBREV) {
151-
Cursor.JumpToBit(Offset);
152-
return;
177+
if (llvm::Error Err = Cursor.JumpToBit(Offset))
178+
return Err;
179+
return llvm::Error::success();
153180
}
154-
Cursor.ReadAbbrevRecord();
181+
if (llvm::Error Err = Cursor.ReadAbbrevRecord())
182+
return Err;
155183
}
156184
}
157185
};

clang/lib/Index/IndexRecordReader.cpp

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,22 @@ struct IndexRecordReader::Implementation {
9191
void readDecl(unsigned Index, IndexRecordDecl &RecD) {
9292
RecordData Record;
9393
StringRef Blob;
94-
DeclCursor.JumpToBit(DeclOffsets[Index]);
95-
unsigned Code = DeclCursor.ReadCode();
96-
unsigned RecID = DeclCursor.readRecord(Code, Record, &Blob);
94+
if (llvm::Error Err = DeclCursor.JumpToBit(DeclOffsets[Index])) {
95+
// FIXME this drops the error on the floor.
96+
consumeError(std::move(Err));
97+
}
98+
Expected<unsigned> MaybeCode = DeclCursor.ReadCode();
99+
if (!MaybeCode) {
100+
// FIXME this drops the error on the floor.
101+
consumeError(MaybeCode.takeError());
102+
}
103+
unsigned Code = MaybeCode.get();
104+
Expected<unsigned> MaybeRecID = DeclCursor.readRecord(Code, Record, &Blob);
105+
if (!MaybeRecID) {
106+
// FIXME this drops the error on the floor.
107+
consumeError(MaybeRecID.takeError());
108+
}
109+
unsigned RecID = MaybeRecID.get();
97110
assert(RecID == REC_DECLINFO);
98111
(void)RecID;
99112

@@ -273,7 +286,10 @@ class IndexBitstreamVisitor : public BitstreamVisitor<IndexBitstreamVisitor> {
273286
*Error = "malformed block record";
274287
return StreamVisit::Abort;
275288
}
276-
readBlockAbbrevs(Reader.DeclCursor);
289+
if (llvm::Error Err = readBlockAbbrevs(Reader.DeclCursor)) {
290+
*Error = toString(std::move(Err));
291+
return StreamVisit::Abort;
292+
}
277293
return StreamVisit::Skip;
278294

279295
case REC_DECLOCCURRENCES_BLOCK_ID:
@@ -282,7 +298,10 @@ class IndexBitstreamVisitor : public BitstreamVisitor<IndexBitstreamVisitor> {
282298
*Error = "malformed block record";
283299
return StreamVisit::Abort;
284300
}
285-
readBlockAbbrevs(Reader.OccurCursor);
301+
if (llvm::Error Err = readBlockAbbrevs(Reader.OccurCursor)) {
302+
*Error = toString(std::move(Err));
303+
return StreamVisit::Abort;
304+
}
286305
return StreamVisit::Skip;
287306
}
288307

@@ -358,10 +377,14 @@ IndexRecordReader::createWithBuffer(std::unique_ptr<llvm::MemoryBuffer> Buffer,
358377
}
359378

360379
// Sniff for the signature.
361-
if (Stream.Read(8) != 'I' ||
362-
Stream.Read(8) != 'D' ||
363-
Stream.Read(8) != 'X' ||
364-
Stream.Read(8) != 'R') {
380+
for (unsigned char C : {'I', 'D', 'X', 'R'}) {
381+
if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
382+
if (Res.get() == C)
383+
continue;
384+
} else {
385+
Error = toString(Res.takeError());
386+
return nullptr;
387+
}
365388
Error = "not a serialized index record file";
366389
return nullptr;
367390
}

clang/lib/Index/IndexUnitReader.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,21 @@ class IndexUnitBitstreamVisitor : public BitstreamVisitor<IndexUnitBitstreamVisi
123123
*Error = "malformed unit dependencies block record";
124124
return StreamVisit::Abort;
125125
}
126-
readBlockAbbrevs(Reader.DependCursor);
126+
if (llvm::Error Err = readBlockAbbrevs(Reader.DependCursor)) {
127+
*Error = toString(std::move(Err));
128+
return StreamVisit::Abort;
129+
}
127130
return StreamVisit::Skip;
128131
case UNIT_INCLUDES_BLOCK_ID:
129132
Reader.IncludeCursor = Stream;
130133
if (Reader.IncludeCursor.EnterSubBlock(ID)) {
131134
*Error = "malformed unit includes block record";
132135
return StreamVisit::Abort;
133136
}
134-
readBlockAbbrevs(Reader.IncludeCursor);
137+
if (llvm::Error Err = readBlockAbbrevs(Reader.IncludeCursor)) {
138+
*Error = toString(std::move(Err));
139+
return StreamVisit::Abort;
140+
}
135141
return StreamVisit::Skip;
136142
}
137143

@@ -276,10 +282,14 @@ bool IndexUnitReaderImpl::init(std::unique_ptr<MemoryBuffer> Buf,
276282
}
277283

278284
// Sniff for the signature.
279-
if (Stream.Read(8) != 'I' ||
280-
Stream.Read(8) != 'D' ||
281-
Stream.Read(8) != 'X' ||
282-
Stream.Read(8) != 'U') {
285+
for (unsigned char C : {'I', 'D', 'X', 'U'}) {
286+
if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) {
287+
if (Res.get() == C)
288+
continue;
289+
} else {
290+
Error = toString(Res.takeError());
291+
return true;
292+
}
283293
Error = "not a serialized index unit file";
284294
return true;
285295
}

0 commit comments

Comments
 (0)