From b86bf83c281cbc1c42de3dfca6ae2555094abeae Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Sat, 15 Feb 2020 18:07:42 -0600 Subject: [PATCH] [FIX] Remove pointer in attribute to eliminate leaks (see D71830) --- clang/include/clang/Basic/Attr.td | 6 +++--- clang/include/clang/Sema/Sema.h | 2 +- clang/include/clang/Serialization/ASTRecordReader.h | 2 +- clang/include/clang/Serialization/ASTRecordWriter.h | 2 +- clang/lib/CodeGen/CGOpenMPRuntime.cpp | 8 ++++---- clang/lib/Parse/ParseOpenMP.cpp | 10 ++++------ clang/lib/Sema/SemaOpenMP.cpp | 2 +- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 13 ++++--------- clang/lib/Serialization/ASTReader.cpp | 8 ++++---- clang/lib/Serialization/ASTReaderDecl.cpp | 2 +- clang/lib/Serialization/ASTWriter.cpp | 6 +++--- clang/utils/TableGen/ClangAttrEmitter.cpp | 10 +++++----- 12 files changed, 32 insertions(+), 39 deletions(-) diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index be68a9b..e1a61d0 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -181,7 +181,7 @@ class NamedArgument : Argument; -// An argument of a OMPDeclareVariantAttribute that represents the `match` +// An argument of a OMPDeclareVariantAttr that represents the `match` // clause of the declare variant by keeping the information (incl. nesting) in // an OMPTraitInfo object. // @@ -3366,7 +3366,7 @@ def OMPDeclareVariant : InheritableAttr { OMPTraitInfoArgument<"TraitInfos">, ]; let AdditionalMembers = [{ - ~OMPDeclareVariantAttr() { delete traitInfos; } + OMPTraitInfo &getTraitInfo() { return traitInfos; } void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy) const { if (const Expr *E = getVariantFuncRef()) { @@ -3375,7 +3375,7 @@ def OMPDeclareVariant : InheritableAttr { OS << ")"; } OS << " match("; - traitInfos->print(OS, Policy); + traitInfos.print(OS, Policy); OS << ")"; } }]; diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index ffcacac..a643035 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -10202,7 +10202,7 @@ public: /// must be used instead of the original one, specified in \p DG. /// \param TI The context traits associated with the function variant. void ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, - OMPTraitInfo *TI, SourceRange SR); + OMPTraitInfo &TI, SourceRange SR); OMPClause *ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr, diff --git a/clang/include/clang/Serialization/ASTRecordReader.h b/clang/include/clang/Serialization/ASTRecordReader.h index 3622960..7d4ef7c 100644 --- a/clang/include/clang/Serialization/ASTRecordReader.h +++ b/clang/include/clang/Serialization/ASTRecordReader.h @@ -260,7 +260,7 @@ public: } /// Read an OMPTraitInfo object, advancing Idx. - OMPTraitInfo *readOMPTraitInfo(); + OMPTraitInfo readOMPTraitInfo(); /// Read an OpenMP clause, advancing Idx. OMPClause *readOMPClause(); diff --git a/clang/include/clang/Serialization/ASTRecordWriter.h b/clang/include/clang/Serialization/ASTRecordWriter.h index 2a35c69..924aa5d 100644 --- a/clang/include/clang/Serialization/ASTRecordWriter.h +++ b/clang/include/clang/Serialization/ASTRecordWriter.h @@ -267,7 +267,7 @@ public: void AddCXXDefinitionData(const CXXRecordDecl *D); /// Write an OMPTraitInfo object. - void writeOMPTraitInfo(OMPTraitInfo *TI); + void writeOMPTraitInfo(const OMPTraitInfo &TI); void writeOMPClause(OMPClause *C); diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 60b8149..9798d45 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -11075,11 +11075,11 @@ static const FunctionDecl *getDeclareVariantFunction(CodeGenModule &CGM, SmallVector VariantExprs; SmallVector VMIs; for (const auto *A : FD->specific_attrs()) { - const OMPTraitInfo *TI = A->getTraitInfos(); - if (!TI) - continue; + A->printPretty(llvm::dbgs(), PrintingPolicy(LangOptions())); + const OMPTraitInfo &TI = A->getTraitInfos(); + TI.print(llvm::dbgs(), PrintingPolicy(LangOptions())); VMIs.push_back(VariantMatchInfo()); - TI->getAsVariantMatchInfo(CGM.getContext(), VMIs.back()); + TI.getAsVariantMatchInfo(CGM.getContext(), VMIs.back()); VariantExprs.push_back(A->getVariantFuncRef()); } diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index e1bcbdb..8c822ec 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -1365,26 +1365,24 @@ void Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, } // Parse inner context selectors. - OMPTraitInfo *TI = new OMPTraitInfo(); - parseOMPContextSelectors(Loc, *TI); + OMPTraitInfo TI; + parseOMPContextSelectors(Loc, TI); // Parse ')' (void)T.consumeClose(); Optional> DeclVarData = Actions.checkOpenMPDeclareVariantFunction( - Ptr, AssociatedFunction.get(), *TI, + Ptr, AssociatedFunction.get(), TI, SourceRange(Loc, Tok.getLocation())); // Skip last tokens. while (Tok.isNot(tok::annot_pragma_openmp_end)) ConsumeAnyToken(); - if (DeclVarData.hasValue() && !TI->Sets.empty()) + if (DeclVarData.hasValue() && !TI.Sets.empty()) Actions.ActOnOpenMPDeclareVariantDirective( DeclVarData.getValue().first, DeclVarData.getValue().second, TI, SourceRange(Loc, Tok.getLocation())); - else - delete TI; // Skip the last annot_pragma_openmp_end. (void)ConsumeAnnotationToken(); diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index a828e85..ea10110 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -5632,7 +5632,7 @@ Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, void Sema::ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, - OMPTraitInfo *TI, + OMPTraitInfo &TI, SourceRange SR) { auto *NewAttr = OMPDeclareVariantAttr::CreateImplicit(Context, VariantRef, TI, SR); diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 6571c82..2ac899a 100755 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -395,8 +395,7 @@ static void instantiateOMPDeclareVariantAttr( // Copy the template version of the OMPTraitInfo and run substitute on all // score and condition expressiosn. - OMPTraitInfo *TI = new OMPTraitInfo(); - *TI = *Attr.getTraitInfos(); + OMPTraitInfo TI = Attr.getTraitInfos(); // Try to substitute template parameters in score and condition expressions. auto SubstScoreOrConditionExpr = [&S, Subst](Expr *&E, bool) { @@ -411,21 +410,17 @@ static void instantiateOMPDeclareVariantAttr( } return false; }; - if (TI->anyScoreOrCondition(SubstScoreOrConditionExpr)) { - delete TI; + if (TI.anyScoreOrCondition(SubstScoreOrConditionExpr)) return; - } // Check function/variant ref. Optional> DeclVarData = S.checkOpenMPDeclareVariantFunction(S.ConvertDeclToDeclGroup(New), - VariantFuncRef.get(), *TI, + VariantFuncRef.get(), TI, Attr.getRange()); - if (!DeclVarData) { - delete TI; + if (!DeclVarData) return; - } S.ActOnOpenMPDeclareVariantDirective(DeclVarData.getValue().first, DeclVarData.getValue().second, TI, diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index fa5b43d..29abb9c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -12612,10 +12612,10 @@ void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { C->setKindKwLoc(Record.readSourceLocation()); } -OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { - OMPTraitInfo *TI = new OMPTraitInfo(); - TI->Sets.resize(readUInt32()); - for (auto &Set : TI->Sets) { +OMPTraitInfo ASTRecordReader::readOMPTraitInfo() { + OMPTraitInfo TI; + TI.Sets.resize(readUInt32()); + for (auto &Set : TI.Sets) { Set.Kind = readEnum(); Set.Selectors.resize(readUInt32()); for (auto &Selector : Set.Selectors) { diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 45c10be..091bf56 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -2756,7 +2756,7 @@ public: return Reader.readVersionTuple(); } - OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); } + OMPTraitInfo readOMPTraitInfo() { return Reader.readOMPTraitInfo(); } template T *GetLocalDeclAs(uint32_t LocalID) { return Reader.GetLocalDeclAs(LocalID); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 4ee59f7..159ebe1 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -6578,9 +6578,9 @@ void OMPClauseWriter::VisitOMPOrderClause(OMPOrderClause *C) { Record.AddSourceLocation(C->getKindKwLoc()); } -void ASTRecordWriter::writeOMPTraitInfo(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) { diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index b56a050..116c382 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -107,7 +107,7 @@ static std::string ReadPCHRecord(StringRef type) { .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 @@ static std::string WritePCHRecord(StringRef type, StringRef name) { .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,8 +363,8 @@ namespace { OS << " if (SA->get" << getUpperName() << "().isValid())\n "; OS << " OS << \" \" << SA->get" << getUpperName() << "().getSourceIndex();\n"; - } else if (type == "OMPTraitInfo *") { - OS << " OS << \" \" << *SA->get" << getUpperName() << "();\n"; + } else if (type == "OMPTraitInfo") { + OS << " OS << \" \" << SA->get" << getUpperName() << "();\n"; } else { llvm_unreachable("Unknown SimpleArgument type!"); } @@ -1314,7 +1314,7 @@ createArgument(const Record &Arg, StringRef Attr, else if (ArgName == "VersionArgument") Ptr = std::make_unique(Arg, Attr); else if (ArgName == "OMPTraitInfoArgument") - Ptr = std::make_unique(Arg, Attr, "OMPTraitInfo *"); + Ptr = std::make_unique(Arg, Attr, "OMPTraitInfo"); if (!Ptr) { // Search in reverse order so that the most-derived type is handled first. -- 2.7.4