19using Record = llvm::SmallVector<uint64_t, 1024>;
24 llvm::StringRef Blob) {
25 Field.assign(Blob.begin(), Blob.end());
26 return llvm::Error::success();
30 llvm::StringRef Blob) {
32 return llvm::createStringError(llvm::inconvertibleErrorCode(),
33 "incorrect USR size");
37 for (
int I = 0, E = R[0]; I < E; ++I)
39 return llvm::Error::success();
43 llvm::StringRef Blob) {
45 return llvm::Error::success();
49 llvm::StringRef Blob) {
55 Field = (AccessSpecifier)R[0];
56 return llvm::Error::success();
58 llvm_unreachable(
"invalid value for AccessSpecifier");
62 llvm::StringRef Blob) {
63 switch (
static_cast<TagTypeKind
>(R[0])) {
64 case TagTypeKind::Struct:
65 case TagTypeKind::Interface:
66 case TagTypeKind::Union:
67 case TagTypeKind::Class:
68 case TagTypeKind::Enum:
69 Field =
static_cast<TagTypeKind
>(R[0]);
70 return llvm::Error::success();
72 return llvm::createStringError(llvm::inconvertibleErrorCode(),
73 "invalid value for TagTypeKind");
77 llvm::StringRef Blob) {
79 return llvm::createStringError(llvm::inconvertibleErrorCode(),
80 "integer too large to parse");
81 Field.emplace(
static_cast<int>(R[0]),
static_cast<int>(R[1]), Blob,
82 static_cast<bool>(R[2]));
83 return llvm::Error::success();
87 llvm::StringRef Blob) {
88 switch (
auto IT =
static_cast<InfoType>(R[0])) {
99 return llvm::Error::success();
101 return llvm::createStringError(llvm::inconvertibleErrorCode(),
102 "invalid value for InfoType");
106 llvm::StringRef Blob) {
107 switch (
auto F =
static_cast<FieldId>(R[0])) {
118 return llvm::Error::success();
120 return llvm::createStringError(llvm::inconvertibleErrorCode(),
121 "invalid value for FieldId");
127 llvm::StringRef Blob) {
128 Field.push_back(Blob);
129 return llvm::Error::success();
134 llvm::StringRef Blob) {
136 return llvm::createStringError(llvm::inconvertibleErrorCode(),
137 "integer too large to parse");
138 Field.emplace_back(
static_cast<int>(R[0]),
static_cast<int>(R[1]), Blob,
139 static_cast<bool>(R[2]));
140 return llvm::Error::success();
144 llvm::StringRef Blob,
const unsigned VersionNo) {
145 if (ID ==
VERSION && R[0] == VersionNo)
146 return llvm::Error::success();
147 return llvm::createStringError(llvm::inconvertibleErrorCode(),
148 "mismatched bitcode version number");
161 return llvm::createStringError(llvm::inconvertibleErrorCode(),
162 "invalid field for NamespaceInfo");
186 return llvm::createStringError(llvm::inconvertibleErrorCode(),
187 "invalid field for RecordInfo");
209 return llvm::createStringError(llvm::inconvertibleErrorCode(),
210 "invalid field for BaseRecordInfo");
215 llvm::StringRef Blob,
EnumInfo *I) {
228 return llvm::createStringError(llvm::inconvertibleErrorCode(),
229 "invalid field for EnumInfo");
245 return llvm::createStringError(llvm::inconvertibleErrorCode(),
246 "invalid field for TypedefInfo");
260 return llvm::createStringError(llvm::inconvertibleErrorCode(),
261 "invalid field for EnumValueInfo");
283 return llvm::createStringError(llvm::inconvertibleErrorCode(),
284 "invalid field for FunctionInfo");
289 llvm::StringRef Blob,
TypeInfo *I) {
296 return llvm::createStringError(llvm::inconvertibleErrorCode(),
297 "invalid field for TypeInfo");
313 return llvm::createStringError(llvm::inconvertibleErrorCode(),
314 "invalid field for TypeInfo");
332 return llvm::createStringError(llvm::inconvertibleErrorCode(),
333 "invalid field for MemberTypeInfo");
339 llvm::SmallString<16> KindStr;
345 return llvm::Error::success();
367 return llvm::createStringError(llvm::inconvertibleErrorCode(),
368 "invalid field for CommentInfo");
390 return llvm::createStringError(llvm::inconvertibleErrorCode(),
391 "invalid field for Reference");
398 return llvm::createStringError(llvm::inconvertibleErrorCode(),
399 "invalid field for TemplateParamInfo");
403 llvm::StringRef Blob,
407 return llvm::createStringError(llvm::inconvertibleErrorCode(),
408 "invalid field for TemplateParamInfo");
415 return llvm::createStringError(llvm::inconvertibleErrorCode(),
416 "invalid field for TemplateParamInfo");
431 llvm_unreachable(
"invalid field for ConceptInfo");
438 return llvm::createStringError(llvm::inconvertibleErrorCode(),
439 "invalid field for ConstraintInfo");
443 llvm::StringRef Blob,
VarInfo *I) {
454 return llvm::createStringError(llvm::inconvertibleErrorCode(),
455 "invalid field for VarInfo");
464 return llvm::createStringError(llvm::inconvertibleErrorCode(),
465 "invalid field for Friend");
469 return llvm::createStringError(llvm::inconvertibleErrorCode(),
470 "invalid type cannot contain CommentInfo");
502 I->
Children.emplace_back(std::make_unique<CommentInfo>());
517template <
typename T,
typename TTypeInfo>
519 return llvm::createStringError(llvm::inconvertibleErrorCode(),
520 "invalid type cannot contain TypeInfo");
524 I->
Members.emplace_back(std::move(T));
525 return llvm::Error::success();
529 I->
Members.emplace_back(std::move(T));
530 return llvm::Error::success();
535 return llvm::Error::success();
539 I->
Params.emplace_back(std::move(T));
540 return llvm::Error::success();
546 I->
Params->emplace_back(std::move(T));
547 return llvm::Error::success();
552 return llvm::Error::success();
557 return llvm::Error::success();
562 return llvm::Error::success();
566 I->
Type = std::move(T);
567 return llvm::Error::success();
572 return llvm::createStringError(llvm::inconvertibleErrorCode(),
573 "invalid type cannot contain Reference");
580 return llvm::Error::success();
582 return llvm::createStringError(llvm::inconvertibleErrorCode(),
583 "VarInfo cannot contain this Reference");
590 I->
Type = std::move(R);
591 return llvm::Error::success();
593 return llvm::createStringError(llvm::inconvertibleErrorCode(),
594 "invalid type cannot contain 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 return llvm::Error::success();
628 return llvm::createStringError(llvm::inconvertibleErrorCode(),
629 "invalid type cannot contain Reference");
637 return llvm::Error::success();
639 return llvm::createStringError(llvm::inconvertibleErrorCode(),
640 "invalid type cannot contain Reference");
649 return llvm::Error::success();
652 return llvm::Error::success();
655 return llvm::Error::success();
657 return llvm::createStringError(llvm::inconvertibleErrorCode(),
658 "invalid type cannot contain Reference");
667 return llvm::Error::success();
670 return llvm::Error::success();
672 return llvm::createStringError(llvm::inconvertibleErrorCode(),
673 "invalid type cannot contain Reference");
681 return llvm::Error::success();
683 I->
Parents.emplace_back(std::move(R));
684 return llvm::Error::success();
687 return llvm::Error::success();
690 return llvm::Error::success();
692 return llvm::createStringError(llvm::inconvertibleErrorCode(),
693 "invalid type cannot contain Reference");
701 return llvm::Error::success();
703 return llvm::createStringError(
704 llvm::inconvertibleErrorCode(),
705 "ConstraintInfo cannot contain this Reference");
711 Friend->
Ref = std::move(R);
712 return llvm::Error::success();
714 return llvm::createStringError(llvm::inconvertibleErrorCode(),
715 "Friend cannot contain this Reference");
718template <
typename T,
typename ChildInfoType>
720 llvm::errs() <<
"invalid child type for info";
752 I->
Friends.emplace_back(std::move(R));
757 I->
Members.emplace_back(std::move(R));
760 I->
Bases.emplace_back(std::move(R));
770 llvm::errs() <<
"invalid container for template parameter";
774 I->
Params.emplace_back(std::move(P));
778 I->
Params.emplace_back(std::move(P));
783 llvm::errs() <<
"invalid container for template info";
802 llvm::errs() <<
"invalid container for template specialization info";
812 llvm::errs() <<
"invalid container for constraint info";
821llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID, T I) {
823 llvm::StringRef Blob;
824 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
826 return MaybeRecID.takeError();
831llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID,
Reference *I) {
832 llvm::TimeTraceScope(
"Reducing infos",
"readRecord");
834 llvm::StringRef Blob;
835 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
837 return MaybeRecID.takeError();
838 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
843llvm::Error ClangDocBitcodeReader::readBlock(
unsigned ID, T I) {
844 llvm::TimeTraceScope(
"Reducing infos",
"readBlock");
845 if (llvm::Error Err = Stream.EnterSubBlock(ID))
849 unsigned BlockOrCode = 0;
850 Cursor Res = skipUntilRecordOrBlock(BlockOrCode);
853 case Cursor::BadBlock:
854 return llvm::createStringError(llvm::inconvertibleErrorCode(),
856 case Cursor::BlockEnd:
857 return llvm::Error::success();
858 case Cursor::BlockBegin:
859 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
860 if (llvm::Error Skipped = Stream.SkipBlock())
861 return joinErrors(std::move(Err), std::move(Skipped));
868 if (
auto Err = readRecord(BlockOrCode, I))
875template <
typename InfoType,
typename T,
typename Callback>
876llvm::Error ClangDocBitcodeReader::handleSubBlock(
unsigned ID, T Parent,
879 if (
auto Err = readBlock(ID, &
Info))
881 Function(Parent, std::move(
Info));
882 return llvm::Error::success();
885template <
typename InfoType,
typename T,
typename Callback>
886llvm::Error ClangDocBitcodeReader::handleTypeSubBlock(
unsigned ID, T Parent,
889 if (
auto Err = readBlock(ID, &
Info))
891 if (
auto Err = Function(Parent, std::move(
Info)))
893 return llvm::Error::success();
897llvm::Error ClangDocBitcodeReader::readSubBlock(
unsigned ID, T I) {
898 llvm::TimeTraceScope(
"Reducing infos",
"readSubBlock");
900 static auto CreateAddFunc = [](
auto AddFunc) {
901 return [AddFunc](
auto Parent,
auto Child) {
902 return AddFunc(Parent, std::move(Child));
911 return Comment.takeError();
912 if (
auto Err = readBlock(ID, Comment.get()))
914 return llvm::Error::success();
917 return handleTypeSubBlock<TypeInfo>(
921 return handleTypeSubBlock<FieldTypeInfo>(
925 return handleTypeSubBlock<MemberTypeInfo>(
930 if (
auto Err = readBlock(ID, &R))
932 if (
auto Err =
addReference(I, std::move(R), CurrentReferenceField))
934 return llvm::Error::success();
937 return handleSubBlock<FunctionInfo>(
941 return handleSubBlock<BaseRecordInfo>(
945 return handleSubBlock<EnumInfo>(ID, I,
949 return handleSubBlock<EnumValueInfo>(
953 return handleSubBlock<TemplateInfo>(ID, I, CreateAddFunc(
addTemplate<T>));
956 return handleSubBlock<TemplateSpecializationInfo>(
960 return handleSubBlock<TemplateParamInfo>(
964 return handleSubBlock<TypedefInfo>(ID, I,
968 return handleSubBlock<ConstraintInfo>(ID, I,
972 return handleSubBlock<ConceptInfo>(ID, I,
979 return handleSubBlock<FriendInfo>(ID, I,
983 return llvm::createStringError(llvm::inconvertibleErrorCode(),
984 "invalid subblock type");
988ClangDocBitcodeReader::Cursor
989ClangDocBitcodeReader::skipUntilRecordOrBlock(
unsigned &BlockOrRecordID) {
990 llvm::TimeTraceScope(
"Reducing infos",
"skipUntilRecordOrBlock");
993 while (!Stream.AtEndOfStream()) {
994 Expected<unsigned> MaybeCode = Stream.ReadCode();
997 consumeError(MaybeCode.takeError());
998 return Cursor::BadBlock;
1001 unsigned Code = MaybeCode.get();
1002 if (Code >=
static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
1003 BlockOrRecordID = Code;
1004 return Cursor::Record;
1006 switch (
static_cast<llvm::bitc::FixedAbbrevIDs
>(Code)) {
1007 case llvm::bitc::ENTER_SUBBLOCK:
1008 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
1009 BlockOrRecordID = MaybeID.get();
1012 consumeError(MaybeID.takeError());
1014 return Cursor::BlockBegin;
1015 case llvm::bitc::END_BLOCK:
1016 if (Stream.ReadBlockEnd())
1017 return Cursor::BadBlock;
1018 return Cursor::BlockEnd;
1019 case llvm::bitc::DEFINE_ABBREV:
1020 if (llvm::Error Err = Stream.ReadAbbrevRecord()) {
1022 consumeError(std::move(Err));
1025 case llvm::bitc::UNABBREV_RECORD:
1026 return Cursor::BadBlock;
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()) {
1154 consumeError(std::move(Err));
1159 return std::move(Infos);