]> granicus.if.org Git - clang/commitdiff
Remove another dependency on GRStateRef.
authorTed Kremenek <kremenek@apple.com>
Thu, 18 Jun 2009 00:49:02 +0000 (00:49 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 18 Jun 2009 00:49:02 +0000 (00:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73667 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/GRState.h
lib/Analysis/CFRefCount.cpp

index ae5423111fcdc568173253ada22f42d3989e4868..c9424c92310348aa3a6e63f4651c6170cf70fad6 100644 (file)
@@ -158,6 +158,10 @@ public:
   
   BasicValueFactory &getBasicVals() const;
   SymbolManager &getSymbolManager() const;
+  
+  const GRState *bind(Loc location, SVal V) const;
+  
+  const GRState *bind(SVal location, SVal V) const;    
 
   SVal getLValue(const VarDecl* VD) const;
 
@@ -173,6 +177,8 @@ public:
   
   SVal getSValAsScalarOrLoc(const MemRegion *R) const;
   
+  template <typename CB> CB scanReachableSymbols(SVal val) const;
+  
   // Trait based GDM dispatch.  
   void* const* FindGDM(void* K) const;
   
@@ -195,6 +201,14 @@ public:
   template <typename T>
   typename GRStateTrait<T>::context_type get_context() const;
     
+  
+  template<typename T>
+  const GRState *remove(typename GRStateTrait<T>::key_type K) const;
+
+  template<typename T>
+  const GRState *remove(typename GRStateTrait<T>::key_type K,
+                        typename GRStateTrait<T>::context_type C) const;
+  
   template<typename T>
   const GRState *set(typename GRStateTrait<T>::data_type D) const;
   
@@ -717,6 +731,14 @@ public:
 // Out-of-line method definitions for GRState.
 //===----------------------------------------------------------------------===//
 
+inline const GRState *GRState::bind(Loc LV, SVal V) const {
+  return Mgr->BindLoc(this, LV, V);
+}
+
+inline const GRState *GRState::bind(SVal LV, SVal V) const {
+  return !isa<Loc>(LV) ? this : bind(cast<Loc>(LV), V);
+}
+  
 inline SVal GRState::getLValue(const VarDecl* VD) const {
   return Mgr->GetLValue(this, VD);
 }  
@@ -763,6 +785,17 @@ typename GRStateTrait<T>::context_type GRState::get_context() const {
   return Mgr->get_context<T>();
 }
   
+template<typename T>
+const GRState *GRState::remove(typename GRStateTrait<T>::key_type K) const {
+  return Mgr->remove<T>(this, K, get_context<T>());
+}
+
+template<typename T>
+const GRState *GRState::remove(typename GRStateTrait<T>::key_type K,
+                               typename GRStateTrait<T>::context_type C) const {
+  return Mgr->remove<T>(this, K, C);
+}
+  
 template<typename T>
 const GRState *GRState::set(typename GRStateTrait<T>::data_type D) const {
   return Mgr->set<T>(this, D);
@@ -780,6 +813,13 @@ const GRState *GRState::set(typename GRStateTrait<T>::key_type K,
                             typename GRStateTrait<T>::context_type C) const {
   return Mgr->set<T>(this, K, E, C);
 }
+  
+template <typename CB>
+CB GRState::scanReachableSymbols(SVal val) const {
+  CB cb(this);
+  Mgr->scanReachableSymbols(val, this, cb);
+  return cb;
+}
 
 //===----------------------------------------------------------------------===//
 // GRStateRef - A "fat" reference to GRState that also bundles GRStateManager.
index d1f6bc8b31072a5de96a0d81f2032a3360d94d75..94fb9f6bb5b6189c1bc1e1bbdc5792bfdf4c5c53 100644 (file)
@@ -3114,17 +3114,15 @@ void CFRefCount::EvalObjCMessageExpr(ExplodedNodeSet<GRState>& Dst,
 
 namespace {
 class VISIBILITY_HIDDEN StopTrackingCallback : public SymbolVisitor {
-  GRStateRef state;
+  const GRState *state;
 public:
-  StopTrackingCallback(GRStateRef st) : state(st) {}
-  GRStateRef getState() { return state; }
+  StopTrackingCallback(const GRState *st) : state(st) {}
+  const GRState *getState() const { return state; }
 
   bool VisitSymbol(SymbolRef sym) {
-    state = state.remove<RefBindings>(sym);
+    state = state->remove<RefBindings>(sym);
     return true;
   }
-  
-  const GRState* getState() const { return state.getState(); }
 };
 } // end anonymous namespace
   
@@ -3139,7 +3137,7 @@ void CFRefCount::EvalBind(GRStmtNodeBuilderRef& B, SVal location, SVal val) {
   // (2) we are binding to a memregion that does not have stack storage
   // (3) we are binding to a memregion with stack storage that the store
   //     does not understand.  
-  GRStateRef state = B.getState();
+  const GRState *state = B.getState();
 
   if (!isa<loc::MemRegionVal>(location))
     escapes = true;
@@ -3151,7 +3149,7 @@ void CFRefCount::EvalBind(GRStmtNodeBuilderRef& B, SVal location, SVal val) {
       // To test (3), generate a new state with the binding removed.  If it is
       // the same state, then it escapes (since the store cannot represent
       // the binding).
-      escapes = (state == (state.BindLoc(cast<Loc>(location), UnknownVal())));
+      escapes = (state == (state->bind(cast<Loc>(location), UnknownVal())));
     }
   }
 
@@ -3163,10 +3161,9 @@ void CFRefCount::EvalBind(GRStmtNodeBuilderRef& B, SVal location, SVal val) {
 
   // Otherwise, find all symbols referenced by 'val' that we are tracking
   // and stop tracking them.
-  B.MakeNode(state.scanReachableSymbols<StopTrackingCallback>(val).getState());
+  B.MakeNode(state->scanReachableSymbols<StopTrackingCallback>(val).getState());
 }
 
-
  // Return statements.
 
 void CFRefCount::EvalReturn(ExplodedNodeSet<GRState>& Dst,