]> granicus.if.org Git - clang/commitdiff
static analyzer: Make GRStates reference counted, with reference counts managed by...
authorTed Kremenek <kremenek@apple.com>
Thu, 10 Feb 2011 02:21:52 +0000 (02:21 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 10 Feb 2011 02:21:52 +0000 (02:21 +0000)
This reduces memory usage of the analyzer on sqlite by another 5%.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125260 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h
include/clang/StaticAnalyzer/Core/PathSensitive/GRState.h
lib/StaticAnalyzer/Core/ExplodedGraph.cpp

index e1cc6fd6301747ad8a8c3d966f896088695e46e7..e5d6876fa6b2ec4865950fb219c83c38903773ee 100644 (file)
@@ -118,7 +118,11 @@ public:
 
   explicit ExplodedNode(const ProgramPoint& loc, const GRState* state)
     : Location(loc), State(state) {
-    const_cast<GRState*>(State)->setReferencedByExplodedNode();
+    const_cast<GRState*>(State)->incrementReferenceCount();
+  }
+  
+  ~ExplodedNode() {
+    const_cast<GRState*>(State)->decrementReferenceCount();
   }
 
   /// getLocation - Returns the edge associated with the given node.
index 3e34e69e5aa2570370554887e0b9af58fe6dc472..a2cbb20e7b1baa4579da94337b1e85b6777b6af1 100644 (file)
@@ -79,11 +79,13 @@ private:
 
   friend class GRStateManager;
   friend class ExplodedGraph;
+  friend class ExplodedNode;
 
-  llvm::PointerIntPair<GRStateManager *, 1, bool> stateMgr;
+  GRStateManager *stateMgr;
   Environment Env;           // Maps a Stmt to its current SVal.
   Store St;                  // Maps a location to its current value.
   GenericDataMap   GDM;      // Custom data stored by a client of this class.
+  unsigned refCount;
 
   /// makeWithStore - Return a GRState with the same values as the current
   ///  state with the exception of using the specified Store.
@@ -94,33 +96,27 @@ public:
   /// This ctor is used when creating the first GRState object.
   GRState(GRStateManager *mgr, const Environment& env,
           Store st, GenericDataMap gdm)
-    : stateMgr(mgr, false),
+    : stateMgr(mgr),
       Env(env),
       St(st),
-      GDM(gdm) {}
+      GDM(gdm),
+      refCount(0) {}
 
   /// Copy ctor - We must explicitly define this or else the "Next" ptr
   ///  in FoldingSetNode will also get copied.
   GRState(const GRState& RHS)
     : llvm::FoldingSetNode(),
-      stateMgr(RHS.stateMgr.getPointer(), false),
+      stateMgr(RHS.stateMgr),
       Env(RHS.Env),
       St(RHS.St),
-      GDM(RHS.GDM) {}
+      GDM(RHS.GDM),
+      refCount(0) {}
 
   /// Return the GRStateManager associated with this state.
-  GRStateManager &getStateManager() const {
-    return *stateMgr.getPointer();
-  }
+  GRStateManager &getStateManager() const { return *stateMgr; }
 
   /// Return true if this state is referenced by a persistent ExplodedNode.
-  bool referencedByExplodedNode() const {
-    return stateMgr.getInt();
-  }
-  
-  void setReferencedByExplodedNode() {
-    stateMgr.setInt(true);
-  }
+  bool referencedByExplodedNode() const { return refCount > 0; }
 
   /// getEnvironment - Return the environment associated with this state.
   ///  The environment is the mapping from expressions to values.
@@ -373,6 +369,16 @@ public:
   void printStdErr(CFG &C) const;
 
   void printDOT(llvm::raw_ostream& Out, CFG &C) const;
+
+private:
+  /// Increments the number of times this state is referenced by ExplodeNodes.
+  void incrementReferenceCount() { ++refCount; }
+
+  /// Decrement the number of times this state is referenced by ExplodeNodes.
+  void decrementReferenceCount() {
+    assert(refCount > 0);
+    --refCount;
+  }
 };
 
 class GRStateSet {
index 84fcacab63a6c17b0f3625e9158ec176461be82f..3ce50d65391926ce507cafa20d7a31695dd59ca1 100644 (file)
@@ -123,6 +123,8 @@ void ExplodedGraph::reclaimRecentlyAllocatedNodes() {
       freeNodes = new NodeList();
     getNodeList(freeNodes)->push_back(node);
     Nodes.RemoveNode(node);
+    --NumNodes;
+    node->~ExplodedNode();
   }
   
   nl.clear();