diff options
| author | Julie Hockett <juliehockett@google.com> | 2018-05-04 17:02:13 +0000 |
|---|---|---|
| committer | Julie Hockett <juliehockett@google.com> | 2018-05-04 17:02:13 +0000 |
| commit | b59cd77c87d825fd1086eb6eba30473a11dd16bd (patch) | |
| tree | 0a59bd11c241f0e1eea626109d8d75d7325469de /clang-tools-extra/clang-doc/BitcodeWriter.cpp | |
| parent | e5ad31d3766e1d9166578d3b7c998a585ee528fc (diff) | |
[clang-doc] Attaching a name to reference data
This adds the name of the referenced decl, in addition to its USR, to
the saved data, so that the backend can look at an info in isolation and
still be able to construct a human-readable name for it.
Differential Revision: https://reviews.llvm.org/D46281
llvm-svn: 331539
Diffstat (limited to 'clang-tools-extra/clang-doc/BitcodeWriter.cpp')
| -rw-r--r-- | clang-tools-extra/clang-doc/BitcodeWriter.cpp | 109 |
1 files changed, 42 insertions, 67 deletions
diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp b/clang-tools-extra/clang-doc/BitcodeWriter.cpp index a6c9a41c2f7e..c133d9a67d53 100644 --- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp +++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp @@ -14,6 +14,9 @@ namespace clang { namespace doc { +// Empty SymbolID for comparison, so we don't have to construct one every time. +static const SymbolID EmptySID = SymbolID(); + // Since id enums are not zero-indexed, we need to transform the given id into // its associated index. struct BlockIdToIndexFunctor { @@ -82,18 +85,6 @@ static void LocationAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev) { llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)}); } -static void ReferenceAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev) { - AbbrevGen(Abbrev, - {// 0. Fixed-size integer (ref type) - llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed, - BitCodeConstants::ReferenceTypeSize), - // 1. Fixed-size integer (length of the USR or UnresolvedName) - llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Fixed, - BitCodeConstants::StringLengthSize), - // 2. The string blob - llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)}); -} - struct RecordIdDsc { llvm::StringRef Name; AbbrevDsc Abbrev = nullptr; @@ -124,7 +115,8 @@ static const llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor> {BI_MEMBER_TYPE_BLOCK_ID, "MemberTypeBlock"}, {BI_RECORD_BLOCK_ID, "RecordBlock"}, {BI_FUNCTION_BLOCK_ID, "FunctionBlock"}, - {BI_COMMENT_BLOCK_ID, "CommentBlock"}}; + {BI_COMMENT_BLOCK_ID, "CommentBlock"}, + {BI_REFERENCE_BLOCK_ID, "ReferenceBlock"}}; assert(Inits.size() == BlockIdCount); for (const auto &Init : Inits) BlockIdNameMap[Init.first] = Init.second; @@ -152,38 +144,32 @@ static const llvm::IndexedMap<RecordIdDsc, RecordIdToIndexFunctor> {COMMENT_ATTRKEY, {"AttrKey", &StringAbbrev}}, {COMMENT_ATTRVAL, {"AttrVal", &StringAbbrev}}, {COMMENT_ARG, {"Arg", &StringAbbrev}}, - {TYPE_REF, {"Type", &ReferenceAbbrev}}, - {FIELD_TYPE_REF, {"Type", &ReferenceAbbrev}}, {FIELD_TYPE_NAME, {"Name", &StringAbbrev}}, - {MEMBER_TYPE_REF, {"Type", &ReferenceAbbrev}}, {MEMBER_TYPE_NAME, {"Name", &StringAbbrev}}, {MEMBER_TYPE_ACCESS, {"Access", &IntAbbrev}}, {NAMESPACE_USR, {"USR", &SymbolIDAbbrev}}, {NAMESPACE_NAME, {"Name", &StringAbbrev}}, - {NAMESPACE_NAMESPACE, {"Namespace", &ReferenceAbbrev}}, {ENUM_USR, {"USR", &SymbolIDAbbrev}}, {ENUM_NAME, {"Name", &StringAbbrev}}, - {ENUM_NAMESPACE, {"Namespace", &ReferenceAbbrev}}, {ENUM_DEFLOCATION, {"DefLocation", &LocationAbbrev}}, {ENUM_LOCATION, {"Location", &LocationAbbrev}}, {ENUM_MEMBER, {"Member", &StringAbbrev}}, {ENUM_SCOPED, {"Scoped", &BoolAbbrev}}, {RECORD_USR, {"USR", &SymbolIDAbbrev}}, {RECORD_NAME, {"Name", &StringAbbrev}}, - {RECORD_NAMESPACE, {"Namespace", &ReferenceAbbrev}}, {RECORD_DEFLOCATION, {"DefLocation", &LocationAbbrev}}, {RECORD_LOCATION, {"Location", &LocationAbbrev}}, {RECORD_TAG_TYPE, {"TagType", &IntAbbrev}}, - {RECORD_PARENT, {"Parent", &ReferenceAbbrev}}, - {RECORD_VPARENT, {"VParent", &ReferenceAbbrev}}, {FUNCTION_USR, {"USR", &SymbolIDAbbrev}}, {FUNCTION_NAME, {"Name", &StringAbbrev}}, - {FUNCTION_NAMESPACE, {"Namespace", &ReferenceAbbrev}}, {FUNCTION_DEFLOCATION, {"DefLocation", &LocationAbbrev}}, {FUNCTION_LOCATION, {"Location", &LocationAbbrev}}, - {FUNCTION_PARENT, {"Parent", &ReferenceAbbrev}}, {FUNCTION_ACCESS, {"Access", &IntAbbrev}}, - {FUNCTION_IS_METHOD, {"IsMethod", &BoolAbbrev}}}; + {FUNCTION_IS_METHOD, {"IsMethod", &BoolAbbrev}}, + {REFERENCE_USR, {"USR", &SymbolIDAbbrev}}, + {REFERENCE_NAME, {"Name", &StringAbbrev}}, + {REFERENCE_TYPE, {"RefType", &IntAbbrev}}, + {REFERENCE_FIELD, {"Field", &IntAbbrev}}}; assert(Inits.size() == RecordIdCount); for (const auto &Init : Inits) { RecordIdNameMap[Init.first] = Init.second; @@ -203,28 +189,28 @@ static const std::vector<std::pair<BlockId, std::vector<RecordId>>> COMMENT_PARAMNAME, COMMENT_CLOSENAME, COMMENT_SELFCLOSING, COMMENT_EXPLICIT, COMMENT_ATTRKEY, COMMENT_ATTRVAL, COMMENT_ARG}}, // Type Block - {BI_TYPE_BLOCK_ID, {TYPE_REF}}, + {BI_TYPE_BLOCK_ID, {}}, // FieldType Block - {BI_FIELD_TYPE_BLOCK_ID, {FIELD_TYPE_REF, FIELD_TYPE_NAME}}, + {BI_FIELD_TYPE_BLOCK_ID, {FIELD_TYPE_NAME}}, // MemberType Block - {BI_MEMBER_TYPE_BLOCK_ID, - {MEMBER_TYPE_REF, MEMBER_TYPE_NAME, MEMBER_TYPE_ACCESS}}, + {BI_MEMBER_TYPE_BLOCK_ID, {MEMBER_TYPE_NAME, MEMBER_TYPE_ACCESS}}, // Enum Block {BI_ENUM_BLOCK_ID, - {ENUM_USR, ENUM_NAME, ENUM_NAMESPACE, ENUM_DEFLOCATION, ENUM_LOCATION, - ENUM_MEMBER, ENUM_SCOPED}}, + {ENUM_USR, ENUM_NAME, ENUM_DEFLOCATION, ENUM_LOCATION, ENUM_MEMBER, + ENUM_SCOPED}}, // Namespace Block - {BI_NAMESPACE_BLOCK_ID, - {NAMESPACE_USR, NAMESPACE_NAME, NAMESPACE_NAMESPACE}}, + {BI_NAMESPACE_BLOCK_ID, {NAMESPACE_USR, NAMESPACE_NAME}}, // Record Block {BI_RECORD_BLOCK_ID, - {RECORD_USR, RECORD_NAME, RECORD_NAMESPACE, RECORD_DEFLOCATION, - RECORD_LOCATION, RECORD_TAG_TYPE, RECORD_PARENT, RECORD_VPARENT}}, + {RECORD_USR, RECORD_NAME, RECORD_DEFLOCATION, RECORD_LOCATION, + RECORD_TAG_TYPE}}, // Function Block {BI_FUNCTION_BLOCK_ID, - {FUNCTION_USR, FUNCTION_NAME, FUNCTION_NAMESPACE, FUNCTION_DEFLOCATION, - FUNCTION_LOCATION, FUNCTION_PARENT, FUNCTION_ACCESS, - FUNCTION_IS_METHOD}}}; + {FUNCTION_USR, FUNCTION_NAME, FUNCTION_DEFLOCATION, FUNCTION_LOCATION, + FUNCTION_ACCESS, FUNCTION_IS_METHOD}}, + // Reference Block + {BI_REFERENCE_BLOCK_ID, + {REFERENCE_USR, REFERENCE_NAME, REFERENCE_TYPE, REFERENCE_FIELD}}}; // AbbreviationMap @@ -293,7 +279,7 @@ void ClangDocBitcodeWriter::emitRecord(const SymbolID &Sym, RecordId ID) { assert(RecordIdNameMap[ID] && "Unknown RecordId."); assert(RecordIdNameMap[ID].Abbrev == &SymbolIDAbbrev && "Abbrev type mismatch."); - if (!prepRecordData(ID, !Sym.empty())) + if (!prepRecordData(ID, Sym != EmptySID)) return; assert(Sym.size() == 20); Record.push_back(Sym.size()); @@ -327,26 +313,6 @@ void ClangDocBitcodeWriter::emitRecord(const Location &Loc, RecordId ID) { Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, "test"); } -void ClangDocBitcodeWriter::emitRecord(const Reference &Ref, RecordId ID) { - assert(RecordIdNameMap[ID] && "Unknown RecordId."); - assert(RecordIdNameMap[ID].Abbrev == &ReferenceAbbrev && - "Abbrev type mismatch."); - SmallString<40> StringUSR; - StringRef OutString; - if (Ref.RefType == InfoType::IT_default) - OutString = Ref.UnresolvedName; - else { - StringUSR = llvm::toHex(llvm::toStringRef(Ref.USR)); - OutString = StringUSR; - } - if (!prepRecordData(ID, !OutString.empty())) - return; - assert(OutString.size() < (1U << BitCodeConstants::StringLengthSize)); - Record.push_back((int)Ref.RefType); - Record.push_back(OutString.size()); - Stream.EmitRecordWithBlob(Abbrevs.get(ID), Record, OutString); -} - void ClangDocBitcodeWriter::emitRecord(bool Val, RecordId ID) { assert(RecordIdNameMap[ID] && "Unknown RecordId."); assert(RecordIdNameMap[ID].Abbrev == &BoolAbbrev && "Abbrev type mismatch."); @@ -408,28 +374,37 @@ void ClangDocBitcodeWriter::emitBlockInfo(BlockId BID, // Block emission +void ClangDocBitcodeWriter::emitBlock(const Reference &R, FieldId Field) { + if (R.USR == EmptySID && R.Name.empty()) + return; + StreamSubBlockGuard Block(Stream, BI_REFERENCE_BLOCK_ID); + emitRecord(R.USR, REFERENCE_USR); + emitRecord(R.Name, REFERENCE_NAME); + emitRecord((unsigned)R.RefType, REFERENCE_TYPE); + emitRecord((unsigned)Field, REFERENCE_FIELD); +} + void ClangDocBitcodeWriter::emitBlock(const TypeInfo &T) { StreamSubBlockGuard Block(Stream, BI_TYPE_BLOCK_ID); - emitRecord(T.Type, TYPE_REF); + emitBlock(T.Type, FieldId::F_type); } void ClangDocBitcodeWriter::emitBlock(const FieldTypeInfo &T) { StreamSubBlockGuard Block(Stream, BI_FIELD_TYPE_BLOCK_ID); - emitRecord(T.Type, FIELD_TYPE_REF); + emitBlock(T.Type, FieldId::F_type); emitRecord(T.Name, FIELD_TYPE_NAME); } void ClangDocBitcodeWriter::emitBlock(const MemberTypeInfo &T) { StreamSubBlockGuard Block(Stream, BI_MEMBER_TYPE_BLOCK_ID); - emitRecord(T.Type, MEMBER_TYPE_REF); + emitBlock(T.Type, FieldId::F_type); emitRecord(T.Name, MEMBER_TYPE_NAME); emitRecord(T.Access, MEMBER_TYPE_ACCESS); } void ClangDocBitcodeWriter::emitBlock(const CommentInfo &I) { StreamSubBlockGuard Block(Stream, BI_COMMENT_BLOCK_ID); - for (const auto &L : - std::vector<std::pair<llvm::StringRef, RecordId>>{ + for (const auto &L : std::vector<std::pair<llvm::StringRef, RecordId>>{ {I.Kind, COMMENT_KIND}, {I.Text, COMMENT_TEXT}, {I.Name, COMMENT_NAME}, @@ -453,7 +428,7 @@ void ClangDocBitcodeWriter::emitBlock(const CommentInfo &I) { emitRecord(I.USR, X##_USR); \ emitRecord(I.Name, X##_NAME); \ for (const auto &N : I.Namespace) \ - emitRecord(N, X##_NAMESPACE); \ + emitBlock(N, FieldId::F_namespace); \ for (const auto &CI : I.Description) \ emitBlock(CI); @@ -485,9 +460,9 @@ void ClangDocBitcodeWriter::emitBlock(const RecordInfo &I) { for (const auto &N : I.Members) emitBlock(N); for (const auto &P : I.Parents) - emitRecord(P, RECORD_PARENT); + emitBlock(P, FieldId::F_parent); for (const auto &P : I.VirtualParents) - emitRecord(P, RECORD_VPARENT); + emitBlock(P, FieldId::F_vparent); } void ClangDocBitcodeWriter::emitBlock(const FunctionInfo &I) { @@ -498,7 +473,7 @@ void ClangDocBitcodeWriter::emitBlock(const FunctionInfo &I) { emitRecord(I.DefLoc.getValue(), FUNCTION_DEFLOCATION); for (const auto &L : I.Loc) emitRecord(L, FUNCTION_LOCATION); - emitRecord(I.Parent, FUNCTION_PARENT); + emitBlock(I.Parent, FieldId::F_parent); emitBlock(I.ReturnType); for (const auto &N : I.Params) emitBlock(N); |
