1 //===-- BitcodeReader.cpp - ClangDoc Bitcode Reader ------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "BitcodeReader.h"
10 #include "llvm/ADT/IndexedMap.h"
11 #include "llvm/ADT/Optional.h"
12 #include "llvm/Support/Error.h"
13 #include "llvm/Support/raw_ostream.h"
18 using Record
= llvm::SmallVector
<uint64_t, 1024>;
20 llvm::Error
decodeRecord(const Record
&R
, llvm::SmallVectorImpl
<char> &Field
,
21 llvm::StringRef Blob
) {
22 Field
.assign(Blob
.begin(), Blob
.end());
23 return llvm::Error::success();
26 llvm::Error
decodeRecord(const Record
&R
, SymbolID
&Field
,
27 llvm::StringRef Blob
) {
28 if (R
[0] != BitCodeConstants::USRHashSize
)
29 return llvm::createStringError(llvm::inconvertibleErrorCode(),
30 "incorrect USR size");
32 // First position in the record is the length of the following array, so we
33 // copy the following elements to the field.
34 for (int I
= 0, E
= R
[0]; I
< E
; ++I
)
36 return llvm::Error::success();
39 llvm::Error
decodeRecord(const Record
&R
, bool &Field
, llvm::StringRef Blob
) {
41 return llvm::Error::success();
44 llvm::Error
decodeRecord(const Record
&R
, int &Field
, llvm::StringRef Blob
) {
46 return llvm::createStringError(llvm::inconvertibleErrorCode(),
47 "integer too large to parse");
49 return llvm::Error::success();
52 llvm::Error
decodeRecord(const Record
&R
, AccessSpecifier
&Field
,
53 llvm::StringRef Blob
) {
59 Field
= (AccessSpecifier
)R
[0];
60 return llvm::Error::success();
62 return llvm::createStringError(llvm::inconvertibleErrorCode(),
63 "invalid value for AccessSpecifier");
67 llvm::Error
decodeRecord(const Record
&R
, TagTypeKind
&Field
,
68 llvm::StringRef Blob
) {
75 Field
= (TagTypeKind
)R
[0];
76 return llvm::Error::success();
78 return llvm::createStringError(llvm::inconvertibleErrorCode(),
79 "invalid value for TagTypeKind");
83 llvm::Error
decodeRecord(const Record
&R
, llvm::Optional
<Location
> &Field
,
84 llvm::StringRef Blob
) {
86 return llvm::createStringError(llvm::inconvertibleErrorCode(),
87 "integer too large to parse");
88 Field
.emplace((int)R
[0], Blob
, (bool)R
[1]);
89 return llvm::Error::success();
92 llvm::Error
decodeRecord(const Record
&R
, InfoType
&Field
,
93 llvm::StringRef Blob
) {
94 switch (auto IT
= static_cast<InfoType
>(R
[0])) {
95 case InfoType::IT_namespace
:
96 case InfoType::IT_record
:
97 case InfoType::IT_function
:
98 case InfoType::IT_default
:
99 case InfoType::IT_enum
:
101 return llvm::Error::success();
103 return llvm::createStringError(llvm::inconvertibleErrorCode(),
104 "invalid value for InfoType");
107 llvm::Error
decodeRecord(const Record
&R
, FieldId
&Field
,
108 llvm::StringRef Blob
) {
109 switch (auto F
= static_cast<FieldId
>(R
[0])) {
110 case FieldId::F_namespace
:
111 case FieldId::F_parent
:
112 case FieldId::F_vparent
:
113 case FieldId::F_type
:
114 case FieldId::F_child_namespace
:
115 case FieldId::F_child_record
:
116 case FieldId::F_default
:
118 return llvm::Error::success();
120 return llvm::createStringError(llvm::inconvertibleErrorCode(),
121 "invalid value for FieldId");
124 llvm::Error
decodeRecord(const Record
&R
,
125 llvm::SmallVectorImpl
<llvm::SmallString
<16>> &Field
,
126 llvm::StringRef Blob
) {
127 Field
.push_back(Blob
);
128 return llvm::Error::success();
131 llvm::Error
decodeRecord(const Record
&R
,
132 llvm::SmallVectorImpl
<Location
> &Field
,
133 llvm::StringRef Blob
) {
135 return llvm::createStringError(llvm::inconvertibleErrorCode(),
136 "integer too large to parse");
137 Field
.emplace_back((int)R
[0], Blob
, (bool)R
[1]);
138 return llvm::Error::success();
141 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
142 const unsigned VersionNo
) {
143 if (ID
== VERSION
&& R
[0] == VersionNo
)
144 return llvm::Error::success();
145 return llvm::createStringError(llvm::inconvertibleErrorCode(),
146 "mismatched bitcode version number");
149 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
153 return decodeRecord(R
, I
->USR
, Blob
);
155 return decodeRecord(R
, I
->Name
, Blob
);
157 return decodeRecord(R
, I
->Path
, Blob
);
159 return llvm::createStringError(llvm::inconvertibleErrorCode(),
160 "invalid field for NamespaceInfo");
164 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
168 return decodeRecord(R
, I
->USR
, Blob
);
170 return decodeRecord(R
, I
->Name
, Blob
);
172 return decodeRecord(R
, I
->Path
, Blob
);
173 case RECORD_DEFLOCATION
:
174 return decodeRecord(R
, I
->DefLoc
, Blob
);
175 case RECORD_LOCATION
:
176 return decodeRecord(R
, I
->Loc
, Blob
);
177 case RECORD_TAG_TYPE
:
178 return decodeRecord(R
, I
->TagType
, Blob
);
179 case RECORD_IS_TYPE_DEF
:
180 return decodeRecord(R
, I
->IsTypeDef
, Blob
);
182 return llvm::createStringError(llvm::inconvertibleErrorCode(),
183 "invalid field for RecordInfo");
187 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
190 case BASE_RECORD_USR
:
191 return decodeRecord(R
, I
->USR
, Blob
);
192 case BASE_RECORD_NAME
:
193 return decodeRecord(R
, I
->Name
, Blob
);
194 case BASE_RECORD_PATH
:
195 return decodeRecord(R
, I
->Path
, Blob
);
196 case BASE_RECORD_TAG_TYPE
:
197 return decodeRecord(R
, I
->TagType
, Blob
);
198 case BASE_RECORD_IS_VIRTUAL
:
199 return decodeRecord(R
, I
->IsVirtual
, Blob
);
200 case BASE_RECORD_ACCESS
:
201 return decodeRecord(R
, I
->Access
, Blob
);
202 case BASE_RECORD_IS_PARENT
:
203 return decodeRecord(R
, I
->IsParent
, Blob
);
205 return llvm::createStringError(llvm::inconvertibleErrorCode(),
206 "invalid field for BaseRecordInfo");
210 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
214 return decodeRecord(R
, I
->USR
, Blob
);
216 return decodeRecord(R
, I
->Name
, Blob
);
217 case ENUM_DEFLOCATION
:
218 return decodeRecord(R
, I
->DefLoc
, Blob
);
220 return decodeRecord(R
, I
->Loc
, Blob
);
222 return decodeRecord(R
, I
->Members
, Blob
);
224 return decodeRecord(R
, I
->Scoped
, Blob
);
226 return llvm::createStringError(llvm::inconvertibleErrorCode(),
227 "invalid field for EnumInfo");
231 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
235 return decodeRecord(R
, I
->USR
, Blob
);
237 return decodeRecord(R
, I
->Name
, Blob
);
238 case FUNCTION_DEFLOCATION
:
239 return decodeRecord(R
, I
->DefLoc
, Blob
);
240 case FUNCTION_LOCATION
:
241 return decodeRecord(R
, I
->Loc
, Blob
);
242 case FUNCTION_ACCESS
:
243 return decodeRecord(R
, I
->Access
, Blob
);
244 case FUNCTION_IS_METHOD
:
245 return decodeRecord(R
, I
->IsMethod
, Blob
);
247 return llvm::createStringError(llvm::inconvertibleErrorCode(),
248 "invalid field for FunctionInfo");
252 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
254 return llvm::Error::success();
257 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
260 case FIELD_TYPE_NAME
:
261 return decodeRecord(R
, I
->Name
, Blob
);
263 return llvm::createStringError(llvm::inconvertibleErrorCode(),
264 "invalid field for TypeInfo");
268 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
271 case MEMBER_TYPE_NAME
:
272 return decodeRecord(R
, I
->Name
, Blob
);
273 case MEMBER_TYPE_ACCESS
:
274 return decodeRecord(R
, I
->Access
, Blob
);
276 return llvm::createStringError(llvm::inconvertibleErrorCode(),
277 "invalid field for MemberTypeInfo");
281 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
285 return decodeRecord(R
, I
->Kind
, Blob
);
287 return decodeRecord(R
, I
->Text
, Blob
);
289 return decodeRecord(R
, I
->Name
, Blob
);
290 case COMMENT_DIRECTION
:
291 return decodeRecord(R
, I
->Direction
, Blob
);
292 case COMMENT_PARAMNAME
:
293 return decodeRecord(R
, I
->ParamName
, Blob
);
294 case COMMENT_CLOSENAME
:
295 return decodeRecord(R
, I
->CloseName
, Blob
);
296 case COMMENT_ATTRKEY
:
297 return decodeRecord(R
, I
->AttrKeys
, Blob
);
298 case COMMENT_ATTRVAL
:
299 return decodeRecord(R
, I
->AttrValues
, Blob
);
301 return decodeRecord(R
, I
->Args
, Blob
);
302 case COMMENT_SELFCLOSING
:
303 return decodeRecord(R
, I
->SelfClosing
, Blob
);
304 case COMMENT_EXPLICIT
:
305 return decodeRecord(R
, I
->Explicit
, Blob
);
307 return llvm::createStringError(llvm::inconvertibleErrorCode(),
308 "invalid field for CommentInfo");
312 llvm::Error
parseRecord(const Record
&R
, unsigned ID
, llvm::StringRef Blob
,
313 Reference
*I
, FieldId
&F
) {
316 return decodeRecord(R
, I
->USR
, Blob
);
318 return decodeRecord(R
, I
->Name
, Blob
);
320 return decodeRecord(R
, I
->RefType
, Blob
);
322 return decodeRecord(R
, I
->Path
, Blob
);
323 case REFERENCE_IS_IN_GLOBAL_NAMESPACE
:
324 return decodeRecord(R
, I
->IsInGlobalNamespace
, Blob
);
325 case REFERENCE_FIELD
:
326 return decodeRecord(R
, F
, Blob
);
328 return llvm::createStringError(llvm::inconvertibleErrorCode(),
329 "invalid field for Reference");
333 template <typename T
> llvm::Expected
<CommentInfo
*> getCommentInfo(T I
) {
334 return llvm::createStringError(llvm::inconvertibleErrorCode(),
335 "invalid type cannot contain CommentInfo");
338 template <> llvm::Expected
<CommentInfo
*> getCommentInfo(FunctionInfo
*I
) {
339 I
->Description
.emplace_back();
340 return &I
->Description
.back();
343 template <> llvm::Expected
<CommentInfo
*> getCommentInfo(NamespaceInfo
*I
) {
344 I
->Description
.emplace_back();
345 return &I
->Description
.back();
348 template <> llvm::Expected
<CommentInfo
*> getCommentInfo(RecordInfo
*I
) {
349 I
->Description
.emplace_back();
350 return &I
->Description
.back();
353 template <> llvm::Expected
<CommentInfo
*> getCommentInfo(EnumInfo
*I
) {
354 I
->Description
.emplace_back();
355 return &I
->Description
.back();
358 template <> llvm::Expected
<CommentInfo
*> getCommentInfo(CommentInfo
*I
) {
359 I
->Children
.emplace_back(std::make_unique
<CommentInfo
>());
360 return I
->Children
.back().get();
364 llvm::Expected
<CommentInfo
*> getCommentInfo(std::unique_ptr
<CommentInfo
> &I
) {
365 return getCommentInfo(I
.get());
368 template <typename T
, typename TTypeInfo
>
369 llvm::Error
addTypeInfo(T I
, TTypeInfo
&&TI
) {
370 return llvm::createStringError(llvm::inconvertibleErrorCode(),
371 "invalid type cannot contain TypeInfo");
374 template <> llvm::Error
addTypeInfo(RecordInfo
*I
, MemberTypeInfo
&&T
) {
375 I
->Members
.emplace_back(std::move(T
));
376 return llvm::Error::success();
379 template <> llvm::Error
addTypeInfo(BaseRecordInfo
*I
, MemberTypeInfo
&&T
) {
380 I
->Members
.emplace_back(std::move(T
));
381 return llvm::Error::success();
384 template <> llvm::Error
addTypeInfo(FunctionInfo
*I
, TypeInfo
&&T
) {
385 I
->ReturnType
= std::move(T
);
386 return llvm::Error::success();
389 template <> llvm::Error
addTypeInfo(FunctionInfo
*I
, FieldTypeInfo
&&T
) {
390 I
->Params
.emplace_back(std::move(T
));
391 return llvm::Error::success();
394 template <typename T
> llvm::Error
addReference(T I
, Reference
&&R
, FieldId F
) {
395 return llvm::createStringError(llvm::inconvertibleErrorCode(),
396 "invalid type cannot contain Reference");
399 template <> llvm::Error
addReference(TypeInfo
*I
, Reference
&&R
, FieldId F
) {
401 case FieldId::F_type
:
402 I
->Type
= std::move(R
);
403 return llvm::Error::success();
405 return llvm::createStringError(llvm::inconvertibleErrorCode(),
406 "invalid type cannot contain Reference");
411 llvm::Error
addReference(FieldTypeInfo
*I
, Reference
&&R
, FieldId F
) {
413 case FieldId::F_type
:
414 I
->Type
= std::move(R
);
415 return llvm::Error::success();
417 return llvm::createStringError(llvm::inconvertibleErrorCode(),
418 "invalid type cannot contain Reference");
423 llvm::Error
addReference(MemberTypeInfo
*I
, Reference
&&R
, FieldId F
) {
425 case FieldId::F_type
:
426 I
->Type
= std::move(R
);
427 return llvm::Error::success();
429 return llvm::createStringError(llvm::inconvertibleErrorCode(),
430 "invalid type cannot contain Reference");
434 template <> llvm::Error
addReference(EnumInfo
*I
, Reference
&&R
, FieldId F
) {
436 case FieldId::F_namespace
:
437 I
->Namespace
.emplace_back(std::move(R
));
438 return llvm::Error::success();
440 return llvm::createStringError(llvm::inconvertibleErrorCode(),
441 "invalid type cannot contain Reference");
446 llvm::Error
addReference(NamespaceInfo
*I
, Reference
&&R
, FieldId F
) {
448 case FieldId::F_namespace
:
449 I
->Namespace
.emplace_back(std::move(R
));
450 return llvm::Error::success();
451 case FieldId::F_child_namespace
:
452 I
->ChildNamespaces
.emplace_back(std::move(R
));
453 return llvm::Error::success();
454 case FieldId::F_child_record
:
455 I
->ChildRecords
.emplace_back(std::move(R
));
456 return llvm::Error::success();
458 return llvm::createStringError(llvm::inconvertibleErrorCode(),
459 "invalid type cannot contain Reference");
464 llvm::Error
addReference(FunctionInfo
*I
, Reference
&&R
, FieldId F
) {
466 case FieldId::F_namespace
:
467 I
->Namespace
.emplace_back(std::move(R
));
468 return llvm::Error::success();
469 case FieldId::F_parent
:
470 I
->Parent
= std::move(R
);
471 return llvm::Error::success();
473 return llvm::createStringError(llvm::inconvertibleErrorCode(),
474 "invalid type cannot contain Reference");
478 template <> llvm::Error
addReference(RecordInfo
*I
, Reference
&&R
, FieldId F
) {
480 case FieldId::F_namespace
:
481 I
->Namespace
.emplace_back(std::move(R
));
482 return llvm::Error::success();
483 case FieldId::F_parent
:
484 I
->Parents
.emplace_back(std::move(R
));
485 return llvm::Error::success();
486 case FieldId::F_vparent
:
487 I
->VirtualParents
.emplace_back(std::move(R
));
488 return llvm::Error::success();
489 case FieldId::F_child_record
:
490 I
->ChildRecords
.emplace_back(std::move(R
));
491 return llvm::Error::success();
493 return llvm::createStringError(llvm::inconvertibleErrorCode(),
494 "invalid type cannot contain Reference");
498 template <typename T
, typename ChildInfoType
>
499 void addChild(T I
, ChildInfoType
&&R
) {
500 llvm::errs() << "invalid child type for info";
504 template <> void addChild(NamespaceInfo
*I
, FunctionInfo
&&R
) {
505 I
->ChildFunctions
.emplace_back(std::move(R
));
508 template <> void addChild(NamespaceInfo
*I
, EnumInfo
&&R
) {
509 I
->ChildEnums
.emplace_back(std::move(R
));
512 template <> void addChild(RecordInfo
*I
, FunctionInfo
&&R
) {
513 I
->ChildFunctions
.emplace_back(std::move(R
));
516 template <> void addChild(RecordInfo
*I
, EnumInfo
&&R
) {
517 I
->ChildEnums
.emplace_back(std::move(R
));
520 template <> void addChild(RecordInfo
*I
, BaseRecordInfo
&&R
) {
521 I
->Bases
.emplace_back(std::move(R
));
524 template <> void addChild(BaseRecordInfo
*I
, FunctionInfo
&&R
) {
525 I
->ChildFunctions
.emplace_back(std::move(R
));
528 // Read records from bitcode into a given info.
529 template <typename T
>
530 llvm::Error
ClangDocBitcodeReader::readRecord(unsigned ID
, T I
) {
532 llvm::StringRef Blob
;
533 llvm::Expected
<unsigned> MaybeRecID
= Stream
.readRecord(ID
, R
, &Blob
);
535 return MaybeRecID
.takeError();
536 return parseRecord(R
, MaybeRecID
.get(), Blob
, I
);
540 llvm::Error
ClangDocBitcodeReader::readRecord(unsigned ID
, Reference
*I
) {
542 llvm::StringRef Blob
;
543 llvm::Expected
<unsigned> MaybeRecID
= Stream
.readRecord(ID
, R
, &Blob
);
545 return MaybeRecID
.takeError();
546 return parseRecord(R
, MaybeRecID
.get(), Blob
, I
, CurrentReferenceField
);
549 // Read a block of records into a single info.
550 template <typename T
>
551 llvm::Error
ClangDocBitcodeReader::readBlock(unsigned ID
, T I
) {
552 if (llvm::Error Err
= Stream
.EnterSubBlock(ID
))
556 unsigned BlockOrCode
= 0;
557 Cursor Res
= skipUntilRecordOrBlock(BlockOrCode
);
560 case Cursor::BadBlock
:
561 return llvm::createStringError(llvm::inconvertibleErrorCode(),
563 case Cursor::BlockEnd
:
564 return llvm::Error::success();
565 case Cursor::BlockBegin
:
566 if (llvm::Error Err
= readSubBlock(BlockOrCode
, I
)) {
567 if (llvm::Error Skipped
= Stream
.SkipBlock())
568 return joinErrors(std::move(Err
), std::move(Skipped
));
575 if (auto Err
= readRecord(BlockOrCode
, I
))
580 template <typename T
>
581 llvm::Error
ClangDocBitcodeReader::readSubBlock(unsigned ID
, T I
) {
583 // Blocks can only have Comment, Reference, TypeInfo, FunctionInfo, or
584 // EnumInfo subblocks
585 case BI_COMMENT_BLOCK_ID
: {
586 auto Comment
= getCommentInfo(I
);
588 return Comment
.takeError();
589 if (auto Err
= readBlock(ID
, Comment
.get()))
591 return llvm::Error::success();
593 case BI_TYPE_BLOCK_ID
: {
595 if (auto Err
= readBlock(ID
, &TI
))
597 if (auto Err
= addTypeInfo(I
, std::move(TI
)))
599 return llvm::Error::success();
601 case BI_FIELD_TYPE_BLOCK_ID
: {
603 if (auto Err
= readBlock(ID
, &TI
))
605 if (auto Err
= addTypeInfo(I
, std::move(TI
)))
607 return llvm::Error::success();
609 case BI_MEMBER_TYPE_BLOCK_ID
: {
611 if (auto Err
= readBlock(ID
, &TI
))
613 if (auto Err
= addTypeInfo(I
, std::move(TI
)))
615 return llvm::Error::success();
617 case BI_REFERENCE_BLOCK_ID
: {
619 if (auto Err
= readBlock(ID
, &R
))
621 if (auto Err
= addReference(I
, std::move(R
), CurrentReferenceField
))
623 return llvm::Error::success();
625 case BI_FUNCTION_BLOCK_ID
: {
627 if (auto Err
= readBlock(ID
, &F
))
629 addChild(I
, std::move(F
));
630 return llvm::Error::success();
632 case BI_BASE_RECORD_BLOCK_ID
: {
634 if (auto Err
= readBlock(ID
, &BR
))
636 addChild(I
, std::move(BR
));
637 return llvm::Error::success();
639 case BI_ENUM_BLOCK_ID
: {
641 if (auto Err
= readBlock(ID
, &E
))
643 addChild(I
, std::move(E
));
644 return llvm::Error::success();
647 return llvm::createStringError(llvm::inconvertibleErrorCode(),
648 "invalid subblock type");
652 ClangDocBitcodeReader::Cursor
653 ClangDocBitcodeReader::skipUntilRecordOrBlock(unsigned &BlockOrRecordID
) {
656 while (!Stream
.AtEndOfStream()) {
657 Expected
<unsigned> MaybeCode
= Stream
.ReadCode();
659 // FIXME this drops the error on the floor.
660 consumeError(MaybeCode
.takeError());
661 return Cursor::BadBlock
;
664 unsigned Code
= MaybeCode
.get();
665 if (Code
>= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV
)) {
666 BlockOrRecordID
= Code
;
667 return Cursor::Record
;
669 switch (static_cast<llvm::bitc::FixedAbbrevIDs
>(Code
)) {
670 case llvm::bitc::ENTER_SUBBLOCK
:
671 if (Expected
<unsigned> MaybeID
= Stream
.ReadSubBlockID())
672 BlockOrRecordID
= MaybeID
.get();
674 // FIXME this drops the error on the floor.
675 consumeError(MaybeID
.takeError());
677 return Cursor::BlockBegin
;
678 case llvm::bitc::END_BLOCK
:
679 if (Stream
.ReadBlockEnd())
680 return Cursor::BadBlock
;
681 return Cursor::BlockEnd
;
682 case llvm::bitc::DEFINE_ABBREV
:
683 if (llvm::Error Err
= Stream
.ReadAbbrevRecord()) {
684 // FIXME this drops the error on the floor.
685 consumeError(std::move(Err
));
688 case llvm::bitc::UNABBREV_RECORD
:
689 return Cursor::BadBlock
;
690 case llvm::bitc::FIRST_APPLICATION_ABBREV
:
691 llvm_unreachable("Unexpected abbrev id.");
694 llvm_unreachable("Premature stream end.");
697 llvm::Error
ClangDocBitcodeReader::validateStream() {
698 if (Stream
.AtEndOfStream())
699 return llvm::createStringError(llvm::inconvertibleErrorCode(),
700 "premature end of stream");
702 // Sniff for the signature.
703 for (int Idx
= 0; Idx
!= 4; ++Idx
) {
704 Expected
<llvm::SimpleBitstreamCursor::word_t
> MaybeRead
= Stream
.Read(8);
706 return MaybeRead
.takeError();
707 else if (MaybeRead
.get() != BitCodeConstants::Signature
[Idx
])
708 return llvm::createStringError(llvm::inconvertibleErrorCode(),
709 "invalid bitcode signature");
711 return llvm::Error::success();
714 llvm::Error
ClangDocBitcodeReader::readBlockInfoBlock() {
715 Expected
<Optional
<llvm::BitstreamBlockInfo
>> MaybeBlockInfo
=
716 Stream
.ReadBlockInfoBlock();
718 return MaybeBlockInfo
.takeError();
720 BlockInfo
= MaybeBlockInfo
.get();
722 return llvm::createStringError(llvm::inconvertibleErrorCode(),
723 "unable to parse BlockInfoBlock");
724 Stream
.setBlockInfo(&*BlockInfo
);
725 return llvm::Error::success();
728 template <typename T
>
729 llvm::Expected
<std::unique_ptr
<Info
>>
730 ClangDocBitcodeReader::createInfo(unsigned ID
) {
731 std::unique_ptr
<Info
> I
= std::make_unique
<T
>();
732 if (auto Err
= readBlock(ID
, static_cast<T
*>(I
.get())))
733 return std::move(Err
);
734 return std::unique_ptr
<Info
>{std::move(I
)};
737 llvm::Expected
<std::unique_ptr
<Info
>>
738 ClangDocBitcodeReader::readBlockToInfo(unsigned ID
) {
740 case BI_NAMESPACE_BLOCK_ID
:
741 return createInfo
<NamespaceInfo
>(ID
);
742 case BI_RECORD_BLOCK_ID
:
743 return createInfo
<RecordInfo
>(ID
);
744 case BI_ENUM_BLOCK_ID
:
745 return createInfo
<EnumInfo
>(ID
);
746 case BI_FUNCTION_BLOCK_ID
:
747 return createInfo
<FunctionInfo
>(ID
);
749 return llvm::createStringError(llvm::inconvertibleErrorCode(),
750 "cannot create info");
755 llvm::Expected
<std::vector
<std::unique_ptr
<Info
>>>
756 ClangDocBitcodeReader::readBitcode() {
757 std::vector
<std::unique_ptr
<Info
>> Infos
;
758 if (auto Err
= validateStream())
759 return std::move(Err
);
761 // Read the top level blocks.
762 while (!Stream
.AtEndOfStream()) {
763 Expected
<unsigned> MaybeCode
= Stream
.ReadCode();
765 return MaybeCode
.takeError();
766 if (MaybeCode
.get() != llvm::bitc::ENTER_SUBBLOCK
)
767 return llvm::createStringError(llvm::inconvertibleErrorCode(),
768 "no blocks in input");
769 Expected
<unsigned> MaybeID
= Stream
.ReadSubBlockID();
771 return MaybeID
.takeError();
772 unsigned ID
= MaybeID
.get();
774 // NamedType and Comment blocks should not appear at the top level
775 case BI_TYPE_BLOCK_ID
:
776 case BI_FIELD_TYPE_BLOCK_ID
:
777 case BI_MEMBER_TYPE_BLOCK_ID
:
778 case BI_COMMENT_BLOCK_ID
:
779 case BI_REFERENCE_BLOCK_ID
:
780 return llvm::createStringError(llvm::inconvertibleErrorCode(),
781 "invalid top level block");
782 case BI_NAMESPACE_BLOCK_ID
:
783 case BI_RECORD_BLOCK_ID
:
784 case BI_ENUM_BLOCK_ID
:
785 case BI_FUNCTION_BLOCK_ID
: {
786 auto InfoOrErr
= readBlockToInfo(ID
);
788 return InfoOrErr
.takeError();
789 Infos
.emplace_back(std::move(InfoOrErr
.get()));
792 case BI_VERSION_BLOCK_ID
:
793 if (auto Err
= readBlock(ID
, VersionNumber
))
794 return std::move(Err
);
796 case llvm::bitc::BLOCKINFO_BLOCK_ID
:
797 if (auto Err
= readBlockInfoBlock())
798 return std::move(Err
);
801 if (llvm::Error Err
= Stream
.SkipBlock()) {
802 // FIXME this drops the error on the floor.
803 consumeError(std::move(Err
));
808 return std::move(Infos
);