Author: David Blaikie Date: 2020-04-28T22:31:16-07:00 New Revision: e265f92b6e5e56b21fefdb83aec90f6e39c94857
URL: https://github.com/llvm/llvm-project/commit/e265f92b6e5e56b21fefdb83aec90f6e39c94857 DIFF: https://github.com/llvm/llvm-project/commit/e265f92b6e5e56b21fefdb83aec90f6e39c94857.diff LOG: AnalysisDeclContext::ManagedAnalyses: Use unique_ptr to simplify memory management Added: Modified: clang/include/clang/Analysis/Analyses/LiveVariables.h clang/include/clang/Analysis/Analyses/PostOrderCFGView.h clang/include/clang/Analysis/AnalysisDeclContext.h clang/lib/Analysis/AnalysisDeclContext.cpp clang/lib/Analysis/LiveVariables.cpp clang/lib/Analysis/PostOrderCFGView.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Analysis/Analyses/LiveVariables.h b/clang/include/clang/Analysis/Analyses/LiveVariables.h index a46c35ee5b30..2e7dd5d81678 100644 --- a/clang/include/clang/Analysis/Analyses/LiveVariables.h +++ b/clang/include/clang/Analysis/Analyses/LiveVariables.h @@ -70,8 +70,8 @@ class LiveVariables : public ManagedAnalysis { ~LiveVariables() override; /// Compute the liveness information for a given CFG. - static LiveVariables *computeLiveness(AnalysisDeclContext &analysisContext, - bool killAtAssign); + static std::unique_ptr<LiveVariables> + computeLiveness(AnalysisDeclContext &analysisContext, bool killAtAssign); /// Return true if a variable is live at the end of a /// specified block. @@ -97,7 +97,8 @@ class LiveVariables : public ManagedAnalysis { void runOnAllBlocks(Observer &obs); - static LiveVariables *create(AnalysisDeclContext &analysisContext) { + static std::unique_ptr<LiveVariables> + create(AnalysisDeclContext &analysisContext) { return computeLiveness(analysisContext, true); } @@ -110,7 +111,8 @@ class LiveVariables : public ManagedAnalysis { class RelaxedLiveVariables : public LiveVariables { public: - static LiveVariables *create(AnalysisDeclContext &analysisContext) { + static std::unique_ptr<LiveVariables> + create(AnalysisDeclContext &analysisContext) { return computeLiveness(analysisContext, false); } diff --git a/clang/include/clang/Analysis/Analyses/PostOrderCFGView.h b/clang/include/clang/Analysis/Analyses/PostOrderCFGView.h index 08fda0982df4..100029894560 100644 --- a/clang/include/clang/Analysis/Analyses/PostOrderCFGView.h +++ b/clang/include/clang/Analysis/Analyses/PostOrderCFGView.h @@ -108,7 +108,8 @@ class PostOrderCFGView : public ManagedAnalysis { // Used by AnalyisContext to construct this object. static const void *getTag(); - static PostOrderCFGView *create(AnalysisDeclContext &analysisContext); + static std::unique_ptr<PostOrderCFGView> + create(AnalysisDeclContext &analysisContext); }; } // namespace clang diff --git a/clang/include/clang/Analysis/AnalysisDeclContext.h b/clang/include/clang/Analysis/AnalysisDeclContext.h index ed554feedead..6fe1e27bda75 100644 --- a/clang/include/clang/Analysis/AnalysisDeclContext.h +++ b/clang/include/clang/Analysis/AnalysisDeclContext.h @@ -191,18 +191,17 @@ class AnalysisDeclContext { /// necessary or nullptr if the analysis could not run. template <typename T> T *getAnalysis() { const void *tag = T::getTag(); - ManagedAnalysis *&data = getAnalysisImpl(tag); - if (!data) { + std::unique_ptr<ManagedAnalysis> &data = getAnalysisImpl(tag); + if (!data) data = T::create(*this); - } - return static_cast<T *>(data); + return static_cast<T *>(data.get()); } /// \returns Whether the root namespace of \p D is the \c std C++ namespace. static bool isInStdNamespace(const Decl *D); private: - ManagedAnalysis *&getAnalysisImpl(const void *tag); + std::unique_ptr<ManagedAnalysis> &getAnalysisImpl(const void *tag); LocationContextManager &getLocationContextManager(); }; diff --git a/clang/lib/Analysis/AnalysisDeclContext.cpp b/clang/lib/Analysis/AnalysisDeclContext.cpp index 96d5807bcdfc..783de6442645 100644 --- a/clang/lib/Analysis/AnalysisDeclContext.cpp +++ b/clang/lib/Analysis/AnalysisDeclContext.cpp @@ -50,7 +50,7 @@ using namespace clang; -using ManagedAnalysisMap = llvm::DenseMap<const void *, ManagedAnalysis *>; +using ManagedAnalysisMap = llvm::DenseMap<const void *, std::unique_ptr<ManagedAnalysis>>; AnalysisDeclContext::AnalysisDeclContext(AnalysisDeclContextManager *ADCMgr, const Decl *D, @@ -617,7 +617,7 @@ AnalysisDeclContext::getReferencedBlockVars(const BlockDecl *BD) { return llvm::make_range(V->begin(), V->end()); } -ManagedAnalysis *&AnalysisDeclContext::getAnalysisImpl(const void *tag) { +std::unique_ptr<ManagedAnalysis> &AnalysisDeclContext::getAnalysisImpl(const void *tag) { if (!ManagedAnalyses) ManagedAnalyses = new ManagedAnalysisMap(); ManagedAnalysisMap *M = (ManagedAnalysisMap*) ManagedAnalyses; @@ -633,12 +633,7 @@ ManagedAnalysis::~ManagedAnalysis() = default; AnalysisDeclContext::~AnalysisDeclContext() { delete forcedBlkExprs; delete ReferencedBlockVars; - // Release the managed analyses. - if (ManagedAnalyses) { - ManagedAnalysisMap *M = (ManagedAnalysisMap*) ManagedAnalyses; - llvm::DeleteContainerSeconds(*M); - delete M; - } + delete (ManagedAnalysisMap*) ManagedAnalyses; } LocationContext::~LocationContext() = default; diff --git a/clang/lib/Analysis/LiveVariables.cpp b/clang/lib/Analysis/LiveVariables.cpp index f910338b0ad3..d24c40b457b4 100644 --- a/clang/lib/Analysis/LiveVariables.cpp +++ b/clang/lib/Analysis/LiveVariables.cpp @@ -490,9 +490,8 @@ LiveVariables::~LiveVariables() { delete (LiveVariablesImpl*) impl; } -LiveVariables * -LiveVariables::computeLiveness(AnalysisDeclContext &AC, - bool killAtAssign) { +std::unique_ptr<LiveVariables> +LiveVariables::computeLiveness(AnalysisDeclContext &AC, bool killAtAssign) { // No CFG? Bail out. CFG *cfg = AC.getCFG(); @@ -565,7 +564,7 @@ LiveVariables::computeLiveness(AnalysisDeclContext &AC, worklist.enqueuePredecessors(block); } - return new LiveVariables(LV); + return std::unique_ptr<LiveVariables>(new LiveVariables(LV)); } void LiveVariables::dumpBlockLiveness(const SourceManager &M) { diff --git a/clang/lib/Analysis/PostOrderCFGView.cpp b/clang/lib/Analysis/PostOrderCFGView.cpp index f79d0007cb3d..0c09c0f97ff6 100644 --- a/clang/lib/Analysis/PostOrderCFGView.cpp +++ b/clang/lib/Analysis/PostOrderCFGView.cpp @@ -29,11 +29,12 @@ PostOrderCFGView::PostOrderCFGView(const CFG *cfg) { } } -PostOrderCFGView *PostOrderCFGView::create(AnalysisDeclContext &ctx) { +std::unique_ptr<PostOrderCFGView> +PostOrderCFGView::create(AnalysisDeclContext &ctx) { const CFG *cfg = ctx.getCFG(); if (!cfg) return nullptr; - return new PostOrderCFGView(cfg); + return std::make_unique<PostOrderCFGView>(cfg); } const void *PostOrderCFGView::getTag() { static int x; return &x; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits