18using Record = llvm::SmallVector<uint64_t, 1024>;
23 llvm::StringRef Blob) {
24 Field.assign(Blob.begin(), Blob.end());
25 return llvm::Error::success();
29 llvm::StringRef Blob) {
31 return llvm::createStringError(llvm::inconvertibleErrorCode(),
32 "incorrect USR size");
36 for (
int I = 0, E = R[0]; I < E; ++I)
38 return llvm::Error::success();
42 llvm::StringRef Blob) {
44 return llvm::Error::success();
48 llvm::StringRef Blob) {
54 Field = (AccessSpecifier)R[0];
55 return llvm::Error::success();
57 llvm_unreachable(
"invalid value for AccessSpecifier");
61 llvm::StringRef Blob) {
62 switch (
static_cast<TagTypeKind
>(R[0])) {
63 case TagTypeKind::Struct:
64 case TagTypeKind::Interface:
65 case TagTypeKind::Union:
66 case TagTypeKind::Class:
67 case TagTypeKind::Enum:
68 Field =
static_cast<TagTypeKind
>(R[0]);
69 return llvm::Error::success();
71 return llvm::createStringError(llvm::inconvertibleErrorCode(),
72 "invalid value for TagTypeKind");
76 llvm::StringRef Blob) {
78 return llvm::createStringError(llvm::inconvertibleErrorCode(),
79 "integer too large to parse");
80 Field.emplace(
static_cast<int>(R[0]),
static_cast<int>(R[1]), Blob,
81 static_cast<bool>(R[2]));
82 return llvm::Error::success();
86 llvm::StringRef Blob) {
87 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 llvm::StringRef Blob) {
106 switch (
auto F =
static_cast<FieldId>(R[0])) {
117 return llvm::Error::success();
119 return llvm::createStringError(llvm::inconvertibleErrorCode(),
120 "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(
static_cast<int>(R[0]),
static_cast<int>(R[1]), Blob,
138 static_cast<bool>(R[2]));
139 return llvm::Error::success();
143 llvm::StringRef Blob,
const unsigned VersionNo) {
144 if (ID ==
VERSION && R[0] == VersionNo)
145 return llvm::Error::success();
146 return llvm::createStringError(llvm::inconvertibleErrorCode(),
147 "mismatched bitcode version number");
160 return llvm::createStringError(llvm::inconvertibleErrorCode(),
161 "invalid field for NamespaceInfo");
185 return llvm::createStringError(llvm::inconvertibleErrorCode(),
186 "invalid field for RecordInfo");
208 return llvm::createStringError(llvm::inconvertibleErrorCode(),
209 "invalid field for BaseRecordInfo");
214 llvm::StringRef Blob,
EnumInfo *I) {
227 return llvm::createStringError(llvm::inconvertibleErrorCode(),
228 "invalid field for EnumInfo");
244 return llvm::createStringError(llvm::inconvertibleErrorCode(),
245 "invalid field for TypedefInfo");
259 return llvm::createStringError(llvm::inconvertibleErrorCode(),
260 "invalid field for EnumValueInfo");
282 return llvm::createStringError(llvm::inconvertibleErrorCode(),
283 "invalid field for FunctionInfo");
288 llvm::StringRef Blob,
TypeInfo *I) {
295 return llvm::createStringError(llvm::inconvertibleErrorCode(),
296 "invalid field for TypeInfo");
312 return llvm::createStringError(llvm::inconvertibleErrorCode(),
313 "invalid field for TypeInfo");
331 return llvm::createStringError(llvm::inconvertibleErrorCode(),
332 "invalid field for MemberTypeInfo");
338 llvm::SmallString<16> KindStr;
344 return llvm::Error::success();
366 return llvm::createStringError(llvm::inconvertibleErrorCode(),
367 "invalid field for CommentInfo");
389 return llvm::createStringError(llvm::inconvertibleErrorCode(),
390 "invalid field for Reference");
397 return llvm::createStringError(llvm::inconvertibleErrorCode(),
398 "invalid field for TemplateParamInfo");
402 llvm::StringRef Blob,
406 return llvm::createStringError(llvm::inconvertibleErrorCode(),
407 "invalid field for TemplateParamInfo");
414 return llvm::createStringError(llvm::inconvertibleErrorCode(),
415 "invalid field for TemplateParamInfo");
430 llvm_unreachable(
"invalid field for ConceptInfo");
437 return llvm::createStringError(llvm::inconvertibleErrorCode(),
438 "invalid field for ConstraintInfo");
442 llvm::StringRef Blob,
VarInfo *I) {
453 return llvm::createStringError(llvm::inconvertibleErrorCode(),
454 "invalid field for VarInfo");
463 return llvm::createStringError(llvm::inconvertibleErrorCode(),
464 "invalid field for Friend");
468 return llvm::createStringError(llvm::inconvertibleErrorCode(),
469 "invalid type cannot contain CommentInfo");
501 I->
Children.emplace_back(std::make_unique<CommentInfo>());
516template <
typename T,
typename TTypeInfo>
518 return llvm::createStringError(llvm::inconvertibleErrorCode(),
519 "invalid type cannot contain TypeInfo");
523 I->
Members.emplace_back(std::move(T));
524 return llvm::Error::success();
528 I->
Members.emplace_back(std::move(T));
529 return llvm::Error::success();
534 return llvm::Error::success();
538 I->
Params.emplace_back(std::move(T));
539 return llvm::Error::success();
545 I->
Params->emplace_back(std::move(T));
546 return llvm::Error::success();
551 return llvm::Error::success();
556 return llvm::Error::success();
561 return llvm::Error::success();
565 I->
Type = std::move(T);
566 return llvm::Error::success();
571 return llvm::createStringError(llvm::inconvertibleErrorCode(),
572 "invalid type cannot contain Reference");
579 return llvm::Error::success();
581 return llvm::createStringError(llvm::inconvertibleErrorCode(),
582 "VarInfo cannot contain this Reference");
589 I->
Type = std::move(R);
590 return llvm::Error::success();
592 return llvm::createStringError(llvm::inconvertibleErrorCode(),
593 "invalid type cannot contain Reference");
601 I->
Type = std::move(R);
602 return llvm::Error::success();
604 return llvm::createStringError(llvm::inconvertibleErrorCode(),
605 "invalid type cannot contain Reference");
613 I->
Type = std::move(R);
614 return llvm::Error::success();
616 return llvm::createStringError(llvm::inconvertibleErrorCode(),
617 "invalid type cannot contain Reference");
625 return llvm::Error::success();
627 return llvm::createStringError(llvm::inconvertibleErrorCode(),
628 "invalid type cannot contain Reference");
636 return llvm::Error::success();
638 return llvm::createStringError(llvm::inconvertibleErrorCode(),
639 "invalid type cannot contain Reference");
648 return llvm::Error::success();
651 return llvm::Error::success();
654 return llvm::Error::success();
656 return llvm::createStringError(llvm::inconvertibleErrorCode(),
657 "invalid type cannot contain Reference");
666 return llvm::Error::success();
669 return llvm::Error::success();
671 return llvm::createStringError(llvm::inconvertibleErrorCode(),
672 "invalid type cannot contain Reference");
680 return llvm::Error::success();
682 I->
Parents.emplace_back(std::move(R));
683 return llvm::Error::success();
686 return llvm::Error::success();
689 return llvm::Error::success();
691 return llvm::createStringError(llvm::inconvertibleErrorCode(),
692 "invalid type cannot contain Reference");
700 return llvm::Error::success();
702 return llvm::createStringError(
703 llvm::inconvertibleErrorCode(),
704 "ConstraintInfo cannot contain this Reference");
710 Friend->
Ref = std::move(R);
711 return llvm::Error::success();
713 return llvm::createStringError(llvm::inconvertibleErrorCode(),
714 "Friend cannot contain this Reference");
717template <
typename T,
typename ChildInfoType>
719 llvm::errs() <<
"invalid child type for info";
751 I->
Friends.emplace_back(std::move(R));
756 I->
Members.emplace_back(std::move(R));
759 I->
Bases.emplace_back(std::move(R));
769 llvm::errs() <<
"invalid container for template parameter";
773 I->
Params.emplace_back(std::move(P));
777 I->
Params.emplace_back(std::move(P));
782 llvm::errs() <<
"invalid container for template info";
801 llvm::errs() <<
"invalid container for template specialization info";
811 llvm::errs() <<
"invalid container for constraint info";
820llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID, T I) {
822 llvm::StringRef Blob;
823 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
825 return MaybeRecID.takeError();
830llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID,
Reference *I) {
831 llvm::TimeTraceScope(
"Reducing infos",
"readRecord");
833 llvm::StringRef Blob;
834 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
836 return MaybeRecID.takeError();
837 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
842llvm::Error ClangDocBitcodeReader::readBlock(
unsigned ID, T I) {
843 llvm::TimeTraceScope(
"Reducing infos",
"readBlock");
844 if (llvm::Error Err = Stream.EnterSubBlock(ID))
848 unsigned BlockOrCode = 0;
849 Cursor Res = skipUntilRecordOrBlock(BlockOrCode);
852 case Cursor::BadBlock:
853 return llvm::createStringError(llvm::inconvertibleErrorCode(),
855 case Cursor::BlockEnd:
856 return llvm::Error::success();
857 case Cursor::BlockBegin:
858 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
859 if (llvm::Error Skipped = Stream.SkipBlock())
860 return joinErrors(std::move(Err), std::move(Skipped));
867 if (
auto Err = readRecord(BlockOrCode, I))
874template <
typename InfoType,
typename T,
typename Callback>
875llvm::Error ClangDocBitcodeReader::handleSubBlock(
unsigned ID, T Parent,
878 if (
auto Err = readBlock(ID, &
Info))
880 Function(Parent, std::move(
Info));
881 return llvm::Error::success();
884template <
typename InfoType,
typename T,
typename Callback>
885llvm::Error ClangDocBitcodeReader::handleTypeSubBlock(
unsigned ID, T Parent,
888 if (
auto Err = readBlock(ID, &
Info))
890 if (
auto Err = Function(Parent, std::move(
Info)))
892 return llvm::Error::success();
896llvm::Error ClangDocBitcodeReader::readSubBlock(
unsigned ID, T I) {
897 llvm::TimeTraceScope(
"Reducing infos",
"readSubBlock");
899 static auto CreateAddFunc = [](
auto AddFunc) {
900 return [AddFunc](
auto Parent,
auto Child) {
901 return AddFunc(Parent, std::move(Child));
910 return Comment.takeError();
911 if (
auto Err = readBlock(ID, Comment.get()))
913 return llvm::Error::success();
916 return handleTypeSubBlock<TypeInfo>(
920 return handleTypeSubBlock<FieldTypeInfo>(
924 return handleTypeSubBlock<MemberTypeInfo>(
929 if (
auto Err = readBlock(ID, &R))
931 if (
auto Err =
addReference(I, std::move(R), CurrentReferenceField))
933 return llvm::Error::success();
936 return handleSubBlock<FunctionInfo>(
940 return handleSubBlock<BaseRecordInfo>(
944 return handleSubBlock<EnumInfo>(ID, I,
948 return handleSubBlock<EnumValueInfo>(
952 return handleSubBlock<TemplateInfo>(ID, I, CreateAddFunc(
addTemplate<T>));
955 return handleSubBlock<TemplateSpecializationInfo>(
959 return handleSubBlock<TemplateParamInfo>(
963 return handleSubBlock<TypedefInfo>(ID, I,
967 return handleSubBlock<ConstraintInfo>(ID, I,
971 return handleSubBlock<ConceptInfo>(ID, I,
978 return handleSubBlock<FriendInfo>(ID, I,
982 return llvm::createStringError(llvm::inconvertibleErrorCode(),
983 "invalid subblock type");
987ClangDocBitcodeReader::Cursor
988ClangDocBitcodeReader::skipUntilRecordOrBlock(
unsigned &BlockOrRecordID) {
989 llvm::TimeTraceScope(
"Reducing infos",
"skipUntilRecordOrBlock");
992 while (!Stream.AtEndOfStream()) {
993 Expected<unsigned> MaybeCode = Stream.ReadCode();
996 consumeError(MaybeCode.takeError());
997 return Cursor::BadBlock;
1000 unsigned Code = MaybeCode.get();
1001 if (Code >=
static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
1002 BlockOrRecordID = Code;
1003 return Cursor::Record;
1005 switch (
static_cast<llvm::bitc::FixedAbbrevIDs
>(Code)) {
1006 case llvm::bitc::ENTER_SUBBLOCK:
1007 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
1008 BlockOrRecordID = MaybeID.get();
1011 consumeError(MaybeID.takeError());
1013 return Cursor::BlockBegin;
1014 case llvm::bitc::END_BLOCK:
1015 if (Stream.ReadBlockEnd())
1016 return Cursor::BadBlock;
1017 return Cursor::BlockEnd;
1018 case llvm::bitc::DEFINE_ABBREV:
1019 if (llvm::Error Err = Stream.ReadAbbrevRecord()) {
1021 consumeError(std::move(Err));
1024 case llvm::bitc::UNABBREV_RECORD:
1025 return Cursor::BadBlock;
1026 case llvm::bitc::FIRST_APPLICATION_ABBREV:
1027 llvm_unreachable(
"Unexpected abbrev id.");
1030 llvm_unreachable(
"Premature stream end.");
1033llvm::Error ClangDocBitcodeReader::validateStream() {
1034 if (Stream.AtEndOfStream())
1035 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1036 "premature end of stream");
1039 for (
int Idx = 0; Idx != 4; ++Idx) {
1040 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
1042 return MaybeRead.takeError();
1044 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1045 "invalid bitcode signature");
1047 return llvm::Error::success();
1050llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() {
1051 llvm::TimeTraceScope(
"Reducing infos",
"readBlockInfoBlock");
1052 Expected<std::optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo =
1053 Stream.ReadBlockInfoBlock();
1054 if (!MaybeBlockInfo)
1055 return MaybeBlockInfo.takeError();
1056 BlockInfo = MaybeBlockInfo.get();
1058 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1059 "unable to parse BlockInfoBlock");
1060 Stream.setBlockInfo(&*BlockInfo);
1061 return llvm::Error::success();
1064template <
typename T>
1065llvm::Expected<std::unique_ptr<Info>>
1066ClangDocBitcodeReader::createInfo(
unsigned ID) {
1067 llvm::TimeTraceScope(
"Reducing infos",
"createInfo");
1068 std::unique_ptr<Info> I = std::make_unique<T>();
1069 if (
auto Err = readBlock(ID,
static_cast<T *
>(I.get())))
1070 return std::move(Err);
1071 return std::unique_ptr<Info>{std::move(I)};
1074llvm::Expected<std::unique_ptr<Info>>
1075ClangDocBitcodeReader::readBlockToInfo(
unsigned ID) {
1076 llvm::TimeTraceScope(
"Reducing infos",
"readBlockToInfo");
1079 return createInfo<NamespaceInfo>(ID);
1081 return createInfo<RecordInfo>(ID);
1083 return createInfo<EnumInfo>(ID);
1085 return createInfo<TypedefInfo>(ID);
1087 return createInfo<ConceptInfo>(ID);
1089 return createInfo<FunctionInfo>(ID);
1091 return createInfo<VarInfo>(ID);
1093 return createInfo<FriendInfo>(ID);
1095 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1096 "cannot create info");
1101llvm::Expected<std::vector<std::unique_ptr<Info>>>
1103 std::vector<std::unique_ptr<Info>> Infos;
1104 if (
auto Err = validateStream())
1105 return std::move(Err);
1108 while (!Stream.AtEndOfStream()) {
1109 Expected<unsigned> MaybeCode = Stream.ReadCode();
1111 return MaybeCode.takeError();
1112 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK)
1113 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1114 "no blocks in input");
1115 Expected<unsigned> MaybeID = Stream.ReadSubBlockID();
1117 return MaybeID.takeError();
1118 unsigned ID = MaybeID.get();
1126 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1127 "invalid top level block");
1136 auto InfoOrErr = readBlockToInfo(ID);
1138 return InfoOrErr.takeError();
1139 Infos.emplace_back(std::move(InfoOrErr.get()));
1144 return std::move(Err);
1146 case llvm::bitc::BLOCKINFO_BLOCK_ID:
1147 if (
auto Err = readBlockInfoBlock())
1148 return std::move(Err);
1151 if (llvm::Error Err = Stream.SkipBlock()) {
1153 consumeError(std::move(Err));
1158 return std::move(Infos);