llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-risc-v Author: Rahul Joshi (jurahul) <details> <summary>Changes</summary> Migrate clang tablegen backends to use const RecordKeeper. --- Patch is 135.31 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/107533.diff 22 Files Affected: - (modified) clang/utils/TableGen/ASTTableGen.cpp (+6-6) - (modified) clang/utils/TableGen/ASTTableGen.h (+19-18) - (modified) clang/utils/TableGen/ClangASTNodesEmitter.cpp (+13-22) - (modified) clang/utils/TableGen/ClangASTPropertiesEmitter.cpp (+98-95) - (modified) clang/utils/TableGen/ClangAttrEmitter.cpp (+106-122) - (modified) clang/utils/TableGen/ClangBuiltinsEmitter.cpp (+5-4) - (modified) clang/utils/TableGen/ClangCommentCommandInfoEmitter.cpp (+9-12) - (modified) clang/utils/TableGen/ClangCommentHTMLNamedCharacterReferenceEmitter.cpp (+6-10) - (modified) clang/utils/TableGen/ClangCommentHTMLTagsEmitter.cpp (+5-6) - (modified) clang/utils/TableGen/ClangDataCollectorsEmitter.cpp (+1-1) - (modified) clang/utils/TableGen/ClangDiagnosticsEmitter.cpp (+66-67) - (modified) clang/utils/TableGen/ClangOpcodesEmitter.cpp (+4-4) - (modified) clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp (+31-34) - (modified) clang/utils/TableGen/ClangOptionDocEmitter.cpp (+23-23) - (modified) clang/utils/TableGen/ClangSACheckersEmitter.cpp (+5-4) - (modified) clang/utils/TableGen/ClangSyntaxEmitter.cpp (+6-5) - (modified) clang/utils/TableGen/ClangTypeNodesEmitter.cpp (+6-7) - (modified) clang/utils/TableGen/MveEmitter.cpp (+21-20) - (modified) clang/utils/TableGen/NeonEmitter.cpp (+18-23) - (modified) clang/utils/TableGen/RISCVVEmitter.cpp (+9-14) - (modified) clang/utils/TableGen/SveEmitter.cpp (+31-40) - (modified) clang/utils/TableGen/TableGenBackends.h (+119-90) ``````````diff diff --git a/clang/utils/TableGen/ASTTableGen.cpp b/clang/utils/TableGen/ASTTableGen.cpp index 54288ff6a03be3..482c9e318a12f3 100644 --- a/clang/utils/TableGen/ASTTableGen.cpp +++ b/clang/utils/TableGen/ASTTableGen.cpp @@ -31,7 +31,8 @@ llvm::StringRef clang::tblgen::HasProperties::getName() const { } } -static StringRef removeExpectedNodeNameSuffix(Record *node, StringRef suffix) { +static StringRef removeExpectedNodeNameSuffix(const Record *node, + StringRef suffix) { StringRef nodeName = node->getName(); if (!nodeName.ends_with(suffix)) { PrintFatalError(node->getLoc(), @@ -105,8 +106,7 @@ static void visitASTNodeRecursive(ASTNode node, ASTNode base, } } -static void visitHierarchy(RecordKeeper &records, - StringRef nodeClassName, +static void visitHierarchy(const RecordKeeper &records, StringRef nodeClassName, ASTNodeHierarchyVisitor<ASTNode> visit) { // Check for the node class, just as a basic correctness check. if (!records.getClass(nodeClassName)) { @@ -136,8 +136,8 @@ static void visitHierarchy(RecordKeeper &records, visitASTNodeRecursive(root, ASTNode(), hierarchy, visit); } -void clang::tblgen::visitASTNodeHierarchyImpl(RecordKeeper &records, - StringRef nodeClassName, - ASTNodeHierarchyVisitor<ASTNode> visit) { +void clang::tblgen::visitASTNodeHierarchyImpl( + const RecordKeeper &records, StringRef nodeClassName, + ASTNodeHierarchyVisitor<ASTNode> visit) { visitHierarchy(records, nodeClassName, visit); } diff --git a/clang/utils/TableGen/ASTTableGen.h b/clang/utils/TableGen/ASTTableGen.h index 41f78a6a3bbcdd..143d779a8a64f8 100644 --- a/clang/utils/TableGen/ASTTableGen.h +++ b/clang/utils/TableGen/ASTTableGen.h @@ -87,18 +87,18 @@ namespace clang { namespace tblgen { class WrappedRecord { - llvm::Record *Record; + const llvm::Record *Record; protected: - WrappedRecord(llvm::Record *record = nullptr) : Record(record) {} + WrappedRecord(const llvm::Record *record = nullptr) : Record(record) {} - llvm::Record *get() const { + const llvm::Record *get() const { assert(Record && "accessing null record"); return Record; } public: - llvm::Record *getRecord() const { return Record; } + const llvm::Record *getRecord() const { return Record; } explicit operator bool() const { return Record != nullptr; } @@ -144,7 +144,7 @@ class HasProperties : public WrappedRecord { public: static constexpr llvm::StringRef ClassName = HasPropertiesClassName; - HasProperties(llvm::Record *record = nullptr) : WrappedRecord(record) {} + HasProperties(const llvm::Record *record = nullptr) : WrappedRecord(record) {} llvm::StringRef getName() const; @@ -157,7 +157,7 @@ class HasProperties : public WrappedRecord { /// in one of Clang's AST hierarchies. class ASTNode : public HasProperties { public: - ASTNode(llvm::Record *record = nullptr) : HasProperties(record) {} + ASTNode(const llvm::Record *record = nullptr) : HasProperties(record) {} llvm::StringRef getName() const { return get()->getName(); @@ -180,7 +180,7 @@ class ASTNode : public HasProperties { class DeclNode : public ASTNode { public: - DeclNode(llvm::Record *record = nullptr) : ASTNode(record) {} + DeclNode(const llvm::Record *record = nullptr) : ASTNode(record) {} llvm::StringRef getId() const; std::string getClassName() const; @@ -202,7 +202,7 @@ class DeclNode : public ASTNode { class TypeNode : public ASTNode { public: - TypeNode(llvm::Record *record = nullptr) : ASTNode(record) {} + TypeNode(const llvm::Record *record = nullptr) : ASTNode(record) {} llvm::StringRef getId() const; llvm::StringRef getClassName() const; @@ -224,7 +224,7 @@ class TypeNode : public ASTNode { class StmtNode : public ASTNode { public: - StmtNode(llvm::Record *record = nullptr) : ASTNode(record) {} + StmtNode(const llvm::Record *record = nullptr) : ASTNode(record) {} std::string getId() const; llvm::StringRef getClassName() const; @@ -247,7 +247,7 @@ class StmtNode : public ASTNode { /// The type of a property. class PropertyType : public WrappedRecord { public: - PropertyType(llvm::Record *record = nullptr) : WrappedRecord(record) {} + PropertyType(const llvm::Record *record = nullptr) : WrappedRecord(record) {} /// Is this a generic specialization (i.e. `Array<T>` or `Optional<T>`)? bool isGenericSpecialization() const { @@ -331,7 +331,7 @@ class PropertyType : public WrappedRecord { /// A rule for returning the kind of a type. class TypeKindRule : public WrappedRecord { public: - TypeKindRule(llvm::Record *record = nullptr) : WrappedRecord(record) {} + TypeKindRule(const llvm::Record *record = nullptr) : WrappedRecord(record) {} /// Return the type to which this applies. PropertyType getParentType() const { @@ -361,7 +361,7 @@ class TypeKindRule : public WrappedRecord { /// An implementation case of a property type. class TypeCase : public HasProperties { public: - TypeCase(llvm::Record *record = nullptr) : HasProperties(record) {} + TypeCase(const llvm::Record *record = nullptr) : HasProperties(record) {} /// Return the name of this case. llvm::StringRef getCaseName() const { @@ -381,7 +381,7 @@ class TypeCase : public HasProperties { /// A property of an AST node. class Property : public WrappedRecord { public: - Property(llvm::Record *record = nullptr) : WrappedRecord(record) {} + Property(const llvm::Record *record = nullptr) : WrappedRecord(record) {} /// Return the name of this property. llvm::StringRef getName() const { @@ -417,7 +417,8 @@ class Property : public WrappedRecord { /// a value (which is actually done when writing the value out). class ReadHelperRule : public WrappedRecord { public: - ReadHelperRule(llvm::Record *record = nullptr) : WrappedRecord(record) {} + ReadHelperRule(const llvm::Record *record = nullptr) + : WrappedRecord(record) {} /// Return the class for which this is a creation rule. /// Should never be abstract. @@ -437,7 +438,7 @@ class ReadHelperRule : public WrappedRecord { /// A rule for how to create an AST node from its properties. class CreationRule : public WrappedRecord { public: - CreationRule(llvm::Record *record = nullptr) : WrappedRecord(record) {} + CreationRule(const llvm::Record *record = nullptr) : WrappedRecord(record) {} /// Return the class for which this is a creation rule. /// Should never be abstract. @@ -457,7 +458,7 @@ class CreationRule : public WrappedRecord { /// A rule which overrides the standard rules for serializing an AST node. class OverrideRule : public WrappedRecord { public: - OverrideRule(llvm::Record *record = nullptr) : WrappedRecord(record) {} + OverrideRule(const llvm::Record *record = nullptr) : WrappedRecord(record) {} /// Return the class for which this is an override rule. /// Should never be abstract. @@ -483,12 +484,12 @@ template <class NodeClass> using ASTNodeHierarchyVisitor = llvm::function_ref<void(NodeClass node, NodeClass base)>; -void visitASTNodeHierarchyImpl(llvm::RecordKeeper &records, +void visitASTNodeHierarchyImpl(const llvm::RecordKeeper &records, llvm::StringRef nodeClassName, ASTNodeHierarchyVisitor<ASTNode> visit); template <class NodeClass> -void visitASTNodeHierarchy(llvm::RecordKeeper &records, +void visitASTNodeHierarchy(const llvm::RecordKeeper &records, ASTNodeHierarchyVisitor<NodeClass> visit) { visitASTNodeHierarchyImpl(records, NodeClass::getTableGenNodeClassName(), [visit](ASTNode node, ASTNode base) { diff --git a/clang/utils/TableGen/ClangASTNodesEmitter.cpp b/clang/utils/TableGen/ClangASTNodesEmitter.cpp index 07ddafce329163..39cc8b87e6301f 100644 --- a/clang/utils/TableGen/ClangASTNodesEmitter.cpp +++ b/clang/utils/TableGen/ClangASTNodesEmitter.cpp @@ -34,7 +34,7 @@ class ClangASTNodesEmitter { typedef ChildMap::const_iterator ChildIterator; std::set<ASTNode> PrioritizedClasses; - RecordKeeper &Records; + const RecordKeeper &Records; ASTNode Root; const std::string &NodeClassName; const std::string &BaseSuffix; @@ -70,14 +70,12 @@ class ClangASTNodesEmitter { std::pair<ASTNode, ASTNode> EmitNode(raw_ostream& OS, ASTNode Base); public: - explicit ClangASTNodesEmitter(RecordKeeper &R, const std::string &N, + explicit ClangASTNodesEmitter(const RecordKeeper &R, const std::string &N, const std::string &S, std::string_view PriorizeIfSubclassOf) : Records(R), NodeClassName(N), BaseSuffix(S) { auto vecPrioritized = - PriorizeIfSubclassOf.empty() - ? std::vector<Record *>{} - : R.getAllDerivedDefinitions(PriorizeIfSubclassOf); + R.getAllDerivedDefinitionsIfDefined(PriorizeIfSubclassOf); PrioritizedClasses = std::set<ASTNode>(vecPrioritized.begin(), vecPrioritized.end()); } @@ -169,8 +167,8 @@ void ClangASTNodesEmitter::deriveChildTree() { assert(!Root && "already computed tree"); // Emit statements - const std::vector<Record*> Stmts - = Records.getAllDerivedDefinitions(NodeClassName); + const std::vector<const Record *> &Stmts = + Records.getAllDerivedDefinitions(NodeClassName); for (auto *R : Stmts) { if (auto B = R->getValueAsOptionalDef(BaseFieldName)) @@ -217,14 +215,14 @@ void ClangASTNodesEmitter::run(raw_ostream &OS) { OS << "#undef ABSTRACT_" << macroHierarchyName() << "\n"; } -void clang::EmitClangASTNodes(RecordKeeper &RK, raw_ostream &OS, +void clang::EmitClangASTNodes(const RecordKeeper &RK, raw_ostream &OS, const std::string &N, const std::string &S, std::string_view PriorizeIfSubclassOf) { ClangASTNodesEmitter(RK, N, S, PriorizeIfSubclassOf).run(OS); } -void printDeclContext(const std::multimap<Record *, Record *> &Tree, - Record *DeclContext, raw_ostream &OS) { +void printDeclContext(const std::multimap<const Record *, const Record *> &Tree, + const Record *DeclContext, raw_ostream &OS) { if (!DeclContext->getValueAsBit(AbstractFieldName)) OS << "DECL_CONTEXT(" << DeclContext->getName() << ")\n"; auto i = Tree.lower_bound(DeclContext); @@ -236,7 +234,7 @@ void printDeclContext(const std::multimap<Record *, Record *> &Tree, // Emits and addendum to a .inc file to enumerate the clang declaration // contexts. -void clang::EmitClangDeclContext(RecordKeeper &Records, raw_ostream &OS) { +void clang::EmitClangDeclContext(const RecordKeeper &Records, raw_ostream &OS) { // FIXME: Find a .td file format to allow for this to be represented better. emitSourceFileHeader("List of AST Decl nodes", OS, Records); @@ -245,22 +243,15 @@ void clang::EmitClangDeclContext(RecordKeeper &Records, raw_ostream &OS) { OS << "# define DECL_CONTEXT(DECL)\n"; OS << "#endif\n"; - std::vector<Record *> DeclContextsVector = - Records.getAllDerivedDefinitions(DeclContextNodeClassName); - std::vector<Record *> Decls = - Records.getAllDerivedDefinitions(DeclNodeClassName); + std::multimap<const Record *, const Record *> Tree; - std::multimap<Record *, Record *> Tree; - - const std::vector<Record *> Stmts = - Records.getAllDerivedDefinitions(DeclNodeClassName); - - for (auto *R : Stmts) { + for (auto *R : Records.getAllDerivedDefinitions(DeclNodeClassName)) { if (auto *B = R->getValueAsOptionalDef(BaseFieldName)) Tree.insert(std::make_pair(B, R)); } - for (auto *DeclContext : DeclContextsVector) { + for (const Record *DeclContext : + Records.getAllDerivedDefinitions(DeclContextNodeClassName)) { printDeclContext(Tree, DeclContext, OS); } diff --git a/clang/utils/TableGen/ClangASTPropertiesEmitter.cpp b/clang/utils/TableGen/ClangASTPropertiesEmitter.cpp index de8dda60681ff8..a967ecb6523252 100644 --- a/clang/utils/TableGen/ClangASTPropertiesEmitter.cpp +++ b/clang/utils/TableGen/ClangASTPropertiesEmitter.cpp @@ -89,95 +89,96 @@ struct CasedTypeInfo { class ASTPropsEmitter { raw_ostream &Out; - RecordKeeper &Records; - std::map<HasProperties, NodeInfo> NodeInfos; - std::vector<PropertyType> AllPropertyTypes; - std::map<PropertyType, CasedTypeInfo> CasedTypeInfos; - -public: - ASTPropsEmitter(RecordKeeper &records, raw_ostream &out) - : Out(out), Records(records) { - - // Find all the properties. - for (Property property : - records.getAllDerivedDefinitions(PropertyClassName)) { - HasProperties node = property.getClass(); - NodeInfos[node].Properties.push_back(property); - } - - // Find all the creation rules. - for (CreationRule creationRule : - records.getAllDerivedDefinitions(CreationRuleClassName)) { - HasProperties node = creationRule.getClass(); - - auto &info = NodeInfos[node]; - if (info.Creator) { - PrintFatalError(creationRule.getLoc(), - "multiple creator rules for \"" + node.getName() - + "\""); - } - info.Creator = creationRule; - } - - // Find all the override rules. - for (OverrideRule overrideRule : - records.getAllDerivedDefinitions(OverrideRuleClassName)) { - HasProperties node = overrideRule.getClass(); - - auto &info = NodeInfos[node]; - if (info.Override) { - PrintFatalError(overrideRule.getLoc(), - "multiple override rules for \"" + node.getName() - + "\""); - } - info.Override = overrideRule; - } - - // Find all the write helper rules. - for (ReadHelperRule helperRule : - records.getAllDerivedDefinitions(ReadHelperRuleClassName)) { - HasProperties node = helperRule.getClass(); - - auto &info = NodeInfos[node]; - if (info.ReadHelper) { - PrintFatalError(helperRule.getLoc(), - "multiple write helper rules for \"" + node.getName() - + "\""); - } - info.ReadHelper = helperRule; - } - - // Find all the concrete property types. - for (PropertyType type : - records.getAllDerivedDefinitions(PropertyTypeClassName)) { - // Ignore generic specializations; they're generally not useful when - // emitting basic emitters etc. - if (type.isGenericSpecialization()) continue; - - AllPropertyTypes.push_back(type); - } - - // Find all the type kind rules. - for (TypeKindRule kindRule : - records.getAllDerivedDefinitions(TypeKindClassName)) { - PropertyType type = kindRule.getParentType(); - auto &info = CasedTypeInfos[type]; - if (info.KindRule) { - PrintFatalError(kindRule.getLoc(), - "multiple kind rules for \"" - + type.getCXXTypeName() + "\""); - } - info.KindRule = kindRule; - } - - // Find all the type cases. - for (TypeCase typeCase : - records.getAllDerivedDefinitions(TypeCaseClassName)) { - CasedTypeInfos[typeCase.getParentType()].Cases.push_back(typeCase); - } - - Validator(*this).validate(); - } + const RecordKeeper &Records; + std::map<HasProperties, NodeInfo> NodeInfos; + std::vector<PropertyType> AllPropertyTypes; + std::map<PropertyType, CasedTypeInfo> CasedTypeInfos; + + public: + ASTPropsEmitter(const RecordKeeper &records, raw_ostream &out) + : Out(out), Records(records) { + + // Find all the properties. + for (Property property : + records.getAllDerivedDefinitions(PropertyClassName)) { + HasProperties node = property.getClass(); + NodeInfos[node].Properties.push_back(property); + } + + // Find all the creation rules. + for (CreationRule creationRule : + records.getAllDerivedDefinitions(CreationRuleClassName)) { + HasProperties node = creationRule.getClass(); + + auto &info = NodeInfos[node]; + if (info.Creator) { + PrintFatalError(creationRule.getLoc(), + "multiple creator rules for \"" + node.getName() + + "\""); + } + info.Creator = creationRule; + } + + // Find all the override rules. + for (OverrideRule overrideRule : + records.getAllDerivedDefinitions(OverrideRuleClassName)) { + HasProperties node = overrideRule.getClass(); + + auto &info = NodeInfos[node]; + if (info.Override) { + PrintFatalError(overrideRule.getLoc(), + "multiple override rules for \"" + + node.getName() + "\""); + } + info.Override = overrideRule; + } + + // Find all the write helper rules. + for (ReadHelperRule helperRule : + records.getAllDerivedDefinitions(ReadHelperRuleClassName)) { + HasProperties node = helperRule.getClass(); + + auto &info = NodeInfos[node]; + if (info.ReadHelper) { + PrintFatalError(helperRule.getLoc(), + "multiple write helper rules for \"" + + node.getName() + "\""); + } + info.ReadHelper = helperRule; + } + + // Find all the concrete property types. + for (PropertyType type : + records.getAllDerivedDefinitions(PropertyTypeClassName)) { + // Ignore generic specializations; they're generally not useful when + // emitting basic emitters etc. + if (type.isGenericSpecialization()) + continue; + + AllPropertyTypes.push_back(type); + } + + // Find all the type kind rules. + for (TypeKindRule kindRule : + records.getAllDerivedDefinitions(TypeKindClassName)) { + PropertyType type = kindRule.getParentType(); + auto &info = CasedTypeInfos[type]; + if (info.KindRule) { + PrintFatalError(kindRule.getLoc(), "multiple kind rules for \"" + + type.getCXXTypeName() + + "\""); + } + info.KindRule = kindRule; + } + + // Find all the type cases. + for (TypeCase typeCase : + records.getAllDerivedDefinitions(TypeCaseClassName)) { + CasedTypeInfos[typeCase.getParentType()].Cases.push_back(typeCase); + } + + Validator(*this).validate(); + } void visitAllProperties(HasProperties derived, const NodeInfo &derivedInfo, function_ref<void (Property)> visit) { @@ -591,28 +592,28 @@ void ASTPropsEmitter::emitWriteOfProperty(StringRef writerName, /// Emit an .inc file that defines the AbstractFooReader class /// for the given AST class hierarchy. template <class NodeClass> -static void emitASTReader(RecordKeeper &records, raw_ostream &out, +static void emitASTReader(const RecordKeeper &records, raw_ostream &out, StringRef description) { emitSourceFileHeader(description, out, records); ASTPropsEmitter(records, out).emitNodeReaderClass<NodeClass>(); } -void clang::EmitClangTypeReader(RecordKeeper &records, raw_ostream &out) { +void clang::EmitClangTypeReader(const RecordKeeper &records, raw_ostream &out) { emitASTReader<TypeNode>(records, out, "A CRTP reader for Clang Type nodes"); } /// Emit an .inc file that defines the AbstractFooWriter class /// for the given AST class hierarchy. template <class NodeClass> -static void emitASTWriter(RecordKeeper &records, raw_ostream &out, +static void emitASTWriter(const RecordKeeper &records, raw_ostream &out, StringRef description) { emitSourceFileHeader(description, out, records); ASTPropsEmitter(records, out).emitNodeWriterClass<NodeClass>(); } -void clang::EmitClangTypeWriter(RecordKeeper &records, raw_ostream &out) { +void cla... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/107533 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits