From ba6057de7198f57738550fccb5b43d30f83757bb Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Fri, 24 Apr 2015 06:49:44 +0000 Subject: [TableGen] Don't leak Expanders and Operators in SetTheory. llvm-svn: 235697 --- llvm/lib/TableGen/SetTheory.cpp | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) (limited to 'llvm/lib/TableGen/SetTheory.cpp') diff --git a/llvm/lib/TableGen/SetTheory.cpp b/llvm/lib/TableGen/SetTheory.cpp index c99c2bab45a..a8816c87814 100644 --- a/llvm/lib/TableGen/SetTheory.cpp +++ b/llvm/lib/TableGen/SetTheory.cpp @@ -245,28 +245,28 @@ void SetTheory::Expander::anchor() {} SetTheory::SetTheory() { - addOperator("add", new AddOp); - addOperator("sub", new SubOp); - addOperator("and", new AndOp); - addOperator("shl", new ShlOp); - addOperator("trunc", new TruncOp); - addOperator("rotl", new RotOp(false)); - addOperator("rotr", new RotOp(true)); - addOperator("decimate", new DecimateOp); - addOperator("interleave", new InterleaveOp); - addOperator("sequence", new SequenceOp); + addOperator("add", llvm::make_unique()); + addOperator("sub", llvm::make_unique()); + addOperator("and", llvm::make_unique()); + addOperator("shl", llvm::make_unique()); + addOperator("trunc", llvm::make_unique()); + addOperator("rotl", llvm::make_unique(false)); + addOperator("rotr", llvm::make_unique(true)); + addOperator("decimate", llvm::make_unique()); + addOperator("interleave", llvm::make_unique()); + addOperator("sequence", llvm::make_unique()); } -void SetTheory::addOperator(StringRef Name, Operator *Op) { - Operators[Name] = Op; +void SetTheory::addOperator(StringRef Name, std::unique_ptr Op) { + Operators[Name] = std::move(Op); } -void SetTheory::addExpander(StringRef ClassName, Expander *E) { - Expanders[ClassName] = E; +void SetTheory::addExpander(StringRef ClassName, std::unique_ptr E) { + Expanders[ClassName] = std::move(E); } void SetTheory::addFieldExpander(StringRef ClassName, StringRef FieldName) { - addExpander(ClassName, new FieldExpander(FieldName)); + addExpander(ClassName, llvm::make_unique(FieldName)); } void SetTheory::evaluate(Init *Expr, RecSet &Elts, ArrayRef Loc) { @@ -289,10 +289,10 @@ void SetTheory::evaluate(Init *Expr, RecSet &Elts, ArrayRef Loc) { DefInit *OpInit = dyn_cast(DagExpr->getOperator()); if (!OpInit) PrintFatalError(Loc, "Bad set expression: " + Expr->getAsString()); - Operator *Op = Operators.lookup(OpInit->getDef()->getName()); - if (!Op) + auto I = Operators.find(OpInit->getDef()->getName()); + if (I == Operators.end()) PrintFatalError(Loc, "Unknown set operator: " + Expr->getAsString()); - Op->apply(*this, DagExpr, Elts, Loc); + I->second->apply(*this, DagExpr, Elts, Loc); } const RecVec *SetTheory::expand(Record *Set) { @@ -307,11 +307,12 @@ const RecVec *SetTheory::expand(Record *Set) { // Skip unnamed superclasses. if (!dyn_cast(SC[i]->getNameInit())) continue; - if (Expander *Exp = Expanders.lookup(SC[i]->getName())) { + auto I = Expanders.find(SC[i]->getName()); + if (I != Expanders.end()) { // This breaks recursive definitions. RecVec &EltVec = Expansions[Set]; RecSet Elts; - Exp->expand(*this, Set, Elts); + I->second->expand(*this, Set, Elts); EltVec.assign(Elts.begin(), Elts.end()); return &EltVec; } -- cgit v1.2.3