llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra Author: Paul Kirth (ilovepi) <details> <summary>Changes</summary> We have three static data structures in the BitcodeWriter implementation that all use std::vector. Instead, we can make them constant arrays. These data structures and their types are also not in the anonymous namespace, so just move these helpers out of the clang::doc namespace and improve the hygiene since we're changing the code anyway. --- Full diff: https://github.com/llvm/llvm-project/pull/198066.diff 2 Files Affected: - (modified) clang-tools-extra/clang-doc/BitcodeWriter.cpp (+88-70) - (modified) clang-tools-extra/clang-doc/BitcodeWriter.h (+1-1) ``````````diff diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp b/clang-tools-extra/clang-doc/BitcodeWriter.cpp index f245bd27ebc44..91d855e8527d4 100644 --- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp +++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp @@ -10,6 +10,10 @@ #include "llvm/ADT/IndexedMap.h" #include <initializer_list> +using namespace clang; +using namespace clang::doc; +using namespace llvm; + namespace clang { namespace doc { @@ -91,18 +95,22 @@ static void genLocationAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abbrev) { llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)}); } -struct RecordIdDsc { - llvm::StringRef Name; - AbbrevDsc Abbrev = nullptr; +} // namespace doc +} // namespace clang +namespace { +struct RecordIdDsc { RecordIdDsc() = default; - RecordIdDsc(llvm::StringRef Name, AbbrevDsc Abbrev) + constexpr RecordIdDsc(StringRef Name, AbbrevDsc Abbrev) : Name(Name), Abbrev(Abbrev) {} // Is this 'description' valid? operator bool() const { return Abbrev != nullptr && Name.data() != nullptr && !Name.empty(); } + + StringRef Name; + AbbrevDsc Abbrev = nullptr; }; static const llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor> @@ -112,7 +120,7 @@ static const llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor> // There is no init-list constructor for the IndexedMap, so have to // improvise - static const std::vector<std::pair<BlockId, const char *const>> Inits = { + static constexpr std::pair<BlockId, StringRef> IdToName[] = { {BI_VERSION_BLOCK_ID, "VersionBlock"}, {BI_NAMESPACE_BLOCK_ID, "NamespaceBlock"}, {BI_ENUM_BLOCK_ID, "EnumBlock"}, @@ -133,6 +141,7 @@ static const llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor> {BI_CONCEPT_BLOCK_ID, "ConceptBlock"}, {BI_VAR_BLOCK_ID, "VarBlock"}, {BI_FRIEND_BLOCK_ID, "FriendBlock"}}; + ArrayRef<std::pair<BlockId, StringRef>> Inits(IdToName); assert(Inits.size() == BlockIdCount); for (const auto &Init : Inits) BlockIdNameMap[Init.first] = Init.second; @@ -147,7 +156,7 @@ static const llvm::IndexedMap<RecordIdDsc, RecordIdToIndexFunctor> // There is no init-list constructor for the IndexedMap, so have to // improvise - static const std::vector<std::pair<RecordId, RecordIdDsc>> Inits = { + static constexpr std::pair<RecordId, RecordIdDsc> IdToFunc[] = { {VERSION, {"Version", &genIntAbbrev}}, {COMMENT_KIND, {"Kind", &genStringAbbrev}}, {COMMENT_TEXT, {"Text", &genStringAbbrev}}, @@ -233,6 +242,7 @@ static const llvm::IndexedMap<RecordIdDsc, RecordIdToIndexFunctor> {VAR_IS_STATIC, {"IsStatic", &genBoolAbbrev}}, {FRIEND_IS_CLASS, {"IsClass", &genBoolAbbrev}}}; + ArrayRef<std::pair<RecordId, RecordIdDsc>> Inits(IdToFunc); assert(Inits.size() == RecordIdCount); for (const auto &Init : Inits) { RecordIdNameMap[Init.first] = Init.second; @@ -242,67 +252,75 @@ static const llvm::IndexedMap<RecordIdDsc, RecordIdToIndexFunctor> return RecordIdNameMap; }(); -static const std::vector<std::pair<BlockId, std::vector<RecordId>>> - RecordsByBlock{ - // Version Block - {BI_VERSION_BLOCK_ID, {VERSION}}, - // Comment Block - {BI_COMMENT_BLOCK_ID, - {COMMENT_KIND, COMMENT_TEXT, COMMENT_NAME, COMMENT_DIRECTION, - COMMENT_PARAMNAME, COMMENT_CLOSENAME, COMMENT_SELFCLOSING, - COMMENT_EXPLICIT, COMMENT_ATTRKEY, COMMENT_ATTRVAL, COMMENT_ARG}}, - // Type Block - {BI_TYPE_BLOCK_ID, {TYPE_IS_BUILTIN, TYPE_IS_TEMPLATE}}, - // FieldType Block - {BI_FIELD_TYPE_BLOCK_ID, - {FIELD_TYPE_NAME, FIELD_DEFAULT_VALUE, FIELD_TYPE_IS_BUILTIN, - FIELD_TYPE_IS_TEMPLATE}}, - // MemberType Block - {BI_MEMBER_TYPE_BLOCK_ID, - {MEMBER_TYPE_NAME, MEMBER_TYPE_ACCESS, MEMBER_TYPE_IS_STATIC, - MEMBER_TYPE_IS_BUILTIN, MEMBER_TYPE_IS_TEMPLATE}}, - // Enum Block - {BI_ENUM_BLOCK_ID, - {ENUM_USR, ENUM_NAME, ENUM_DEFLOCATION, ENUM_LOCATION, ENUM_SCOPED}}, - // Enum Value Block - {BI_ENUM_VALUE_BLOCK_ID, - {ENUM_VALUE_NAME, ENUM_VALUE_VALUE, ENUM_VALUE_EXPR}}, - // Typedef Block - {BI_TYPEDEF_BLOCK_ID, - {TYPEDEF_USR, TYPEDEF_NAME, TYPEDEF_DEFLOCATION, TYPEDEF_IS_USING}}, - // Namespace Block - {BI_NAMESPACE_BLOCK_ID, - {NAMESPACE_USR, NAMESPACE_NAME, NAMESPACE_PATH, NAMESPACE_PARENT_USR}}, - // Record Block - {BI_RECORD_BLOCK_ID, - {RECORD_USR, RECORD_NAME, RECORD_PATH, RECORD_DEFLOCATION, - RECORD_LOCATION, RECORD_TAG_TYPE, RECORD_IS_TYPE_DEF, - RECORD_MANGLED_NAME, RECORD_PARENT_USR}}, - // BaseRecord Block - {BI_BASE_RECORD_BLOCK_ID, - {BASE_RECORD_USR, BASE_RECORD_NAME, BASE_RECORD_PATH, - BASE_RECORD_TAG_TYPE, BASE_RECORD_IS_VIRTUAL, BASE_RECORD_ACCESS, - BASE_RECORD_IS_PARENT}}, - // Function Block - {BI_FUNCTION_BLOCK_ID, - {FUNCTION_USR, FUNCTION_NAME, FUNCTION_DEFLOCATION, FUNCTION_LOCATION, - FUNCTION_ACCESS, FUNCTION_IS_METHOD, FUNCTION_IS_STATIC}}, - // Reference Block - {BI_REFERENCE_BLOCK_ID, - {REFERENCE_USR, REFERENCE_NAME, REFERENCE_QUAL_NAME, REFERENCE_TYPE, - REFERENCE_PATH, REFERENCE_FIELD, REFERENCE_FILE}}, - // Template Blocks. - {BI_TEMPLATE_BLOCK_ID, {}}, - {BI_TEMPLATE_PARAM_BLOCK_ID, {TEMPLATE_PARAM_CONTENTS}}, - {BI_TEMPLATE_SPECIALIZATION_BLOCK_ID, {TEMPLATE_SPECIALIZATION_OF}}, - // Concept Block - {BI_CONCEPT_BLOCK_ID, - {CONCEPT_USR, CONCEPT_NAME, CONCEPT_IS_TYPE, - CONCEPT_CONSTRAINT_EXPRESSION, CONCEPT_DEFLOCATION}}, - // Constraint Block - {BI_CONSTRAINT_BLOCK_ID, {CONSTRAINT_EXPRESSION}}, - {BI_VAR_BLOCK_ID, {VAR_NAME, VAR_USR, VAR_DEFLOCATION, VAR_IS_STATIC}}, - {BI_FRIEND_BLOCK_ID, {FRIEND_IS_CLASS}}}; +struct BlockToIdList { + BlockId BID; + std::initializer_list<RecordId> RIDs; +}; + +static constexpr BlockToIdList RecordsByBlock[] = { + // Version Block + {BI_VERSION_BLOCK_ID, {VERSION}}, + // Comment Block + {BI_COMMENT_BLOCK_ID, + {COMMENT_KIND, COMMENT_TEXT, COMMENT_NAME, COMMENT_DIRECTION, + COMMENT_PARAMNAME, COMMENT_CLOSENAME, COMMENT_SELFCLOSING, + COMMENT_EXPLICIT, COMMENT_ATTRKEY, COMMENT_ATTRVAL, COMMENT_ARG}}, + // Type Block + {BI_TYPE_BLOCK_ID, {TYPE_IS_BUILTIN, TYPE_IS_TEMPLATE}}, + // FieldType Block + {BI_FIELD_TYPE_BLOCK_ID, + {FIELD_TYPE_NAME, FIELD_DEFAULT_VALUE, FIELD_TYPE_IS_BUILTIN, + FIELD_TYPE_IS_TEMPLATE}}, + // MemberType Block + {BI_MEMBER_TYPE_BLOCK_ID, + {MEMBER_TYPE_NAME, MEMBER_TYPE_ACCESS, MEMBER_TYPE_IS_STATIC, + MEMBER_TYPE_IS_BUILTIN, MEMBER_TYPE_IS_TEMPLATE}}, + // Enum Block + {BI_ENUM_BLOCK_ID, + {ENUM_USR, ENUM_NAME, ENUM_DEFLOCATION, ENUM_LOCATION, ENUM_SCOPED}}, + // Enum Value Block + {BI_ENUM_VALUE_BLOCK_ID, + {ENUM_VALUE_NAME, ENUM_VALUE_VALUE, ENUM_VALUE_EXPR}}, + // Typedef Block + {BI_TYPEDEF_BLOCK_ID, + {TYPEDEF_USR, TYPEDEF_NAME, TYPEDEF_DEFLOCATION, TYPEDEF_IS_USING}}, + // Namespace Block + {BI_NAMESPACE_BLOCK_ID, + {NAMESPACE_USR, NAMESPACE_NAME, NAMESPACE_PATH, NAMESPACE_PARENT_USR}}, + // Record Block + {BI_RECORD_BLOCK_ID, + {RECORD_USR, RECORD_NAME, RECORD_PATH, RECORD_DEFLOCATION, RECORD_LOCATION, + RECORD_TAG_TYPE, RECORD_IS_TYPE_DEF, RECORD_MANGLED_NAME, + RECORD_PARENT_USR}}, + // BaseRecord Block + {BI_BASE_RECORD_BLOCK_ID, + {BASE_RECORD_USR, BASE_RECORD_NAME, BASE_RECORD_PATH, BASE_RECORD_TAG_TYPE, + BASE_RECORD_IS_VIRTUAL, BASE_RECORD_ACCESS, BASE_RECORD_IS_PARENT}}, + // Function Block + {BI_FUNCTION_BLOCK_ID, + {FUNCTION_USR, FUNCTION_NAME, FUNCTION_DEFLOCATION, FUNCTION_LOCATION, + FUNCTION_ACCESS, FUNCTION_IS_METHOD, FUNCTION_IS_STATIC}}, + // Reference Block + {BI_REFERENCE_BLOCK_ID, + {REFERENCE_USR, REFERENCE_NAME, REFERENCE_QUAL_NAME, REFERENCE_TYPE, + REFERENCE_PATH, REFERENCE_FIELD, REFERENCE_FILE}}, + // Template Blocks. + {BI_TEMPLATE_BLOCK_ID, {}}, + {BI_TEMPLATE_PARAM_BLOCK_ID, {TEMPLATE_PARAM_CONTENTS}}, + {BI_TEMPLATE_SPECIALIZATION_BLOCK_ID, {TEMPLATE_SPECIALIZATION_OF}}, + // Concept Block + {BI_CONCEPT_BLOCK_ID, + {CONCEPT_USR, CONCEPT_NAME, CONCEPT_IS_TYPE, CONCEPT_CONSTRAINT_EXPRESSION, + CONCEPT_DEFLOCATION}}, + // Constraint Block + {BI_CONSTRAINT_BLOCK_ID, {CONSTRAINT_EXPRESSION}}, + {BI_VAR_BLOCK_ID, {VAR_NAME, VAR_USR, VAR_DEFLOCATION, VAR_IS_STATIC}}, + {BI_FRIEND_BLOCK_ID, {FRIEND_IS_CLASS}}}; + +} // namespace + +namespace clang { +namespace doc { // AbbreviationMap @@ -453,14 +471,14 @@ bool ClangDocBitcodeWriter::prepRecordData(RecordId ID, bool ShouldEmit) { void ClangDocBitcodeWriter::emitBlockInfoBlock() { Stream.EnterBlockInfoBlock(); for (const auto &Block : RecordsByBlock) { - assert(Block.second.size() < (1U << BitCodeConstants::SubblockIDSize)); - emitBlockInfo(Block.first, Block.second); + assert(Block.RIDs.size() < (1U << BitCodeConstants::SubblockIDSize)); + emitBlockInfo(Block.BID, Block.RIDs); } Stream.ExitBlock(); } void ClangDocBitcodeWriter::emitBlockInfo(BlockId BID, - const std::vector<RecordId> &RIDs) { + ArrayRef<RecordId> RIDs) { assert(RIDs.size() < (1U << BitCodeConstants::SubblockIDSize)); emitBlockID(BID); for (RecordId RID : RIDs) { diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.h b/clang-tools-extra/clang-doc/BitcodeWriter.h index 30106ceb3c206..e3459850eab90 100644 --- a/clang-tools-extra/clang-doc/BitcodeWriter.h +++ b/clang-tools-extra/clang-doc/BitcodeWriter.h @@ -244,7 +244,7 @@ class ClangDocBitcodeWriter { void emitRecordID(RecordId ID); void emitBlockID(BlockId ID); void emitBlockInfoBlock(); - void emitBlockInfo(BlockId BID, const std::vector<RecordId> &RIDs); + void emitBlockInfo(BlockId BID, llvm::ArrayRef<RecordId> RIDs); // Emission of individual record types. void emitRecord(StringRef Str, RecordId ID); `````````` </details> https://github.com/llvm/llvm-project/pull/198066 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
