jdoerfert created this revision. jdoerfert added a reviewer: rnk. Herald added subscribers: guansong, bollu. Herald added a project: clang.
See rational here: https://reviews.llvm.org/D71830#1922656 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D76173 Files: clang/include/clang/AST/ASTContext.h clang/include/clang/AST/OpenMPClause.h clang/include/clang/Basic/Attr.td clang/include/clang/Serialization/ASTRecordReader.h clang/include/clang/Serialization/ASTRecordWriter.h clang/lib/AST/ASTContext.cpp clang/lib/AST/AttrImpl.cpp clang/lib/AST/OpenMPClause.cpp clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/Parse/ParseOpenMP.cpp clang/lib/Sema/SemaOpenMP.cpp clang/lib/Sema/SemaTemplateInstantiateDecl.cpp clang/lib/Serialization/ASTReader.cpp clang/lib/Serialization/ASTReaderDecl.cpp clang/lib/Serialization/ASTWriter.cpp clang/utils/TableGen/ClangAttrEmitter.cpp
Index: clang/utils/TableGen/ClangAttrEmitter.cpp =================================================================== --- clang/utils/TableGen/ClangAttrEmitter.cpp +++ clang/utils/TableGen/ClangAttrEmitter.cpp @@ -107,7 +107,7 @@ .Case("IdentifierInfo *", "Record.readIdentifier()") .Case("StringRef", "Record.readString()") .Case("ParamIdx", "ParamIdx::deserialize(Record.readInt())") - .Case("OMPTraitInfo", "Record.readOMPTraitInfo()") + .Case("OMPTraitInfo *", "Record.readOMPTraitInfo()") .Default("Record.readInt()"); } @@ -131,7 +131,7 @@ .Case("StringRef", "AddString(" + std::string(name) + ");\n") .Case("ParamIdx", "push_back(" + std::string(name) + ".serialize());\n") - .Case("OMPTraitInfo", + .Case("OMPTraitInfo *", "writeOMPTraitInfo(" + std::string(name) + ");\n") .Default("push_back(" + std::string(name) + ");\n"); } @@ -363,7 +363,7 @@ OS << " if (SA->get" << getUpperName() << "().isValid())\n "; OS << " OS << \" \" << SA->get" << getUpperName() << "().getSourceIndex();\n"; - } else if (type == "OMPTraitInfo") { + } else if (type == "OMPTraitInfo *") { OS << " OS << \" \" << SA->get" << getUpperName() << "();\n"; } else { llvm_unreachable("Unknown SimpleArgument type!"); @@ -1331,7 +1331,7 @@ else if (ArgName == "VersionArgument") Ptr = std::make_unique<VersionArgument>(Arg, Attr); else if (ArgName == "OMPTraitInfoArgument") - Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "OMPTraitInfo"); + Ptr = std::make_unique<SimpleArgument>(Arg, Attr, "OMPTraitInfo *"); if (!Ptr) { // Search in reverse order so that the most-derived type is handled first. Index: clang/lib/Serialization/ASTWriter.cpp =================================================================== --- clang/lib/Serialization/ASTWriter.cpp +++ clang/lib/Serialization/ASTWriter.cpp @@ -6592,9 +6592,9 @@ Record.AddSourceLocation(C->getKindKwLoc()); } -void ASTRecordWriter::writeOMPTraitInfo(const OMPTraitInfo &TI) { - writeUInt32(TI.Sets.size()); - for (const auto &Set : TI.Sets) { +void ASTRecordWriter::writeOMPTraitInfo(const OMPTraitInfo *TI) { + writeUInt32(TI->Sets.size()); + for (const auto &Set : TI->Sets) { writeEnum(Set.Kind); writeUInt32(Set.Selectors.size()); for (const auto &Selector : Set.Selectors) { Index: clang/lib/Serialization/ASTReaderDecl.cpp =================================================================== --- clang/lib/Serialization/ASTReaderDecl.cpp +++ clang/lib/Serialization/ASTReaderDecl.cpp @@ -2744,7 +2744,7 @@ return Reader.readVersionTuple(); } - OMPTraitInfo readOMPTraitInfo() { return Reader.readOMPTraitInfo(); } + OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); } template <typename T> T *GetLocalDeclAs(uint32_t LocalID) { return Reader.GetLocalDeclAs<T>(LocalID); Index: clang/lib/Serialization/ASTReader.cpp =================================================================== --- clang/lib/Serialization/ASTReader.cpp +++ clang/lib/Serialization/ASTReader.cpp @@ -12630,8 +12630,8 @@ C->setKindKwLoc(Record.readSourceLocation()); } -OMPTraitInfo ASTRecordReader::readOMPTraitInfo() { - OMPTraitInfo TI; +OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { + OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); TI.Sets.resize(readUInt32()); for (auto &Set : TI.Sets) { Set.Kind = readEnum<llvm::omp::TraitSet>(); @@ -12646,5 +12646,5 @@ Property.Kind = readEnum<llvm::omp::TraitProperty>(); } } - return TI; + return &TI; } Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -398,7 +398,8 @@ // Copy the template version of the OMPTraitInfo and run substitute on all // score and condition expressiosn. - OMPTraitInfo TI = Attr.getTraitInfos(); + OMPTraitInfo &TI = S.getASTContext().getNewOMPTraitInfo(); + TI = *Attr.getTraitInfos(); // Try to substitute template parameters in score and condition expressions. auto SubstScoreOrConditionExpr = [&S, Subst](Expr *&E, bool) { Index: clang/lib/Sema/SemaOpenMP.cpp =================================================================== --- clang/lib/Sema/SemaOpenMP.cpp +++ clang/lib/Sema/SemaOpenMP.cpp @@ -5677,7 +5677,7 @@ OMPTraitInfo &TI, SourceRange SR) { auto *NewAttr = - OMPDeclareVariantAttr::CreateImplicit(Context, VariantRef, TI, SR); + OMPDeclareVariantAttr::CreateImplicit(Context, VariantRef, &TI, SR); FD->addAttr(NewAttr); } Index: clang/lib/Parse/ParseOpenMP.cpp =================================================================== --- clang/lib/Parse/ParseOpenMP.cpp +++ clang/lib/Parse/ParseOpenMP.cpp @@ -1365,7 +1365,7 @@ } // Parse inner context selectors. - OMPTraitInfo TI; + OMPTraitInfo &TI = Actions.getASTContext().getNewOMPTraitInfo(); parseOMPContextSelectors(Loc, TI); // Parse ')' Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp =================================================================== --- clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -11333,7 +11333,7 @@ SmallVector<Expr *, 8> VariantExprs; SmallVector<VariantMatchInfo, 8> VMIs; for (const auto *A : FD->specific_attrs<OMPDeclareVariantAttr>()) { - const OMPTraitInfo &TI = A->getTraitInfos(); + const OMPTraitInfo &TI = *A->getTraitInfos(); VMIs.push_back(VariantMatchInfo()); TI.getAsVariantMatchInfo(CGM.getContext(), VMIs.back()); VariantExprs.push_back(A->getVariantFuncRef()); Index: clang/lib/AST/OpenMPClause.cpp =================================================================== --- clang/lib/AST/OpenMPClause.cpp +++ clang/lib/AST/OpenMPClause.cpp @@ -1895,3 +1895,7 @@ TI.print(OS, Policy); return OS; } +llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS, + const OMPTraitInfo *TI) { + return TI ? OS << *TI : OS; +} Index: clang/lib/AST/AttrImpl.cpp =================================================================== --- clang/lib/AST/AttrImpl.cpp +++ clang/lib/AST/AttrImpl.cpp @@ -159,7 +159,7 @@ OS << ")"; } OS << " match("; - traitInfos.print(OS, Policy); + traitInfos->print(OS, Policy); OS << ")"; } Index: clang/lib/AST/ASTContext.cpp =================================================================== --- clang/lib/AST/ASTContext.cpp +++ clang/lib/AST/ASTContext.cpp @@ -1005,6 +1005,9 @@ for (APValue *Value : APValueCleanups) Value->~APValue(); + + // Destroy the OMPTraitInfo objects that life here. + llvm::DeleteContainerPointers(OMPTraitInfoVector); } void ASTContext::setTraversalScope(const std::vector<Decl *> &TopLevelDecls) { @@ -10803,3 +10806,8 @@ Target->getTargetOpts().Features); } } + +OMPTraitInfo &ASTContext::getNewOMPTraitInfo() { + OMPTraitInfoVector.push_back(new OMPTraitInfo()); + return *OMPTraitInfoVector.back(); +} Index: clang/include/clang/Serialization/ASTRecordWriter.h =================================================================== --- clang/include/clang/Serialization/ASTRecordWriter.h +++ clang/include/clang/Serialization/ASTRecordWriter.h @@ -267,7 +267,7 @@ void AddCXXDefinitionData(const CXXRecordDecl *D); /// Write an OMPTraitInfo object. - void writeOMPTraitInfo(const OMPTraitInfo &TI); + void writeOMPTraitInfo(const OMPTraitInfo *TI); void writeOMPClause(OMPClause *C); Index: clang/include/clang/Serialization/ASTRecordReader.h =================================================================== --- clang/include/clang/Serialization/ASTRecordReader.h +++ clang/include/clang/Serialization/ASTRecordReader.h @@ -260,7 +260,7 @@ } /// Read an OMPTraitInfo object, advancing Idx. - OMPTraitInfo readOMPTraitInfo(); + OMPTraitInfo *readOMPTraitInfo(); /// Read an OpenMP clause, advancing Idx. OMPClause *readOMPClause(); Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -3257,7 +3257,7 @@ OMPTraitInfoArgument<"TraitInfos">, ]; let AdditionalMembers = [{ - OMPTraitInfo &getTraitInfo() { return traitInfos; } + OMPTraitInfo &getTraitInfo() { return *traitInfos; } void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy) const; }]; Index: clang/include/clang/AST/OpenMPClause.h =================================================================== --- clang/include/clang/AST/OpenMPClause.h +++ clang/include/clang/AST/OpenMPClause.h @@ -6884,22 +6884,27 @@ /// collection of selector sets, each with an associated kind and an ordered /// collection of selectors. A selector has a kind, an optional score/condition, /// and an ordered collection of properties. -struct OMPTraitInfo { +class OMPTraitInfo { + /// Private constructor accesible only by ASTContext. + OMPTraitInfo() {} + friend class ASTContext; + +public: struct OMPTraitProperty { llvm::omp::TraitProperty Kind = llvm::omp::TraitProperty::invalid; }; struct OMPTraitSelector { Expr *ScoreOrCondition = nullptr; llvm::omp::TraitSelector Kind = llvm::omp::TraitSelector::invalid; - llvm::SmallVector<OMPTraitProperty, 4> Properties; + llvm::SmallVector<OMPTraitProperty, 1> Properties; }; struct OMPTraitSet { llvm::omp::TraitSet Kind = llvm::omp::TraitSet::invalid; - llvm::SmallVector<OMPTraitSelector, 4> Selectors; + llvm::SmallVector<OMPTraitSelector, 2> Selectors; }; /// The outermost level of selector sets. - llvm::SmallVector<OMPTraitSet, 4> Sets; + llvm::SmallVector<OMPTraitSet, 2> Sets; bool anyScoreOrCondition( const llvm::function_ref<bool(Expr *&, bool /* IsScore */)> &Cond) { @@ -6925,6 +6930,7 @@ void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const; }; llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI); +llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo *TI); } // namespace clang Index: clang/include/clang/AST/ASTContext.h =================================================================== --- clang/include/clang/AST/ASTContext.h +++ clang/include/clang/AST/ASTContext.h @@ -116,6 +116,7 @@ class ObjCPropertyImplDecl; class ObjCProtocolDecl; class ObjCTypeParamDecl; +struct OMPTraitInfo; struct ParsedTargetAttr; class Preprocessor; class Stmt; @@ -2956,6 +2957,14 @@ }; llvm::StringMap<SectionInfo> SectionInfos; + + /// Return a new OMPTraitInfo object owned by the Sema. + OMPTraitInfo &getNewOMPTraitInfo(); + +private: + /// All OMPTraitInfo objects live in this collection, one per `omp [begin] + /// declare variant` directive. + SmallVector<OMPTraitInfo *, 4> OMPTraitInfoVector; }; /// Utility function for constructing a nullary selector.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits