FWIW, I tried to do something like this, perhaps with some other improvements, a few years ago. Not sure if things have changed for the better since then, but maybe those old patches may provide some insight/other improvements/options:
http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20140915/115122.html http://reviews.llvm.org/D4313 http://reviews.llvm.org/D4312 On Sun, Feb 7, 2016 at 11:28 AM, Argyrios Kyrtzidis via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: akirtzidis > Date: Sun Feb 7 13:28:36 2016 > New Revision: 260048 > > URL: http://llvm.org/viewvc/llvm-project?rev=260048&view=rev > Log: > [Frontend] Make the memory management of FrontendAction pointers explicit > by using unique_ptr. > > Modified: > cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h > cfe/trunk/include/clang/Frontend/FrontendAction.h > cfe/trunk/include/clang/Frontend/FrontendActions.h > cfe/trunk/include/clang/Rewrite/Frontend/FrontendActions.h > cfe/trunk/lib/ARCMigrate/ARCMTActions.cpp > cfe/trunk/lib/ARCMigrate/ObjCMT.cpp > cfe/trunk/lib/Frontend/ASTMerge.cpp > cfe/trunk/lib/Frontend/FrontendAction.cpp > cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp > > Modified: cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h (original) > +++ cfe/trunk/include/clang/ARCMigrate/ARCMTActions.h Sun Feb 7 13:28:36 > 2016 > @@ -22,7 +22,7 @@ protected: > bool BeginInvocation(CompilerInstance &CI) override; > > public: > - CheckAction(FrontendAction *WrappedAction); > + CheckAction(std::unique_ptr<FrontendAction> WrappedAction); > }; > > class ModifyAction : public WrapperFrontendAction { > @@ -30,7 +30,7 @@ protected: > bool BeginInvocation(CompilerInstance &CI) override; > > public: > - ModifyAction(FrontendAction *WrappedAction); > + ModifyAction(std::unique_ptr<FrontendAction> WrappedAction); > }; > > class MigrateSourceAction : public ASTFrontendAction { > @@ -49,7 +49,8 @@ protected: > bool BeginInvocation(CompilerInstance &CI) override; > > public: > - MigrateAction(FrontendAction *WrappedAction, StringRef migrateDir, > + MigrateAction(std::unique_ptr<FrontendAction> WrappedAction, > + StringRef migrateDir, > StringRef plistOut, > bool emitPremigrationARCErrors); > }; > @@ -61,8 +62,8 @@ class ObjCMigrateAction : public Wrapper > FileRemapper Remapper; > CompilerInstance *CompInst; > public: > - ObjCMigrateAction(FrontendAction *WrappedAction, StringRef migrateDir, > - unsigned migrateAction); > + ObjCMigrateAction(std::unique_ptr<FrontendAction> WrappedAction, > + StringRef migrateDir, unsigned migrateAction); > > protected: > std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, > > Modified: cfe/trunk/include/clang/Frontend/FrontendAction.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendAction.h?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Frontend/FrontendAction.h (original) > +++ cfe/trunk/include/clang/Frontend/FrontendAction.h Sun Feb 7 13:28:36 > 2016 > @@ -283,7 +283,7 @@ protected: > public: > /// Construct a WrapperFrontendAction from an existing action, taking > /// ownership of it. > - WrapperFrontendAction(FrontendAction *WrappedAction); > + WrapperFrontendAction(std::unique_ptr<FrontendAction> WrappedAction); > > bool usesPreprocessorOnly() const override; > TranslationUnitKind getTranslationUnitKind() override; > > Modified: cfe/trunk/include/clang/Frontend/FrontendActions.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendActions.h?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Frontend/FrontendActions.h (original) > +++ cfe/trunk/include/clang/Frontend/FrontendActions.h Sun Feb 7 13:28:36 > 2016 > @@ -168,7 +168,7 @@ public: > */ > class ASTMergeAction : public FrontendAction { > /// \brief The action that the merge action adapts. > - FrontendAction *AdaptedAction; > + std::unique_ptr<FrontendAction> AdaptedAction; > > /// \brief The set of AST files to merge. > std::vector<std::string> ASTFiles; > @@ -184,7 +184,8 @@ protected: > void EndSourceFileAction() override; > > public: > - ASTMergeAction(FrontendAction *AdaptedAction, ArrayRef<std::string> > ASTFiles); > + ASTMergeAction(std::unique_ptr<FrontendAction> AdaptedAction, > + ArrayRef<std::string> ASTFiles); > ~ASTMergeAction() override; > > bool usesPreprocessorOnly() const override; > > Modified: cfe/trunk/include/clang/Rewrite/Frontend/FrontendActions.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Rewrite/Frontend/FrontendActions.h?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/Rewrite/Frontend/FrontendActions.h (original) > +++ cfe/trunk/include/clang/Rewrite/Frontend/FrontendActions.h Sun Feb 7 > 13:28:36 2016 > @@ -50,8 +50,8 @@ public: > /// frontend action. > class FixItRecompile : public WrapperFrontendAction { > public: > - FixItRecompile(FrontendAction *WrappedAction) > - : WrapperFrontendAction(WrappedAction) {} > + FixItRecompile(std::unique_ptr<FrontendAction> WrappedAction) > + : WrapperFrontendAction(std::move(WrappedAction)) {} > > protected: > bool BeginInvocation(CompilerInstance &CI) override; > > Modified: cfe/trunk/lib/ARCMigrate/ARCMTActions.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ARCMTActions.cpp?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/ARCMTActions.cpp (original) > +++ cfe/trunk/lib/ARCMigrate/ARCMTActions.cpp Sun Feb 7 13:28:36 2016 > @@ -25,8 +25,8 @@ bool CheckAction::BeginInvocation(Compil > return true; > } > > -CheckAction::CheckAction(FrontendAction *WrappedAction) > - : WrapperFrontendAction(WrappedAction) {} > +CheckAction::CheckAction(std::unique_ptr<FrontendAction> WrappedAction) > + : WrapperFrontendAction(std::move(WrappedAction)) {} > > bool ModifyAction::BeginInvocation(CompilerInstance &CI) { > return !arcmt::applyTransformations(CI.getInvocation(), > getCurrentInput(), > @@ -34,8 +34,8 @@ bool ModifyAction::BeginInvocation(Compi > CI.getDiagnostics().getClient()); > } > > -ModifyAction::ModifyAction(FrontendAction *WrappedAction) > - : WrapperFrontendAction(WrappedAction) {} > +ModifyAction::ModifyAction(std::unique_ptr<FrontendAction> WrappedAction) > + : WrapperFrontendAction(std::move(WrappedAction)) {} > > bool MigrateAction::BeginInvocation(CompilerInstance &CI) { > if (arcmt::migrateWithTemporaryFiles( > @@ -49,11 +49,11 @@ bool MigrateAction::BeginInvocation(Comp > return true; > } > > -MigrateAction::MigrateAction(FrontendAction *WrappedAction, > +MigrateAction::MigrateAction(std::unique_ptr<FrontendAction> > WrappedAction, > StringRef migrateDir, > StringRef plistOut, > bool emitPremigrationARCErrors) > - : WrapperFrontendAction(WrappedAction), MigrateDir(migrateDir), > + : WrapperFrontendAction(std::move(WrappedAction)), > MigrateDir(migrateDir), > PlistOut(plistOut), > EmitPremigrationARCErros(emitPremigrationARCErrors) { > if (MigrateDir.empty()) > MigrateDir = "."; // user current directory if none is given. > > Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original) > +++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Sun Feb 7 13:28:36 2016 > @@ -179,10 +179,11 @@ protected: > > } > > -ObjCMigrateAction::ObjCMigrateAction(FrontendAction *WrappedAction, > +ObjCMigrateAction::ObjCMigrateAction( > + std::unique_ptr<FrontendAction> > WrappedAction, > StringRef migrateDir, > unsigned migrateAction) > - : WrapperFrontendAction(WrappedAction), MigrateDir(migrateDir), > + : WrapperFrontendAction(std::move(WrappedAction)), > MigrateDir(migrateDir), > ObjCMigAction(migrateAction), > CompInst(nullptr) { > if (MigrateDir.empty()) > > Modified: cfe/trunk/lib/Frontend/ASTMerge.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTMerge.cpp?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/lib/Frontend/ASTMerge.cpp (original) > +++ cfe/trunk/lib/Frontend/ASTMerge.cpp Sun Feb 7 13:28:36 2016 > @@ -83,14 +83,13 @@ void ASTMergeAction::EndSourceFileAction > return AdaptedAction->EndSourceFileAction(); > } > > -ASTMergeAction::ASTMergeAction(FrontendAction *AdaptedAction, > +ASTMergeAction::ASTMergeAction(std::unique_ptr<FrontendAction> > adaptedAction, > ArrayRef<std::string> ASTFiles) > - : AdaptedAction(AdaptedAction), ASTFiles(ASTFiles.begin(), > ASTFiles.end()) { > +: AdaptedAction(std::move(adaptedAction)), ASTFiles(ASTFiles.begin(), > ASTFiles.end()) { > assert(AdaptedAction && "ASTMergeAction needs an action to adapt"); > } > > ASTMergeAction::~ASTMergeAction() { > - delete AdaptedAction; > } > > bool ASTMergeAction::usesPreprocessorOnly() const { > > Modified: cfe/trunk/lib/Frontend/FrontendAction.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendAction.cpp?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/lib/Frontend/FrontendAction.cpp (original) > +++ cfe/trunk/lib/Frontend/FrontendAction.cpp Sun Feb 7 13:28:36 2016 > @@ -587,6 +587,7 @@ bool WrapperFrontendAction::hasCodeCompl > return WrappedAction->hasCodeCompletionSupport(); > } > > -WrapperFrontendAction::WrapperFrontendAction(FrontendAction > *WrappedAction) > - : WrappedAction(WrappedAction) {} > +WrapperFrontendAction::WrapperFrontendAction( > + std::unique_ptr<FrontendAction> WrappedAction) > + : WrappedAction(std::move(WrappedAction)) {} > > > Modified: cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp?rev=260048&r1=260047&r2=260048&view=diff > > ============================================================================== > --- cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp (original) > +++ cfe/trunk/lib/FrontendTool/ExecuteCompilerInvocation.cpp Sun Feb 7 > 13:28:36 2016 > @@ -31,33 +31,34 @@ > using namespace clang; > using namespace llvm::opt; > > -static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { > +static std::unique_ptr<FrontendAction> > +CreateFrontendBaseAction(CompilerInstance &CI) { > using namespace clang::frontend; > StringRef Action("unknown"); > (void)Action; > > switch (CI.getFrontendOpts().ProgramAction) { > - case ASTDeclList: return new ASTDeclListAction(); > - case ASTDump: return new ASTDumpAction(); > - case ASTPrint: return new ASTPrintAction(); > - case ASTView: return new ASTViewAction(); > - case DumpRawTokens: return new DumpRawTokensAction(); > - case DumpTokens: return new DumpTokensAction(); > - case EmitAssembly: return new EmitAssemblyAction(); > - case EmitBC: return new EmitBCAction(); > - case EmitHTML: return new HTMLPrintAction(); > - case EmitLLVM: return new EmitLLVMAction(); > - case EmitLLVMOnly: return new EmitLLVMOnlyAction(); > - case EmitCodeGenOnly: return new EmitCodeGenOnlyAction(); > - case EmitObj: return new EmitObjAction(); > - case FixIt: return new FixItAction(); > - case GenerateModule: return new GenerateModuleAction; > - case GeneratePCH: return new GeneratePCHAction; > - case GeneratePTH: return new GeneratePTHAction(); > - case InitOnly: return new InitOnlyAction(); > - case ParseSyntaxOnly: return new SyntaxOnlyAction(); > - case ModuleFileInfo: return new DumpModuleInfoAction(); > - case VerifyPCH: return new VerifyPCHAction(); > + case ASTDeclList: return > llvm::make_unique<ASTDeclListAction>(); > + case ASTDump: return llvm::make_unique<ASTDumpAction>(); > + case ASTPrint: return llvm::make_unique<ASTPrintAction>(); > + case ASTView: return llvm::make_unique<ASTViewAction>(); > + case DumpRawTokens: return > llvm::make_unique<DumpRawTokensAction>(); > + case DumpTokens: return > llvm::make_unique<DumpTokensAction>(); > + case EmitAssembly: return > llvm::make_unique<EmitAssemblyAction>(); > + case EmitBC: return llvm::make_unique<EmitBCAction>(); > + case EmitHTML: return > llvm::make_unique<HTMLPrintAction>(); > + case EmitLLVM: return llvm::make_unique<EmitLLVMAction>(); > + case EmitLLVMOnly: return > llvm::make_unique<EmitLLVMOnlyAction>(); > + case EmitCodeGenOnly: return > llvm::make_unique<EmitCodeGenOnlyAction>(); > + case EmitObj: return llvm::make_unique<EmitObjAction>(); > + case FixIt: return llvm::make_unique<FixItAction>(); > + case GenerateModule: return > llvm::make_unique<GenerateModuleAction>(); > + case GeneratePCH: return > llvm::make_unique<GeneratePCHAction>(); > + case GeneratePTH: return > llvm::make_unique<GeneratePTHAction>(); > + case InitOnly: return llvm::make_unique<InitOnlyAction>(); > + case ParseSyntaxOnly: return > llvm::make_unique<SyntaxOnlyAction>(); > + case ModuleFileInfo: return > llvm::make_unique<DumpModuleInfoAction>(); > + case VerifyPCH: return > llvm::make_unique<VerifyPCHAction>(); > > case PluginAction: { > for (FrontendPluginRegistry::iterator it = > @@ -67,7 +68,7 @@ static FrontendAction *CreateFrontendBas > std::unique_ptr<PluginASTAction> P(it->instantiate()); > if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs)) > return nullptr; > - return P.release(); > + return std::move(P); > } > } > > @@ -76,32 +77,33 @@ static FrontendAction *CreateFrontendBas > return nullptr; > } > > - case PrintDeclContext: return new DeclContextPrintAction(); > - case PrintPreamble: return new PrintPreambleAction(); > + case PrintDeclContext: return > llvm::make_unique<DeclContextPrintAction>(); > + case PrintPreamble: return > llvm::make_unique<PrintPreambleAction>(); > case PrintPreprocessedInput: { > if (CI.getPreprocessorOutputOpts().RewriteIncludes) > - return new RewriteIncludesAction(); > - return new PrintPreprocessedAction(); > + return llvm::make_unique<RewriteIncludesAction>(); > + return llvm::make_unique<PrintPreprocessedAction>(); > } > > - case RewriteMacros: return new RewriteMacrosAction(); > - case RewriteTest: return new RewriteTestAction(); > + case RewriteMacros: return > llvm::make_unique<RewriteMacrosAction>(); > + case RewriteTest: return > llvm::make_unique<RewriteTestAction>(); > #ifdef CLANG_ENABLE_OBJC_REWRITER > - case RewriteObjC: return new RewriteObjCAction(); > + case RewriteObjC: return > llvm::make_unique<RewriteObjCAction>(); > #else > case RewriteObjC: Action = "RewriteObjC"; break; > #endif > #ifdef CLANG_ENABLE_ARCMT > - case MigrateSource: return new arcmt::MigrateSourceAction(); > + case MigrateSource: > + return llvm::make_unique<arcmt::MigrateSourceAction>(); > #else > case MigrateSource: Action = "MigrateSource"; break; > #endif > #ifdef CLANG_ENABLE_STATIC_ANALYZER > - case RunAnalysis: return new ento::AnalysisAction(); > + case RunAnalysis: return > llvm::make_unique<ento::AnalysisAction>(); > #else > case RunAnalysis: Action = "RunAnalysis"; break; > #endif > - case RunPreprocessorOnly: return new PreprocessOnlyAction(); > + case RunPreprocessorOnly: return > llvm::make_unique<PreprocessOnlyAction>(); > } > > #if !defined(CLANG_ENABLE_ARCMT) || > !defined(CLANG_ENABLE_STATIC_ANALYZER) \ > @@ -113,16 +115,17 @@ static FrontendAction *CreateFrontendBas > #endif > } > > -static FrontendAction *CreateFrontendAction(CompilerInstance &CI) { > +static std::unique_ptr<FrontendAction> > +CreateFrontendAction(CompilerInstance &CI) { > // Create the underlying action. > - FrontendAction *Act = CreateFrontendBaseAction(CI); > + std::unique_ptr<FrontendAction> Act = CreateFrontendBaseAction(CI); > if (!Act) > return nullptr; > > const FrontendOptions &FEOpts = CI.getFrontendOpts(); > > if (FEOpts.FixAndRecompile) { > - Act = new FixItRecompile(Act); > + Act = llvm::make_unique<FixItRecompile>(std::move(Act)); > } > > #ifdef CLANG_ENABLE_ARCMT > @@ -133,13 +136,13 @@ static FrontendAction *CreateFrontendAct > case FrontendOptions::ARCMT_None: > break; > case FrontendOptions::ARCMT_Check: > - Act = new arcmt::CheckAction(Act); > + Act = llvm::make_unique<arcmt::CheckAction>(std::move(Act)); > break; > case FrontendOptions::ARCMT_Modify: > - Act = new arcmt::ModifyAction(Act); > + Act = llvm::make_unique<arcmt::ModifyAction>(std::move(Act)); > break; > case FrontendOptions::ARCMT_Migrate: > - Act = new arcmt::MigrateAction(Act, > + Act = llvm::make_unique<arcmt::MigrateAction>(std::move(Act), > FEOpts.MTMigrateDir, > FEOpts.ARCMTMigrateReportOut, > FEOpts.ARCMTMigrateEmitARCErrors); > @@ -147,8 +150,9 @@ static FrontendAction *CreateFrontendAct > } > > if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) { > - Act = new arcmt::ObjCMigrateAction(Act, FEOpts.MTMigrateDir, > - FEOpts.ObjCMTAction); > + Act = llvm::make_unique<arcmt::ObjCMigrateAction>(std::move(Act), > + > FEOpts.MTMigrateDir, > + > FEOpts.ObjCMTAction); > } > } > #endif > @@ -156,7 +160,8 @@ static FrontendAction *CreateFrontendAct > // If there are any AST files to merge, create a frontend action > // adaptor to perform the merge. > if (!FEOpts.ASTMergeFiles.empty()) > - Act = new ASTMergeAction(Act, FEOpts.ASTMergeFiles); > + Act = llvm::make_unique<ASTMergeAction>(std::move(Act), > + FEOpts.ASTMergeFiles); > > return Act; > } > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits