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>;
21 llvm::StringRef Blob) {
22 Field.assign(Blob.begin(), Blob.end());
23 return llvm::Error::success();
27 llvm::StringRef Blob) {
29 return llvm::createStringError(llvm::inconvertibleErrorCode(),
30 "incorrect USR size");
34 for (
int I = 0,
E = R[0]; I <
E; ++I)
36 return llvm::Error::success();
41 return llvm::Error::success();
46 return llvm::createStringError(llvm::inconvertibleErrorCode(),
47 "integer too large to parse");
49 return llvm::Error::success();
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");
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");
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();
93 llvm::StringRef Blob) {
94 switch (
auto IT =
static_cast<InfoType>(R[0])) {
101 return llvm::Error::success();
103 return llvm::createStringError(llvm::inconvertibleErrorCode(),
104 "invalid value for InfoType");
108 llvm::StringRef Blob) {
109 switch (
auto F =
static_cast<FieldId>(R[0])) {
118 return llvm::Error::success();
120 return llvm::createStringError(llvm::inconvertibleErrorCode(),
121 "invalid value for FieldId");
126 llvm::StringRef Blob) {
127 Field.push_back(Blob);
128 return llvm::Error::success();
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();
142 const unsigned VersionNo) {
144 return llvm::Error::success();
145 return llvm::createStringError(llvm::inconvertibleErrorCode(),
146 "mismatched bitcode version number");
159 return llvm::createStringError(llvm::inconvertibleErrorCode(),
160 "invalid field for NamespaceInfo");
182 return llvm::createStringError(llvm::inconvertibleErrorCode(),
183 "invalid field for RecordInfo");
205 return llvm::createStringError(llvm::inconvertibleErrorCode(),
206 "invalid field for BaseRecordInfo");
226 return llvm::createStringError(llvm::inconvertibleErrorCode(),
227 "invalid field for EnumInfo");
247 return llvm::createStringError(llvm::inconvertibleErrorCode(),
248 "invalid field for FunctionInfo");
254 return llvm::Error::success();
263 return llvm::createStringError(llvm::inconvertibleErrorCode(),
264 "invalid field for TypeInfo");
276 return llvm::createStringError(llvm::inconvertibleErrorCode(),
277 "invalid field for MemberTypeInfo");
307 return llvm::createStringError(llvm::inconvertibleErrorCode(),
308 "invalid field for CommentInfo");
328 return llvm::createStringError(llvm::inconvertibleErrorCode(),
329 "invalid field for Reference");
334 return llvm::createStringError(llvm::inconvertibleErrorCode(),
335 "invalid type cannot contain CommentInfo");
359 I->
Children.emplace_back(std::make_unique<CommentInfo>());
368 template <
typename T,
typename TTypeInfo>
370 return llvm::createStringError(llvm::inconvertibleErrorCode(),
371 "invalid type cannot contain TypeInfo");
375 I->
Members.emplace_back(std::move(T));
376 return llvm::Error::success();
380 I->
Members.emplace_back(std::move(T));
381 return llvm::Error::success();
386 return llvm::Error::success();
390 I->
Params.emplace_back(std::move(T));
391 return llvm::Error::success();
395 return llvm::createStringError(llvm::inconvertibleErrorCode(),
396 "invalid type cannot contain Reference");
402 I->
Type = std::move(R);
403 return llvm::Error::success();
405 return llvm::createStringError(llvm::inconvertibleErrorCode(),
406 "invalid type cannot contain Reference");
414 I->
Type = std::move(R);
415 return llvm::Error::success();
417 return llvm::createStringError(llvm::inconvertibleErrorCode(),
418 "invalid type cannot contain Reference");
426 I->
Type = std::move(R);
427 return llvm::Error::success();
429 return llvm::createStringError(llvm::inconvertibleErrorCode(),
430 "invalid type cannot contain Reference");
438 return llvm::Error::success();
440 return llvm::createStringError(llvm::inconvertibleErrorCode(),
441 "invalid type cannot contain Reference");
450 return llvm::Error::success();
453 return llvm::Error::success();
456 return llvm::Error::success();
458 return llvm::createStringError(llvm::inconvertibleErrorCode(),
459 "invalid type cannot contain Reference");
468 return llvm::Error::success();
471 return llvm::Error::success();
473 return llvm::createStringError(llvm::inconvertibleErrorCode(),
474 "invalid type cannot contain Reference");
482 return llvm::Error::success();
484 I->
Parents.emplace_back(std::move(R));
485 return llvm::Error::success();
488 return llvm::Error::success();
491 return llvm::Error::success();
493 return llvm::createStringError(llvm::inconvertibleErrorCode(),
494 "invalid type cannot contain Reference");
498 template <
typename T,
typename ChildInfoType>
500 llvm::errs() <<
"invalid child type for info";
521 I->
Bases.emplace_back(std::move(R));
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();
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);
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) {
588 return Comment.takeError();
589 if (
auto Err = readBlock(
ID, Comment.get()))
591 return llvm::Error::success();
595 if (
auto Err = readBlock(
ID, &TI))
599 return llvm::Error::success();
603 if (
auto Err = readBlock(
ID, &TI))
607 return llvm::Error::success();
611 if (
auto Err = readBlock(
ID, &TI))
615 return llvm::Error::success();
619 if (
auto Err = readBlock(
ID, &R))
621 if (
auto Err =
addReference(I, std::move(R), CurrentReferenceField))
623 return llvm::Error::success();
627 if (
auto Err = readBlock(
ID, &F))
630 return llvm::Error::success();
634 if (
auto Err = readBlock(
ID, &BR))
637 return llvm::Error::success();
641 if (
auto Err = readBlock(
ID, &
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();
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();
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()) {
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");
703 for (
int Idx = 0; Idx != 4; ++Idx) {
704 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
706 return MaybeRead.takeError();
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) {
741 return createInfo<NamespaceInfo>(
ID);
743 return createInfo<RecordInfo>(
ID);
745 return createInfo<EnumInfo>(
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>>>
757 std::vector<std::unique_ptr<Info>> Infos;
758 if (
auto Err = validateStream())
759 return std::move(Err);
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();
780 return llvm::createStringError(llvm::inconvertibleErrorCode(),
781 "invalid top level block");
786 auto InfoOrErr = readBlockToInfo(
ID);
788 return InfoOrErr.takeError();
789 Infos.emplace_back(std::move(InfoOrErr.get()));
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()) {
803 consumeError(std::move(Err));
808 return std::move(Infos);