AnalysisDeclContext::ManagedAnalyses: Use unique_ptr to simplify memory management
authorDavid Blaikie <dblaikie@gmail.com>
Wed, 29 Apr 2020 03:54:57 +0000 (20:54 -0700)
committerDavid Blaikie <dblaikie@gmail.com>
Wed, 29 Apr 2020 05:31:16 +0000 (22:31 -0700)
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

index a46c35e..2e7dd5d 100644 (file)
@@ -70,8 +70,8 @@ public:
   ~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 @@ public:
 
   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 @@ private:
 
 class RelaxedLiveVariables : public LiveVariables {
 public:
-  static LiveVariables *create(AnalysisDeclContext &analysisContext) {
+  static std::unique_ptr<LiveVariables>
+  create(AnalysisDeclContext &analysisContext) {
     return computeLiveness(analysisContext, false);
   }
 
index 08fda09..1000298 100644 (file)
@@ -108,7 +108,8 @@ public:
   // 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
index ed554fe..6fe1e27 100644 (file)
@@ -191,18 +191,17 @@ public:
   /// 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();
 };
index 96d5807..783de64 100644 (file)
@@ -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;
index f910338..d24c40b 100644 (file)
@@ -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) {
index f79d000..0c09c0f 100644 (file)
@@ -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; }