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();
28 return llvm::createStringError(llvm::inconvertibleErrorCode(),
29 "incorrect USR size");
33 for (
int I = 0,
E = R[0]; I <
E; ++I)
35 return llvm::Error::success();
40 return llvm::Error::success();
45 return llvm::createStringError(llvm::inconvertibleErrorCode(),
46 "integer too large to parse");
48 return llvm::Error::success();
52 llvm::StringRef Blob) {
58 Field = (AccessSpecifier)R[0];
59 return llvm::Error::success();
61 return llvm::createStringError(llvm::inconvertibleErrorCode(),
62 "invalid value for AccessSpecifier");
73 Field = (TagTypeKind)R[0];
74 return llvm::Error::success();
76 return llvm::createStringError(llvm::inconvertibleErrorCode(),
77 "invalid value for TagTypeKind");
82 llvm::StringRef Blob) {
84 return llvm::createStringError(llvm::inconvertibleErrorCode(),
85 "integer too large to parse");
86 Field.emplace((
int)R[0], Blob, (
bool)R[1]);
87 return llvm::Error::success();
91 switch (
auto IT = static_cast<InfoType>(R[0])) {
98 return llvm::Error::success();
100 return llvm::createStringError(llvm::inconvertibleErrorCode(),
101 "invalid value for InfoType");
105 switch (
auto F = static_cast<FieldId>(R[0])) {
114 return llvm::Error::success();
116 return llvm::createStringError(llvm::inconvertibleErrorCode(),
117 "invalid value for FieldId");
121 llvm::SmallVectorImpl<llvm::SmallString<16>> &Field,
122 llvm::StringRef Blob) {
123 Field.push_back(Blob);
124 return llvm::Error::success();
128 llvm::StringRef Blob) {
130 return llvm::createStringError(llvm::inconvertibleErrorCode(),
131 "integer too large to parse");
132 Field.emplace_back((
int)R[0], Blob, (
bool)R[1]);
133 return llvm::Error::success();
137 const unsigned VersionNo) {
138 if (ID ==
VERSION && R[0] == VersionNo)
139 return llvm::Error::success();
140 return llvm::createStringError(llvm::inconvertibleErrorCode(),
141 "mismatched bitcode version number");
154 return llvm::createStringError(llvm::inconvertibleErrorCode(),
155 "invalid field for NamespaceInfo");
177 return llvm::createStringError(llvm::inconvertibleErrorCode(),
178 "invalid field for RecordInfo");
200 return llvm::createStringError(llvm::inconvertibleErrorCode(),
201 "invalid field for BaseRecordInfo");
221 return llvm::createStringError(llvm::inconvertibleErrorCode(),
222 "invalid field for EnumInfo");
242 return llvm::createStringError(llvm::inconvertibleErrorCode(),
243 "invalid field for FunctionInfo");
249 return llvm::Error::success();
258 return llvm::createStringError(llvm::inconvertibleErrorCode(),
259 "invalid field for TypeInfo");
271 return llvm::createStringError(llvm::inconvertibleErrorCode(),
272 "invalid field for MemberTypeInfo");
302 return llvm::createStringError(llvm::inconvertibleErrorCode(),
303 "invalid field for CommentInfo");
323 return llvm::createStringError(llvm::inconvertibleErrorCode(),
324 "invalid field for Reference");
329 return llvm::createStringError(llvm::inconvertibleErrorCode(),
330 "invalid type cannot contain CommentInfo");
354 I->
Children.emplace_back(std::make_unique<CommentInfo>());
363 template <
typename T,
typename TTypeInfo>
365 return llvm::createStringError(llvm::inconvertibleErrorCode(),
366 "invalid type cannot contain TypeInfo");
370 I->
Members.emplace_back(std::move(T));
371 return llvm::Error::success();
375 I->
Members.emplace_back(std::move(T));
376 return llvm::Error::success();
381 return llvm::Error::success();
385 I->
Params.emplace_back(std::move(T));
386 return llvm::Error::success();
390 return llvm::createStringError(llvm::inconvertibleErrorCode(),
391 "invalid type cannot contain Reference");
397 I->
Type = std::move(R);
398 return llvm::Error::success();
400 return llvm::createStringError(llvm::inconvertibleErrorCode(),
401 "invalid type cannot contain Reference");
409 I->
Type = std::move(R);
410 return llvm::Error::success();
412 return llvm::createStringError(llvm::inconvertibleErrorCode(),
413 "invalid type cannot contain Reference");
421 I->
Type = std::move(R);
422 return llvm::Error::success();
424 return llvm::createStringError(llvm::inconvertibleErrorCode(),
425 "invalid type cannot contain Reference");
433 return llvm::Error::success();
435 return llvm::createStringError(llvm::inconvertibleErrorCode(),
436 "invalid type cannot contain Reference");
445 return llvm::Error::success();
448 return llvm::Error::success();
451 return llvm::Error::success();
453 return llvm::createStringError(llvm::inconvertibleErrorCode(),
454 "invalid type cannot contain Reference");
463 return llvm::Error::success();
466 return llvm::Error::success();
468 return llvm::createStringError(llvm::inconvertibleErrorCode(),
469 "invalid type cannot contain Reference");
477 return llvm::Error::success();
479 I->
Parents.emplace_back(std::move(R));
480 return llvm::Error::success();
483 return llvm::Error::success();
486 return llvm::Error::success();
488 return llvm::createStringError(llvm::inconvertibleErrorCode(),
489 "invalid type cannot contain Reference");
493 template <
typename T,
typename ChildInfoType>
495 llvm::errs() <<
"invalid child type for info";
516 I->
Bases.emplace_back(std::move(R));
524 template <
typename T>
525 llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID, T I) {
527 llvm::StringRef Blob;
528 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
530 return MaybeRecID.takeError();
535 llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID, Reference *I) {
537 llvm::StringRef Blob;
538 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
540 return MaybeRecID.takeError();
541 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
545 template <
typename T>
546 llvm::Error ClangDocBitcodeReader::readBlock(
unsigned ID, T I) {
547 if (llvm::Error Err = Stream.EnterSubBlock(ID))
551 unsigned BlockOrCode = 0;
552 Cursor Res = skipUntilRecordOrBlock(BlockOrCode);
555 case Cursor::BadBlock:
556 return llvm::createStringError(llvm::inconvertibleErrorCode(),
558 case Cursor::BlockEnd:
559 return llvm::Error::success();
560 case Cursor::BlockBegin:
561 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
562 if (llvm::Error Skipped = Stream.SkipBlock())
563 return joinErrors(std::move(Err), std::move(Skipped));
570 if (
auto Err = readRecord(BlockOrCode, I))
575 template <
typename T>
576 llvm::Error ClangDocBitcodeReader::readSubBlock(
unsigned ID, T I) {
583 return Comment.takeError();
584 if (
auto Err = readBlock(ID, Comment.get()))
586 return llvm::Error::success();
590 if (
auto Err = readBlock(ID, &TI))
594 return llvm::Error::success();
598 if (
auto Err = readBlock(ID, &TI))
602 return llvm::Error::success();
606 if (
auto Err = readBlock(ID, &TI))
610 return llvm::Error::success();
614 if (
auto Err = readBlock(ID, &R))
616 if (
auto Err =
addReference(I, std::move(R), CurrentReferenceField))
618 return llvm::Error::success();
622 if (
auto Err = readBlock(ID, &F))
625 return llvm::Error::success();
629 if (
auto Err = readBlock(ID, &BR))
632 return llvm::Error::success();
636 if (
auto Err = readBlock(ID, &
E))
639 return llvm::Error::success();
642 return llvm::createStringError(llvm::inconvertibleErrorCode(),
643 "invalid subblock type");
647 ClangDocBitcodeReader::Cursor
648 ClangDocBitcodeReader::skipUntilRecordOrBlock(
unsigned &BlockOrRecordID) {
651 while (!Stream.AtEndOfStream()) {
652 Expected<unsigned> MaybeCode = Stream.ReadCode();
655 consumeError(MaybeCode.takeError());
656 return Cursor::BadBlock;
659 unsigned Code = MaybeCode.get();
660 if (
Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
661 BlockOrRecordID =
Code;
662 return Cursor::Record;
664 switch (static_cast<llvm::bitc::FixedAbbrevIDs>(
Code)) {
665 case llvm::bitc::ENTER_SUBBLOCK:
666 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
667 BlockOrRecordID = MaybeID.get();
670 consumeError(MaybeID.takeError());
672 return Cursor::BlockBegin;
673 case llvm::bitc::END_BLOCK:
674 if (Stream.ReadBlockEnd())
675 return Cursor::BadBlock;
676 return Cursor::BlockEnd;
677 case llvm::bitc::DEFINE_ABBREV:
678 if (llvm::Error Err = Stream.ReadAbbrevRecord()) {
680 consumeError(std::move(Err));
683 case llvm::bitc::UNABBREV_RECORD:
684 return Cursor::BadBlock;
685 case llvm::bitc::FIRST_APPLICATION_ABBREV:
686 llvm_unreachable(
"Unexpected abbrev id.");
689 llvm_unreachable(
"Premature stream end.");
692 llvm::Error ClangDocBitcodeReader::validateStream() {
693 if (Stream.AtEndOfStream())
694 return llvm::createStringError(llvm::inconvertibleErrorCode(),
695 "premature end of stream");
698 for (
int Idx = 0; Idx != 4; ++Idx) {
699 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
701 return MaybeRead.takeError();
703 return llvm::createStringError(llvm::inconvertibleErrorCode(),
704 "invalid bitcode signature");
706 return llvm::Error::success();
709 llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() {
710 Expected<Optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo =
711 Stream.ReadBlockInfoBlock();
713 return MaybeBlockInfo.takeError();
715 BlockInfo = MaybeBlockInfo.get();
717 return llvm::createStringError(llvm::inconvertibleErrorCode(),
718 "unable to parse BlockInfoBlock");
719 Stream.setBlockInfo(&*BlockInfo);
720 return llvm::Error::success();
723 template <
typename T>
724 llvm::Expected<std::unique_ptr<Info>>
725 ClangDocBitcodeReader::createInfo(
unsigned ID) {
726 std::unique_ptr<Info> I = std::make_unique<T>();
727 if (
auto Err = readBlock(ID, static_cast<T *>(I.get())))
728 return std::move(Err);
729 return std::unique_ptr<Info>{std::move(I)};
732 llvm::Expected<std::unique_ptr<Info>>
733 ClangDocBitcodeReader::readBlockToInfo(
unsigned ID) {
736 return createInfo<NamespaceInfo>(ID);
738 return createInfo<RecordInfo>(ID);
740 return createInfo<EnumInfo>(ID);
742 return createInfo<FunctionInfo>(ID);
744 return llvm::createStringError(llvm::inconvertibleErrorCode(),
745 "cannot create info");
750 llvm::Expected<std::vector<std::unique_ptr<Info>>>
752 std::vector<std::unique_ptr<Info>> Infos;
753 if (
auto Err = validateStream())
754 return std::move(Err);
757 while (!Stream.AtEndOfStream()) {
758 Expected<unsigned> MaybeCode = Stream.ReadCode();
760 return MaybeCode.takeError();
761 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK)
762 return llvm::createStringError(llvm::inconvertibleErrorCode(),
763 "no blocks in input");
764 Expected<unsigned> MaybeID = Stream.ReadSubBlockID();
766 return MaybeID.takeError();
767 unsigned ID = MaybeID.get();
775 return llvm::createStringError(llvm::inconvertibleErrorCode(),
776 "invalid top level block");
781 auto InfoOrErr = readBlockToInfo(ID);
783 return InfoOrErr.takeError();
784 Infos.emplace_back(std::move(InfoOrErr.get()));
789 return std::move(Err);
791 case llvm::bitc::BLOCKINFO_BLOCK_ID:
792 if (
auto Err = readBlockInfoBlock())
793 return std::move(Err);
796 if (llvm::Error Err = Stream.SkipBlock()) {
798 consumeError(std::move(Err));
803 return std::move(Infos);