@@ -187,112 +187,49 @@ BitcodeReader::
187
187
readBlock (
188
188
AnyBlock& B, unsigned ID)
189
189
{
190
- blockStack_.push_back (&B);
191
190
if (auto err = Stream.EnterSubBlock (ID))
192
191
return toError (std::move (err));
193
-
192
+ blockStack_.push_back (&B);
193
+ Record RecordData;
194
194
for (;;)
195
195
{
196
- unsigned BlockOrCode = 0 ;
197
- Cursor Res = skipUntilRecordOrBlock (BlockOrCode);
198
-
199
- switch (Res)
200
- {
201
- case Cursor::BadBlock:
202
- return formatError (" bad block found" );
203
- case Cursor::BlockEnd:
204
- blockStack_.pop_back ();
205
- return Error::success ();
206
- case Cursor::BlockBegin:
207
- if (auto err = blockStack_.back ()->readSubBlock (BlockOrCode))
208
- {
209
- if (llvm::Error Skipped = Stream.SkipBlock ())
210
- {
211
- return toError (std::move (Skipped));
212
- }
196
+ llvm::Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance ();
197
+ if (! MaybeEntry)
198
+ return toError (MaybeEntry.takeError ());
199
+ switch (llvm::BitstreamEntry Entry = MaybeEntry.get (); Entry.Kind )
200
+ {
201
+ case llvm::BitstreamEntry::Record:
202
+ {
203
+ llvm::StringRef Blob;
204
+ llvm::Expected<unsigned > MaybeRecordID =
205
+ Stream.readRecord (Entry.ID , RecordData, &Blob);
206
+ if (! MaybeRecordID)
207
+ return toError (MaybeRecordID.takeError ());
208
+ if (auto err = blockStack_.back ()->parseRecord (
209
+ RecordData, MaybeRecordID.get (), Blob))
213
210
return err;
214
- }
211
+ RecordData. clear ();
215
212
continue ;
216
- case Cursor::Record:
217
- break ;
218
- }
219
- if (auto err = readRecord (BlockOrCode))
220
- return err;
221
- }
222
- }
223
-
224
- // ------------------------------------------------
225
-
226
- // Read records from bitcode into AnyBlock
227
- Error
228
- BitcodeReader::
229
- readRecord (unsigned ID)
230
- {
231
- Record R;
232
- llvm::StringRef Blob;
233
- llvm::Expected<unsigned > MaybeRecID =
234
- Stream.readRecord (ID, R, &Blob);
235
- if (!MaybeRecID)
236
- return toError (MaybeRecID.takeError ());
237
- return blockStack_.back ()->parseRecord (R, MaybeRecID.get (), Blob);
238
- }
239
-
240
- // ------------------------------------------------
241
-
242
- auto
243
- BitcodeReader::
244
- skipUntilRecordOrBlock (
245
- unsigned & BlockOrRecordID) ->
246
- Cursor
247
- {
248
- BlockOrRecordID = 0 ;
249
-
250
- while (!Stream.AtEndOfStream ())
251
- {
252
- llvm::Expected<unsigned > MaybeCode = Stream.ReadCode ();
253
- if (!MaybeCode)
254
- {
255
- // FIXME this drops the error on the floor.
256
- consumeError (MaybeCode.takeError ());
257
- return Cursor::BadBlock;
258
- }
259
-
260
- unsigned Code = MaybeCode.get ();
261
- if (Code >= static_cast <unsigned >(llvm::bitc::FIRST_APPLICATION_ABBREV))
262
- {
263
- BlockOrRecordID = Code;
264
- return Cursor::Record;
265
213
}
266
- switch ( static_cast < llvm::bitc::FixedAbbrevIDs>(Code))
214
+ case llvm::BitstreamEntry::SubBlock:
267
215
{
268
- case llvm::bitc::ENTER_SUBBLOCK:
269
- if (llvm::Expected<unsigned > MaybeID = Stream.ReadSubBlockID ())
270
- BlockOrRecordID = MaybeID.get ();
271
- else {
272
- // FIXME this drops the error on the floor.
273
- consumeError (MaybeID.takeError ());
274
- }
275
- return Cursor::BlockBegin;
276
- case llvm::bitc::END_BLOCK:
277
- if (Stream.ReadBlockEnd ())
278
- return Cursor::BadBlock;
279
- return Cursor::BlockEnd;
280
- case llvm::bitc::DEFINE_ABBREV:
281
- if (llvm::Error err = Stream.ReadAbbrevRecord ())
216
+ if (auto err = blockStack_.back ()->readSubBlock (Entry.ID ))
282
217
{
283
- // FIXME this drops the error on the floor.
284
- consumeError (std::move (err));
218
+ if (auto skip_err = Stream.SkipBlock ())
219
+ return toError (std::move (skip_err));
220
+ return err;
285
221
}
286
222
continue ;
287
- case llvm::bitc::UNABBREV_RECORD:
288
- return Cursor::BadBlock;
289
- case llvm::bitc::FIRST_APPLICATION_ABBREV:
290
- // Unexpected abbrev id
223
+ }
224
+ case llvm::BitstreamEntry::EndBlock:
225
+ blockStack_.pop_back ();
226
+ return Error::success ();
227
+ case llvm::BitstreamEntry::Error:
228
+ return formatError (" bad block found" );
229
+ default :
291
230
MRDOCS_UNREACHABLE ();
292
231
}
293
232
}
294
- // Premature stream end
295
- MRDOCS_UNREACHABLE ();
296
233
}
297
234
298
235
// ------------------------------------------------
0 commit comments