10#include "llvm/ADT/IndexedMap.h"
11#include "llvm/Support/Error.h"
12#include "llvm/Support/raw_ostream.h"
18using Record = llvm::SmallVector<uint64_t, 1024>;
22 llvm::StringRef Blob) {
23 Field.assign(Blob.begin(), Blob.end());
24 return llvm::Error::success();
28 llvm::StringRef Blob) {
30 return llvm::createStringError(llvm::inconvertibleErrorCode(),
31 "incorrect USR size");
35 for (
int I = 0,
E = R[0]; I <
E; ++I)
37 return llvm::Error::success();
42 return llvm::Error::success();
47 return llvm::createStringError(llvm::inconvertibleErrorCode(),
48 "integer too large to parse");
50 return llvm::Error::success();
54 llvm::StringRef Blob) {
60 Field = (AccessSpecifier)R[0];
61 return llvm::Error::success();
63 return llvm::createStringError(llvm::inconvertibleErrorCode(),
64 "invalid value for AccessSpecifier");
69 llvm::StringRef Blob) {
76 Field = (TagTypeKind)R[0];
77 return llvm::Error::success();
79 return llvm::createStringError(llvm::inconvertibleErrorCode(),
80 "invalid value for TagTypeKind");
85 llvm::StringRef Blob) {
87 return llvm::createStringError(llvm::inconvertibleErrorCode(),
88 "integer too large to parse");
89 Field.emplace((
int)R[0], Blob, (
bool)R[1]);
90 return llvm::Error::success();
94 llvm::StringRef Blob) {
95 switch (
auto IT =
static_cast<InfoType>(R[0])) {
103 return llvm::Error::success();
105 return llvm::createStringError(llvm::inconvertibleErrorCode(),
106 "invalid value for InfoType");
110 llvm::StringRef Blob) {
111 switch (
auto F =
static_cast<FieldId>(R[0])) {
120 return llvm::Error::success();
122 return llvm::createStringError(llvm::inconvertibleErrorCode(),
123 "invalid value for FieldId");
128 llvm::StringRef Blob) {
129 Field.push_back(Blob);
130 return llvm::Error::success();
135 llvm::StringRef Blob) {
137 return llvm::createStringError(llvm::inconvertibleErrorCode(),
138 "integer too large to parse");
139 Field.emplace_back((
int)R[0], Blob, (
bool)R[1]);
140 return llvm::Error::success();
144 const unsigned 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");
184 return llvm::createStringError(llvm::inconvertibleErrorCode(),
185 "invalid field for RecordInfo");
207 return llvm::createStringError(llvm::inconvertibleErrorCode(),
208 "invalid field for BaseRecordInfo");
226 return llvm::createStringError(llvm::inconvertibleErrorCode(),
227 "invalid field for EnumInfo");
243 return llvm::createStringError(llvm::inconvertibleErrorCode(),
244 "invalid field for TypedefInfo");
258 return llvm::createStringError(llvm::inconvertibleErrorCode(),
259 "invalid field for EnumValueInfo");
279 return llvm::createStringError(llvm::inconvertibleErrorCode(),
280 "invalid field for FunctionInfo");
286 return llvm::Error::success();
297 return llvm::createStringError(llvm::inconvertibleErrorCode(),
298 "invalid field for TypeInfo");
310 return llvm::createStringError(llvm::inconvertibleErrorCode(),
311 "invalid field for MemberTypeInfo");
341 return llvm::createStringError(llvm::inconvertibleErrorCode(),
342 "invalid field for CommentInfo");
362 return llvm::createStringError(llvm::inconvertibleErrorCode(),
363 "invalid field for Reference");
370 return llvm::createStringError(llvm::inconvertibleErrorCode(),
371 "invalid field for TemplateParamInfo");
378 return llvm::createStringError(llvm::inconvertibleErrorCode(),
379 "invalid field for TemplateParamInfo");
386 return llvm::createStringError(llvm::inconvertibleErrorCode(),
387 "invalid field for TemplateParamInfo");
391 return llvm::createStringError(llvm::inconvertibleErrorCode(),
392 "invalid type cannot contain CommentInfo");
420 I->
Children.emplace_back(std::make_unique<CommentInfo>());
432template <
typename T,
typename TTypeInfo>
434 return llvm::createStringError(llvm::inconvertibleErrorCode(),
435 "invalid type cannot contain TypeInfo");
439 I->
Members.emplace_back(std::move(T));
440 return llvm::Error::success();
444 I->
Members.emplace_back(std::move(T));
445 return llvm::Error::success();
450 return llvm::Error::success();
454 I->
Params.emplace_back(std::move(T));
455 return llvm::Error::success();
460 return llvm::Error::success();
465 return llvm::Error::success();
469 return llvm::createStringError(llvm::inconvertibleErrorCode(),
470 "invalid type cannot contain Reference");
476 I->
Type = std::move(R);
477 return llvm::Error::success();
479 return llvm::createStringError(llvm::inconvertibleErrorCode(),
480 "invalid type cannot contain Reference");
488 I->
Type = std::move(R);
489 return llvm::Error::success();
491 return llvm::createStringError(llvm::inconvertibleErrorCode(),
492 "invalid type cannot contain Reference");
500 I->
Type = std::move(R);
501 return llvm::Error::success();
503 return llvm::createStringError(llvm::inconvertibleErrorCode(),
504 "invalid type cannot contain Reference");
512 return llvm::Error::success();
514 return llvm::createStringError(llvm::inconvertibleErrorCode(),
515 "invalid type cannot contain Reference");
523 return llvm::Error::success();
525 return llvm::createStringError(llvm::inconvertibleErrorCode(),
526 "invalid type cannot contain Reference");
535 return llvm::Error::success();
538 return llvm::Error::success();
541 return llvm::Error::success();
543 return llvm::createStringError(llvm::inconvertibleErrorCode(),
544 "invalid type cannot contain Reference");
553 return llvm::Error::success();
556 return llvm::Error::success();
558 return llvm::createStringError(llvm::inconvertibleErrorCode(),
559 "invalid type cannot contain Reference");
567 return llvm::Error::success();
569 I->
Parents.emplace_back(std::move(R));
570 return llvm::Error::success();
573 return llvm::Error::success();
576 return llvm::Error::success();
578 return llvm::createStringError(llvm::inconvertibleErrorCode(),
579 "invalid type cannot contain Reference");
583template <
typename T,
typename ChildInfoType>
585 llvm::errs() <<
"invalid child type for info";
613 I->
Members.emplace_back(std::move(R));
616 I->
Bases.emplace_back(std::move(R));
626 llvm::errs() <<
"invalid container for template parameter";
630 I->
Params.emplace_back(std::move(P));
634 I->
Params.emplace_back(std::move(P));
639 llvm::errs() <<
"invalid container for template info";
652 llvm::errs() <<
"invalid container for template specialization info";
663llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID, T I) {
665 llvm::StringRef Blob;
666 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(
ID, R, &Blob);
668 return MaybeRecID.takeError();
673llvm::Error ClangDocBitcodeReader::readRecord(
unsigned ID,
Reference *I) {
675 llvm::StringRef Blob;
676 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(
ID, R, &Blob);
678 return MaybeRecID.takeError();
679 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
684llvm::Error ClangDocBitcodeReader::readBlock(
unsigned ID, T I) {
685 if (llvm::Error Err = Stream.EnterSubBlock(
ID))
689 unsigned BlockOrCode = 0;
690 Cursor Res = skipUntilRecordOrBlock(BlockOrCode);
693 case Cursor::BadBlock:
694 return llvm::createStringError(llvm::inconvertibleErrorCode(),
696 case Cursor::BlockEnd:
697 return llvm::Error::success();
698 case Cursor::BlockBegin:
699 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
700 if (llvm::Error Skipped = Stream.SkipBlock())
701 return joinErrors(std::move(Err), std::move(Skipped));
708 if (
auto Err = readRecord(BlockOrCode, I))
714llvm::Error ClangDocBitcodeReader::readSubBlock(
unsigned ID, T I) {
720 return Comment.takeError();
721 if (
auto Err = readBlock(
ID, Comment.get()))
723 return llvm::Error::success();
727 if (
auto Err = readBlock(
ID, &TI))
731 return llvm::Error::success();
735 if (
auto Err = readBlock(
ID, &TI))
739 return llvm::Error::success();
743 if (
auto Err = readBlock(
ID, &TI))
747 return llvm::Error::success();
751 if (
auto Err = readBlock(
ID, &R))
753 if (
auto Err =
addReference(I, std::move(R), CurrentReferenceField))
755 return llvm::Error::success();
759 if (
auto Err = readBlock(
ID, &F))
762 return llvm::Error::success();
766 if (
auto Err = readBlock(
ID, &BR))
769 return llvm::Error::success();
773 if (
auto Err = readBlock(
ID, &
E))
776 return llvm::Error::success();
780 if (
auto Err = readBlock(
ID, &EV))
783 return llvm::Error::success();
787 if (
auto Err = readBlock(
ID, &TI))
790 return llvm::Error::success();
793 TemplateSpecializationInfo TSI;
794 if (
auto Err = readBlock(
ID, &TSI))
797 return llvm::Error::success();
800 TemplateParamInfo TPI;
801 if (
auto Err = readBlock(
ID, &TPI))
804 return llvm::Error::success();
808 if (
auto Err = readBlock(
ID, &TI))
811 return llvm::Error::success();
814 return llvm::createStringError(llvm::inconvertibleErrorCode(),
815 "invalid subblock type");
819ClangDocBitcodeReader::Cursor
820ClangDocBitcodeReader::skipUntilRecordOrBlock(
unsigned &BlockOrRecordID) {
823 while (!Stream.AtEndOfStream()) {
824 Expected<unsigned> MaybeCode = Stream.ReadCode();
827 consumeError(MaybeCode.takeError());
828 return Cursor::BadBlock;
831 unsigned Code = MaybeCode.get();
832 if (
Code >=
static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
833 BlockOrRecordID =
Code;
834 return Cursor::Record;
836 switch (
static_cast<llvm::bitc::FixedAbbrevIDs
>(
Code)) {
837 case llvm::bitc::ENTER_SUBBLOCK:
838 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
839 BlockOrRecordID = MaybeID.get();
842 consumeError(MaybeID.takeError());
844 return Cursor::BlockBegin;
845 case llvm::bitc::END_BLOCK:
846 if (Stream.ReadBlockEnd())
847 return Cursor::BadBlock;
848 return Cursor::BlockEnd;
849 case llvm::bitc::DEFINE_ABBREV:
850 if (llvm::Error Err = Stream.ReadAbbrevRecord()) {
852 consumeError(std::move(Err));
855 case llvm::bitc::UNABBREV_RECORD:
856 return Cursor::BadBlock;
857 case llvm::bitc::FIRST_APPLICATION_ABBREV:
858 llvm_unreachable(
"Unexpected abbrev id.");
861 llvm_unreachable(
"Premature stream end.");
864llvm::Error ClangDocBitcodeReader::validateStream() {
865 if (Stream.AtEndOfStream())
866 return llvm::createStringError(llvm::inconvertibleErrorCode(),
867 "premature end of stream");
870 for (
int Idx = 0; Idx != 4; ++Idx) {
871 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
873 return MaybeRead.takeError();
875 return llvm::createStringError(llvm::inconvertibleErrorCode(),
876 "invalid bitcode signature");
878 return llvm::Error::success();
881llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() {
882 Expected<std::optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo =
883 Stream.ReadBlockInfoBlock();
885 return MaybeBlockInfo.takeError();
887 BlockInfo = MaybeBlockInfo.get();
889 return llvm::createStringError(llvm::inconvertibleErrorCode(),
890 "unable to parse BlockInfoBlock");
891 Stream.setBlockInfo(&*BlockInfo);
892 return llvm::Error::success();
896llvm::Expected<std::unique_ptr<Info>>
897ClangDocBitcodeReader::createInfo(
unsigned ID) {
898 std::unique_ptr<Info> I = std::make_unique<T>();
899 if (
auto Err = readBlock(
ID,
static_cast<T *
>(I.get())))
900 return std::move(Err);
901 return std::unique_ptr<Info>{std::move(I)};
904llvm::Expected<std::unique_ptr<Info>>
905ClangDocBitcodeReader::readBlockToInfo(
unsigned ID) {
908 return createInfo<NamespaceInfo>(
ID);
910 return createInfo<RecordInfo>(
ID);
912 return createInfo<EnumInfo>(
ID);
914 return createInfo<TypedefInfo>(
ID);
916 return createInfo<FunctionInfo>(
ID);
918 return llvm::createStringError(llvm::inconvertibleErrorCode(),
919 "cannot create info");
924llvm::Expected<std::vector<std::unique_ptr<Info>>>
926 std::vector<std::unique_ptr<Info>> Infos;
927 if (
auto Err = validateStream())
928 return std::move(Err);
931 while (!Stream.AtEndOfStream()) {
932 Expected<unsigned> MaybeCode = Stream.ReadCode();
934 return MaybeCode.takeError();
935 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK)
936 return llvm::createStringError(llvm::inconvertibleErrorCode(),
937 "no blocks in input");
938 Expected<unsigned> MaybeID = Stream.ReadSubBlockID();
940 return MaybeID.takeError();
941 unsigned ID = MaybeID.get();
949 return llvm::createStringError(llvm::inconvertibleErrorCode(),
950 "invalid top level block");
956 auto InfoOrErr = readBlockToInfo(
ID);
958 return InfoOrErr.takeError();
959 Infos.emplace_back(std::move(InfoOrErr.get()));
964 return std::move(Err);
966 case llvm::bitc::BLOCKINFO_BLOCK_ID:
967 if (
auto Err = readBlockInfoBlock())
968 return std::move(Err);
971 if (llvm::Error Err = Stream.SkipBlock()) {
973 consumeError(std::move(Err));
978 return std::move(Infos);
llvm::Expected< std::vector< std::unique_ptr< Info > > > readBitcode()
llvm::SmallVector< uint64_t, 1024 > Record
llvm::Error addReference(T I, Reference &&R, FieldId F)
void addTemplateSpecialization(T I, TemplateSpecializationInfo &&TSI)
void addTemplateParam(T I, TemplateParamInfo &&P)
@ TEMPLATE_SPECIALIZATION_OF
@ TEMPLATE_PARAM_CONTENTS
void addTemplate(T I, TemplateInfo &&P)
llvm::Expected< CommentInfo * > getCommentInfo(T I)
static const unsigned VersionNumber
llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, const unsigned VersionNo)
llvm::Error decodeRecord(const Record &R, llvm::SmallVectorImpl< char > &Field, llvm::StringRef Blob)
void addChild(T I, ChildInfoType &&R)
llvm::Error addTypeInfo(T I, TTypeInfo &&TI)
std::array< uint8_t, 20 > SymbolID
@ BI_TEMPLATE_SPECIALIZATION_BLOCK_ID
@ BI_TEMPLATE_PARAM_BLOCK_ID
@ BI_MEMBER_TYPE_BLOCK_ID
@ BI_BASE_RECORD_BLOCK_ID
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
static constexpr unsigned char Signature[4]
static constexpr int USRHashSize
llvm::SmallVector< EnumValueInfo, 4 > Members
std::optional< TypeInfo > BaseType
SmallString< 16 > ValueExpr
SmallString< 16 > DefaultValue
llvm::SmallVector< FieldTypeInfo, 4 > Params
std::optional< TemplateInfo > Template
std::vector< CommentInfo > Description
llvm::SmallString< 128 > Path
llvm::SmallVector< Reference, 4 > Namespace
std::vector< CommentInfo > Description
llvm::SmallVector< MemberTypeInfo, 4 > Members
std::optional< TemplateInfo > Template
llvm::SmallVector< Reference, 4 > VirtualParents
llvm::SmallVector< Reference, 4 > Parents
std::vector< BaseRecordInfo > Bases
SmallString< 16 > QualName
llvm::SmallString< 128 > Path
std::vector< Reference > Records
std::vector< TypedefInfo > Typedefs
std::vector< FunctionInfo > Functions
std::vector< Reference > Namespaces
std::vector< EnumInfo > Enums
llvm::SmallVector< Location, 2 > Loc
std::optional< Location > DefLoc
std::vector< TemplateParamInfo > Params
std::optional< TemplateSpecializationInfo > Specialization
SmallString< 16 > Contents
SymbolID SpecializationOf
std::vector< TemplateParamInfo > Params