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");
165 return llvm::createStringError(llvm::inconvertibleErrorCode(),
166 "invalid field for NamespaceInfo");
192 return llvm::createStringError(llvm::inconvertibleErrorCode(),
193 "invalid field for RecordInfo");
215 return llvm::createStringError(llvm::inconvertibleErrorCode(),
216 "invalid field for BaseRecordInfo");
221 llvm::StringRef Blob,
EnumInfo *I) {
234 return llvm::createStringError(llvm::inconvertibleErrorCode(),
235 "invalid field for EnumInfo");
251 return llvm::createStringError(llvm::inconvertibleErrorCode(),
252 "invalid field for TypedefInfo");
266 return llvm::createStringError(llvm::inconvertibleErrorCode(),
267 "invalid field for EnumValueInfo");
289 return llvm::createStringError(llvm::inconvertibleErrorCode(),
290 "invalid field for FunctionInfo");
295 llvm::StringRef Blob,
TypeInfo *I) {
302 return llvm::createStringError(llvm::inconvertibleErrorCode(),
303 "invalid field for TypeInfo");
319 return llvm::createStringError(llvm::inconvertibleErrorCode(),
320 "invalid field for TypeInfo");
338 return llvm::createStringError(llvm::inconvertibleErrorCode(),
339 "invalid field for MemberTypeInfo");
345 llvm::SmallString<16> KindStr;
351 return llvm::Error::success();
373 return llvm::createStringError(llvm::inconvertibleErrorCode(),
374 "invalid field for CommentInfo");
396 return llvm::createStringError(llvm::inconvertibleErrorCode(),
397 "invalid field for Reference");
404 return llvm::createStringError(llvm::inconvertibleErrorCode(),
405 "invalid field for TemplateParamInfo");
409 llvm::StringRef Blob,
413 return llvm::createStringError(llvm::inconvertibleErrorCode(),
414 "invalid field for TemplateParamInfo");
421 return llvm::createStringError(llvm::inconvertibleErrorCode(),
422 "invalid field for TemplateParamInfo");
439 llvm_unreachable(
"invalid field for ConceptInfo");
446 return llvm::createStringError(llvm::inconvertibleErrorCode(),
447 "invalid field for ConstraintInfo");
451 llvm::StringRef Blob,
VarInfo *I) {
462 return llvm::createStringError(llvm::inconvertibleErrorCode(),
463 "invalid field for VarInfo");
472 return llvm::createStringError(llvm::inconvertibleErrorCode(),
473 "invalid field for Friend");
477 return llvm::createStringError(llvm::inconvertibleErrorCode(),
478 "invalid type cannot contain CommentInfo");
510 I->
Children.emplace_back(std::make_unique<CommentInfo>());
529template <
typename T,
typename TTypeInfo>
531 return llvm::createStringError(llvm::inconvertibleErrorCode(),
532 "invalid type cannot contain TypeInfo");
536 I->
Members.emplace_back(std::move(T));
537 return llvm::Error::success();
541 I->
Members.emplace_back(std::move(T));
542 return llvm::Error::success();
547 return llvm::Error::success();
551 I->
Params.emplace_back(std::move(T));
552 return llvm::Error::success();
558 I->
Params->emplace_back(std::move(T));
559 return llvm::Error::success();
564 return llvm::Error::success();
569 return llvm::Error::success();
574 return llvm::Error::success();
578 I->
Type = std::move(T);
579 return llvm::Error::success();
584 return llvm::createStringError(llvm::inconvertibleErrorCode(),
585 "invalid type cannot contain Reference");
592 return llvm::Error::success();
594 return llvm::createStringError(llvm::inconvertibleErrorCode(),
595 "VarInfo cannot contain this Reference");
602 I->
Type = std::move(R);
603 return llvm::Error::success();
605 return llvm::createStringError(llvm::inconvertibleErrorCode(),
606 "invalid type cannot contain Reference");
614 I->
Type = std::move(R);
615 return llvm::Error::success();
617 return llvm::createStringError(llvm::inconvertibleErrorCode(),
618 "invalid type cannot contain Reference");
626 I->
Type = std::move(R);
627 return llvm::Error::success();
629 return llvm::createStringError(llvm::inconvertibleErrorCode(),
630 "invalid type cannot contain Reference");
638 return llvm::Error::success();
640 return llvm::createStringError(llvm::inconvertibleErrorCode(),
641 "invalid type cannot contain Reference");
649 return llvm::Error::success();
651 return llvm::createStringError(llvm::inconvertibleErrorCode(),
652 "invalid type cannot contain Reference");
661 return llvm::Error::success();
664 return llvm::Error::success();
667 return llvm::Error::success();
669 return llvm::createStringError(llvm::inconvertibleErrorCode(),
670 "invalid type cannot contain Reference");
679 return llvm::Error::success();
682 return llvm::Error::success();
684 return llvm::createStringError(llvm::inconvertibleErrorCode(),
685 "invalid type cannot contain Reference");
693 return llvm::Error::success();
695 I->
Parents.emplace_back(std::move(R));
696 return llvm::Error::success();
699 return llvm::Error::success();
702 return llvm::Error::success();
704 return llvm::createStringError(llvm::inconvertibleErrorCode(),
705 "invalid type cannot contain Reference");
713 return llvm::Error::success();
715 return llvm::createStringError(
716 llvm::inconvertibleErrorCode(),
717 "ConstraintInfo cannot contain this Reference");
723 Friend->
Ref = std::move(R);
724 return llvm::Error::success();
726 return llvm::createStringError(llvm::inconvertibleErrorCode(),
727 "Friend cannot contain this Reference");
730template <
typename T,
typename ChildInfoType>
732 ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
733 "invalid child type for info"));
764 I->
Friends.emplace_back(std::move(R));
769 I->
Members.emplace_back(std::move(R));
772 I->
Bases.emplace_back(std::move(R));
783 llvm::createStringError(llvm::inconvertibleErrorCode(),
784 "invalid container for template parameter"));
787 I->
Params.emplace_back(std::move(P));
791 I->
Params.emplace_back(std::move(P));
796 ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
797 "invalid container for template info"));
819 llvm::inconvertibleErrorCode(),
820 "invalid container for template specialization info"));
829 ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
830 "invalid container for constraint info"));
838llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID, T I) {
840 llvm::StringRef Blob;
841 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
843 return MaybeRecID.takeError();
848llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID,
Reference *I) {
849 llvm::TimeTraceScope(
"Reducing infos",
"readRecord");
851 llvm::StringRef Blob;
852 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
854 return MaybeRecID.takeError();
855 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
860llvm::Error ClangDocBitcodeReader::readBlock(
unsigned ID, T I) {
861 llvm::TimeTraceScope(
"Reducing infos",
"readBlock");
862 if (llvm::Error Err = Stream.EnterSubBlock(ID))
866 unsigned BlockOrCode = 0;
867 llvm::Expected<Cursor> C = skipUntilRecordOrBlock(BlockOrCode);
869 return C.takeError();
872 case Cursor::BadBlock:
873 return llvm::createStringError(llvm::inconvertibleErrorCode(),
875 case Cursor::BlockEnd:
876 return llvm::Error::success();
877 case Cursor::BlockBegin:
878 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
879 if (llvm::Error Skipped = Stream.SkipBlock())
880 return joinErrors(std::move(Err), std::move(Skipped));
887 if (
auto Err = readRecord(BlockOrCode, I))
894template <
typename InfoType,
typename T,
typename Callback>
895llvm::Error ClangDocBitcodeReader::handleSubBlock(
unsigned ID, T Parent,
898 if (
auto Err = readBlock(ID, &
Info))
900 Function(Parent, std::move(
Info));
901 return llvm::Error::success();
904template <
typename InfoType,
typename T,
typename Callback>
905llvm::Error ClangDocBitcodeReader::handleTypeSubBlock(
unsigned ID, T Parent,
908 if (
auto Err = readBlock(ID, &
Info))
910 if (
auto Err = Function(Parent, std::move(
Info)))
912 return llvm::Error::success();
916llvm::Error ClangDocBitcodeReader::readSubBlock(
unsigned ID, T I) {
917 llvm::TimeTraceScope(
"Reducing infos",
"readSubBlock");
919 static auto CreateAddFunc = [](
auto AddFunc) {
920 return [AddFunc](
auto Parent,
auto Child) {
921 return AddFunc(Parent, std::move(Child));
930 return Comment.takeError();
931 if (
auto Err = readBlock(ID, Comment.get()))
933 return llvm::Error::success();
936 return handleTypeSubBlock<TypeInfo>(
940 return handleTypeSubBlock<FieldTypeInfo>(
944 return handleTypeSubBlock<MemberTypeInfo>(
949 if (
auto Err = readBlock(ID, &R))
951 if (
auto Err =
addReference(I, std::move(R), CurrentReferenceField))
953 return llvm::Error::success();
956 return handleSubBlock<FunctionInfo>(
960 return handleSubBlock<BaseRecordInfo>(
964 return handleSubBlock<EnumInfo>(ID, I,
968 return handleSubBlock<EnumValueInfo>(
972 return handleSubBlock<TemplateInfo>(ID, I, CreateAddFunc(
addTemplate<T>));
975 return handleSubBlock<TemplateSpecializationInfo>(
979 return handleSubBlock<TemplateParamInfo>(
983 return handleSubBlock<TypedefInfo>(ID, I,
987 return handleSubBlock<ConstraintInfo>(ID, I,
991 return handleSubBlock<ConceptInfo>(ID, I,
998 return handleSubBlock<FriendInfo>(ID, I,
1002 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1003 "invalid subblock type");
1007llvm::Expected<ClangDocBitcodeReader::Cursor>
1008ClangDocBitcodeReader::skipUntilRecordOrBlock(
unsigned &BlockOrRecordID) {
1009 llvm::TimeTraceScope(
"Reducing infos",
"skipUntilRecordOrBlock");
1010 BlockOrRecordID = 0;
1012 while (!Stream.AtEndOfStream()) {
1013 Expected<unsigned> Code = Stream.ReadCode();
1015 return Code.takeError();
1017 if (*Code >=
static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
1018 BlockOrRecordID = *Code;
1019 return Cursor::Record;
1021 switch (
static_cast<llvm::bitc::FixedAbbrevIDs
>(*Code)) {
1022 case llvm::bitc::ENTER_SUBBLOCK:
1023 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
1024 BlockOrRecordID = MaybeID.get();
1026 return MaybeID.takeError();
1027 return Cursor::BlockBegin;
1028 case llvm::bitc::END_BLOCK:
1029 if (Stream.ReadBlockEnd())
1030 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1031 "error at end of block");
1032 return Cursor::BlockEnd;
1033 case llvm::bitc::DEFINE_ABBREV:
1034 if (llvm::Error Err = Stream.ReadAbbrevRecord())
1035 return std::move(Err);
1037 case llvm::bitc::UNABBREV_RECORD:
1038 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1039 "found unabbreviated record");
1040 case llvm::bitc::FIRST_APPLICATION_ABBREV:
1041 llvm_unreachable(
"Unexpected abbrev id.");
1044 llvm_unreachable(
"Premature stream end.");
1047llvm::Error ClangDocBitcodeReader::validateStream() {
1048 if (Stream.AtEndOfStream())
1049 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1050 "premature end of stream");
1053 for (
int Idx = 0; Idx != 4; ++Idx) {
1054 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
1056 return MaybeRead.takeError();
1058 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1059 "invalid bitcode signature");
1061 return llvm::Error::success();
1064llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() {
1065 llvm::TimeTraceScope(
"Reducing infos",
"readBlockInfoBlock");
1066 Expected<std::optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo =
1067 Stream.ReadBlockInfoBlock();
1068 if (!MaybeBlockInfo)
1069 return MaybeBlockInfo.takeError();
1070 BlockInfo = MaybeBlockInfo.get();
1072 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1073 "unable to parse BlockInfoBlock");
1074 Stream.setBlockInfo(&*BlockInfo);
1075 return llvm::Error::success();
1078template <
typename T>
1079llvm::Expected<std::unique_ptr<Info>>
1080ClangDocBitcodeReader::createInfo(
unsigned ID) {
1081 llvm::TimeTraceScope(
"Reducing infos",
"createInfo");
1082 std::unique_ptr<Info> I = std::make_unique<T>();
1083 if (
auto Err = readBlock(ID,
static_cast<T *
>(I.get())))
1084 return std::move(Err);
1085 return std::unique_ptr<Info>{std::move(I)};
1088llvm::Expected<std::unique_ptr<Info>>
1089ClangDocBitcodeReader::readBlockToInfo(
unsigned ID) {
1090 llvm::TimeTraceScope(
"Reducing infos",
"readBlockToInfo");
1093 return createInfo<NamespaceInfo>(ID);
1095 return createInfo<RecordInfo>(ID);
1097 return createInfo<EnumInfo>(ID);
1099 return createInfo<TypedefInfo>(ID);
1101 return createInfo<ConceptInfo>(ID);
1103 return createInfo<FunctionInfo>(ID);
1105 return createInfo<VarInfo>(ID);
1107 return createInfo<FriendInfo>(ID);
1109 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1110 "cannot create info");
1115llvm::Expected<std::vector<std::unique_ptr<Info>>>
1117 std::vector<std::unique_ptr<Info>> Infos;
1118 if (
auto Err = validateStream())
1119 return std::move(Err);
1122 while (!Stream.AtEndOfStream()) {
1123 Expected<unsigned> MaybeCode = Stream.ReadCode();
1125 return MaybeCode.takeError();
1126 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK)
1127 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1128 "no blocks in input");
1129 Expected<unsigned> MaybeID = Stream.ReadSubBlockID();
1131 return MaybeID.takeError();
1132 unsigned ID = MaybeID.get();
1140 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1141 "invalid top level block");
1150 auto InfoOrErr = readBlockToInfo(ID);
1152 return InfoOrErr.takeError();
1153 Infos.emplace_back(std::move(InfoOrErr.get()));
1158 return std::move(Err);
1160 case llvm::bitc::BLOCKINFO_BLOCK_ID:
1161 if (
auto Err = readBlockInfoBlock())
1162 return std::move(Err);
1165 if (llvm::Error Err = Stream.SkipBlock())
1166 return std::move(Err);
1170 return std::move(Infos);
static llvm::ExitOnError ExitOnErr