19static llvm::ExitOnError
ExitOnErr(
"clang-doc error: ");
21using Record = llvm::SmallVector<uint64_t, 1024>;
26 llvm::StringRef Blob) {
27 Field.assign(Blob.begin(), Blob.end());
28 return llvm::Error::success();
32 llvm::StringRef Blob) {
34 return llvm::createStringError(llvm::inconvertibleErrorCode(),
35 "incorrect USR size");
39 for (
int I = 0, E = R[0]; I < E; ++I)
41 return llvm::Error::success();
45 llvm::StringRef Blob) {
47 return llvm::Error::success();
51 llvm::StringRef Blob) {
57 Field = (AccessSpecifier)R[0];
58 return llvm::Error::success();
60 llvm_unreachable(
"invalid value for AccessSpecifier");
64 llvm::StringRef Blob) {
65 switch (
static_cast<TagTypeKind
>(R[0])) {
66 case TagTypeKind::Struct:
67 case TagTypeKind::Interface:
68 case TagTypeKind::Union:
69 case TagTypeKind::Class:
70 case TagTypeKind::Enum:
71 Field =
static_cast<TagTypeKind
>(R[0]);
72 return llvm::Error::success();
74 return llvm::createStringError(llvm::inconvertibleErrorCode(),
75 "invalid value for TagTypeKind");
79 llvm::StringRef Blob) {
81 return llvm::createStringError(llvm::inconvertibleErrorCode(),
82 "integer too large to parse");
83 Field.emplace(
static_cast<int>(R[0]),
static_cast<int>(R[1]), Blob,
84 static_cast<bool>(R[2]));
85 return llvm::Error::success();
89 llvm::StringRef Blob) {
90 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])) {
120 return llvm::Error::success();
122 return llvm::createStringError(llvm::inconvertibleErrorCode(),
123 "invalid value for FieldId");
129 llvm::StringRef Blob) {
130 Field.push_back(Blob);
131 return llvm::Error::success();
136 llvm::StringRef Blob) {
138 return llvm::createStringError(llvm::inconvertibleErrorCode(),
139 "integer too large to parse");
140 Field.emplace_back(
static_cast<int>(R[0]),
static_cast<int>(R[1]), Blob,
141 static_cast<bool>(R[2]));
142 return llvm::Error::success();
146 llvm::StringRef Blob,
const unsigned VersionNo) {
147 if (ID ==
VERSION && R[0] == VersionNo)
148 return llvm::Error::success();
149 return llvm::createStringError(llvm::inconvertibleErrorCode(),
150 "mismatched bitcode version number");
163 return llvm::createStringError(llvm::inconvertibleErrorCode(),
164 "invalid field for NamespaceInfo");
188 return llvm::createStringError(llvm::inconvertibleErrorCode(),
189 "invalid field for RecordInfo");
211 return llvm::createStringError(llvm::inconvertibleErrorCode(),
212 "invalid field for BaseRecordInfo");
217 llvm::StringRef Blob,
EnumInfo *I) {
230 return llvm::createStringError(llvm::inconvertibleErrorCode(),
231 "invalid field for EnumInfo");
247 return llvm::createStringError(llvm::inconvertibleErrorCode(),
248 "invalid field for TypedefInfo");
262 return llvm::createStringError(llvm::inconvertibleErrorCode(),
263 "invalid field for EnumValueInfo");
285 return llvm::createStringError(llvm::inconvertibleErrorCode(),
286 "invalid field for FunctionInfo");
291 llvm::StringRef Blob,
TypeInfo *I) {
298 return llvm::createStringError(llvm::inconvertibleErrorCode(),
299 "invalid field for TypeInfo");
315 return llvm::createStringError(llvm::inconvertibleErrorCode(),
316 "invalid field for TypeInfo");
334 return llvm::createStringError(llvm::inconvertibleErrorCode(),
335 "invalid field for MemberTypeInfo");
341 llvm::SmallString<16> KindStr;
347 return llvm::Error::success();
369 return llvm::createStringError(llvm::inconvertibleErrorCode(),
370 "invalid field for CommentInfo");
392 return llvm::createStringError(llvm::inconvertibleErrorCode(),
393 "invalid field for Reference");
400 return llvm::createStringError(llvm::inconvertibleErrorCode(),
401 "invalid field for TemplateParamInfo");
405 llvm::StringRef Blob,
409 return llvm::createStringError(llvm::inconvertibleErrorCode(),
410 "invalid field for TemplateParamInfo");
417 return llvm::createStringError(llvm::inconvertibleErrorCode(),
418 "invalid field for TemplateParamInfo");
433 llvm_unreachable(
"invalid field for ConceptInfo");
440 return llvm::createStringError(llvm::inconvertibleErrorCode(),
441 "invalid field for ConstraintInfo");
445 llvm::StringRef Blob,
VarInfo *I) {
456 return llvm::createStringError(llvm::inconvertibleErrorCode(),
457 "invalid field for VarInfo");
466 return llvm::createStringError(llvm::inconvertibleErrorCode(),
467 "invalid field for Friend");
471 return llvm::createStringError(llvm::inconvertibleErrorCode(),
472 "invalid type cannot contain CommentInfo");
504 I->
Children.emplace_back(std::make_unique<CommentInfo>());
519template <
typename T,
typename TTypeInfo>
521 return llvm::createStringError(llvm::inconvertibleErrorCode(),
522 "invalid type cannot contain TypeInfo");
526 I->
Members.emplace_back(std::move(T));
527 return llvm::Error::success();
531 I->
Members.emplace_back(std::move(T));
532 return llvm::Error::success();
537 return llvm::Error::success();
541 I->
Params.emplace_back(std::move(T));
542 return llvm::Error::success();
548 I->
Params->emplace_back(std::move(T));
549 return llvm::Error::success();
554 return llvm::Error::success();
559 return llvm::Error::success();
564 return llvm::Error::success();
568 I->
Type = std::move(T);
569 return llvm::Error::success();
574 return llvm::createStringError(llvm::inconvertibleErrorCode(),
575 "invalid type cannot contain Reference");
582 return llvm::Error::success();
584 return llvm::createStringError(llvm::inconvertibleErrorCode(),
585 "VarInfo cannot contain this Reference");
592 I->
Type = std::move(R);
593 return llvm::Error::success();
595 return llvm::createStringError(llvm::inconvertibleErrorCode(),
596 "invalid type cannot contain Reference");
604 I->
Type = std::move(R);
605 return llvm::Error::success();
607 return llvm::createStringError(llvm::inconvertibleErrorCode(),
608 "invalid type cannot contain Reference");
616 I->
Type = std::move(R);
617 return llvm::Error::success();
619 return llvm::createStringError(llvm::inconvertibleErrorCode(),
620 "invalid type cannot contain Reference");
628 return llvm::Error::success();
630 return llvm::createStringError(llvm::inconvertibleErrorCode(),
631 "invalid type cannot contain Reference");
639 return llvm::Error::success();
641 return llvm::createStringError(llvm::inconvertibleErrorCode(),
642 "invalid type cannot contain Reference");
651 return llvm::Error::success();
654 return llvm::Error::success();
657 return llvm::Error::success();
659 return llvm::createStringError(llvm::inconvertibleErrorCode(),
660 "invalid type cannot contain Reference");
669 return llvm::Error::success();
672 return llvm::Error::success();
674 return llvm::createStringError(llvm::inconvertibleErrorCode(),
675 "invalid type cannot contain Reference");
683 return llvm::Error::success();
685 I->
Parents.emplace_back(std::move(R));
686 return llvm::Error::success();
689 return llvm::Error::success();
692 return llvm::Error::success();
694 return llvm::createStringError(llvm::inconvertibleErrorCode(),
695 "invalid type cannot contain Reference");
703 return llvm::Error::success();
705 return llvm::createStringError(
706 llvm::inconvertibleErrorCode(),
707 "ConstraintInfo cannot contain this Reference");
713 Friend->
Ref = std::move(R);
714 return llvm::Error::success();
716 return llvm::createStringError(llvm::inconvertibleErrorCode(),
717 "Friend cannot contain this Reference");
720template <
typename T,
typename ChildInfoType>
722 ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
723 "invalid child type for info"));
754 I->
Friends.emplace_back(std::move(R));
759 I->
Members.emplace_back(std::move(R));
762 I->
Bases.emplace_back(std::move(R));
773 llvm::createStringError(llvm::inconvertibleErrorCode(),
774 "invalid container for template parameter"));
777 I->
Params.emplace_back(std::move(P));
781 I->
Params.emplace_back(std::move(P));
786 ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
787 "invalid container for template info"));
806 llvm::inconvertibleErrorCode(),
807 "invalid container for template specialization info"));
816 ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
817 "invalid container for constraint info"));
825llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID, T I) {
827 llvm::StringRef Blob;
828 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
830 return MaybeRecID.takeError();
835llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID,
Reference *I) {
836 llvm::TimeTraceScope(
"Reducing infos",
"readRecord");
838 llvm::StringRef Blob;
839 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
841 return MaybeRecID.takeError();
842 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
847llvm::Error ClangDocBitcodeReader::readBlock(
unsigned ID, T I) {
848 llvm::TimeTraceScope(
"Reducing infos",
"readBlock");
849 if (llvm::Error Err = Stream.EnterSubBlock(ID))
853 unsigned BlockOrCode = 0;
854 llvm::Expected<Cursor> C = skipUntilRecordOrBlock(BlockOrCode);
856 return C.takeError();
859 case Cursor::BadBlock:
860 return llvm::createStringError(llvm::inconvertibleErrorCode(),
862 case Cursor::BlockEnd:
863 return llvm::Error::success();
864 case Cursor::BlockBegin:
865 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
866 if (llvm::Error Skipped = Stream.SkipBlock())
867 return joinErrors(std::move(Err), std::move(Skipped));
874 if (
auto Err = readRecord(BlockOrCode, I))
881template <
typename InfoType,
typename T,
typename Callback>
882llvm::Error ClangDocBitcodeReader::handleSubBlock(
unsigned ID, T Parent,
885 if (
auto Err = readBlock(ID, &
Info))
887 Function(Parent, std::move(
Info));
888 return llvm::Error::success();
891template <
typename InfoType,
typename T,
typename Callback>
892llvm::Error ClangDocBitcodeReader::handleTypeSubBlock(
unsigned ID, T Parent,
895 if (
auto Err = readBlock(ID, &
Info))
897 if (
auto Err = Function(Parent, std::move(
Info)))
899 return llvm::Error::success();
903llvm::Error ClangDocBitcodeReader::readSubBlock(
unsigned ID, T I) {
904 llvm::TimeTraceScope(
"Reducing infos",
"readSubBlock");
906 static auto CreateAddFunc = [](
auto AddFunc) {
907 return [AddFunc](
auto Parent,
auto Child) {
908 return AddFunc(Parent, std::move(Child));
917 return Comment.takeError();
918 if (
auto Err = readBlock(ID, Comment.get()))
920 return llvm::Error::success();
923 return handleTypeSubBlock<TypeInfo>(
927 return handleTypeSubBlock<FieldTypeInfo>(
931 return handleTypeSubBlock<MemberTypeInfo>(
936 if (
auto Err = readBlock(ID, &R))
938 if (
auto Err =
addReference(I, std::move(R), CurrentReferenceField))
940 return llvm::Error::success();
943 return handleSubBlock<FunctionInfo>(
947 return handleSubBlock<BaseRecordInfo>(
951 return handleSubBlock<EnumInfo>(ID, I,
955 return handleSubBlock<EnumValueInfo>(
959 return handleSubBlock<TemplateInfo>(ID, I, CreateAddFunc(
addTemplate<T>));
962 return handleSubBlock<TemplateSpecializationInfo>(
966 return handleSubBlock<TemplateParamInfo>(
970 return handleSubBlock<TypedefInfo>(ID, I,
974 return handleSubBlock<ConstraintInfo>(ID, I,
978 return handleSubBlock<ConceptInfo>(ID, I,
985 return handleSubBlock<FriendInfo>(ID, I,
989 return llvm::createStringError(llvm::inconvertibleErrorCode(),
990 "invalid subblock type");
994llvm::Expected<ClangDocBitcodeReader::Cursor>
995ClangDocBitcodeReader::skipUntilRecordOrBlock(
unsigned &BlockOrRecordID) {
996 llvm::TimeTraceScope(
"Reducing infos",
"skipUntilRecordOrBlock");
999 while (!Stream.AtEndOfStream()) {
1000 Expected<unsigned> Code = Stream.ReadCode();
1002 return Code.takeError();
1004 if (*Code >=
static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
1005 BlockOrRecordID = *Code;
1006 return Cursor::Record;
1008 switch (
static_cast<llvm::bitc::FixedAbbrevIDs
>(*Code)) {
1009 case llvm::bitc::ENTER_SUBBLOCK:
1010 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
1011 BlockOrRecordID = MaybeID.get();
1013 return MaybeID.takeError();
1014 return Cursor::BlockBegin;
1015 case llvm::bitc::END_BLOCK:
1016 if (Stream.ReadBlockEnd())
1017 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1018 "error at end of block");
1019 return Cursor::BlockEnd;
1020 case llvm::bitc::DEFINE_ABBREV:
1021 if (llvm::Error Err = Stream.ReadAbbrevRecord())
1022 return std::move(Err);
1024 case llvm::bitc::UNABBREV_RECORD:
1025 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1026 "found unabbreviated record");
1027 case llvm::bitc::FIRST_APPLICATION_ABBREV:
1028 llvm_unreachable(
"Unexpected abbrev id.");
1031 llvm_unreachable(
"Premature stream end.");
1034llvm::Error ClangDocBitcodeReader::validateStream() {
1035 if (Stream.AtEndOfStream())
1036 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1037 "premature end of stream");
1040 for (
int Idx = 0; Idx != 4; ++Idx) {
1041 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
1043 return MaybeRead.takeError();
1045 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1046 "invalid bitcode signature");
1048 return llvm::Error::success();
1051llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() {
1052 llvm::TimeTraceScope(
"Reducing infos",
"readBlockInfoBlock");
1053 Expected<std::optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo =
1054 Stream.ReadBlockInfoBlock();
1055 if (!MaybeBlockInfo)
1056 return MaybeBlockInfo.takeError();
1057 BlockInfo = MaybeBlockInfo.get();
1059 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1060 "unable to parse BlockInfoBlock");
1061 Stream.setBlockInfo(&*BlockInfo);
1062 return llvm::Error::success();
1065template <
typename T>
1066llvm::Expected<std::unique_ptr<Info>>
1067ClangDocBitcodeReader::createInfo(
unsigned ID) {
1068 llvm::TimeTraceScope(
"Reducing infos",
"createInfo");
1069 std::unique_ptr<Info> I = std::make_unique<T>();
1070 if (
auto Err = readBlock(ID,
static_cast<T *
>(I.get())))
1071 return std::move(Err);
1072 return std::unique_ptr<Info>{std::move(I)};
1075llvm::Expected<std::unique_ptr<Info>>
1076ClangDocBitcodeReader::readBlockToInfo(
unsigned ID) {
1077 llvm::TimeTraceScope(
"Reducing infos",
"readBlockToInfo");
1080 return createInfo<NamespaceInfo>(ID);
1082 return createInfo<RecordInfo>(ID);
1084 return createInfo<EnumInfo>(ID);
1086 return createInfo<TypedefInfo>(ID);
1088 return createInfo<ConceptInfo>(ID);
1090 return createInfo<FunctionInfo>(ID);
1092 return createInfo<VarInfo>(ID);
1094 return createInfo<FriendInfo>(ID);
1096 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1097 "cannot create info");
1102llvm::Expected<std::vector<std::unique_ptr<Info>>>
1104 std::vector<std::unique_ptr<Info>> Infos;
1105 if (
auto Err = validateStream())
1106 return std::move(Err);
1109 while (!Stream.AtEndOfStream()) {
1110 Expected<unsigned> MaybeCode = Stream.ReadCode();
1112 return MaybeCode.takeError();
1113 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK)
1114 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1115 "no blocks in input");
1116 Expected<unsigned> MaybeID = Stream.ReadSubBlockID();
1118 return MaybeID.takeError();
1119 unsigned ID = MaybeID.get();
1127 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1128 "invalid top level block");
1137 auto InfoOrErr = readBlockToInfo(ID);
1139 return InfoOrErr.takeError();
1140 Infos.emplace_back(std::move(InfoOrErr.get()));
1145 return std::move(Err);
1147 case llvm::bitc::BLOCKINFO_BLOCK_ID:
1148 if (
auto Err = readBlockInfoBlock())
1149 return std::move(Err);
1152 if (llvm::Error Err = Stream.SkipBlock())
1153 return std::move(Err);
1157 return std::move(Infos);
static llvm::ExitOnError ExitOnErr