]> granicus.if.org Git - clang/commitdiff
Makes GRState::makeWithStore private, to encourage clients to make store changes...
authorJordy Rose <jediknil@belkadan.com>
Tue, 3 Aug 2010 20:44:35 +0000 (20:44 +0000)
committerJordy Rose <jediknil@belkadan.com>
Tue, 3 Aug 2010 20:44:35 +0000 (20:44 +0000)
This is in preparation for proposed region change notifications. No functionality change.

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

include/clang/Checker/PathSensitive/GRState.h
include/clang/Checker/PathSensitive/Store.h
lib/Checker/CFRefCount.cpp
lib/Checker/GRCXXExprEngine.cpp
lib/Checker/GRExprEngine.cpp
lib/Checker/RegionStore.cpp
lib/Checker/Store.cpp

index 63587a3c5fb5cb34707f81627d7ecfebbd7f7dcd..3f7442d0feb3910569c44a3a2af5d50499ce182b 100644 (file)
@@ -77,6 +77,10 @@ private:
   Store St;
   GenericDataMap   GDM;
 
+  /// makeWithStore - Return a GRState with the same values as the current
+  ///  state with the exception of using the specified Store.
+  const GRState *makeWithStore(Store store) const;
+
 public:
 
   /// This ctor is used when creating the first GRState object.
@@ -134,10 +138,6 @@ public:
     return Env.LookupExpr(E);
   }
 
-  /// makeWithStore - Return a GRState with the same values as the current
-  /// state with the exception of using the specified Store.
-  const GRState *makeWithStore(Store store) const;
-
   BasicValueFactory &getBasicVals() const;
   SymbolManager &getSymbolManager() const;
 
@@ -215,6 +215,28 @@ public:
 
   const GRState *unbindLoc(Loc LV) const;
 
+  /// InvalidateRegion - Returns the state with bindings for the given region
+  ///  cleared from the store. See InvalidateRegions.
+  const GRState *InvalidateRegion(const MemRegion *R,
+                                  const Expr *E, unsigned BlockCount,
+                                  StoreManager::InvalidatedSymbols *IS = NULL)
+                                  const {
+    return InvalidateRegions(&R, &R+1, E, BlockCount, IS, false);
+  }
+
+  /// InvalidateRegions - Returns the state with bindings for the given regions
+  ///  cleared from the store. The regions are provided as a continuous array
+  ///  from Begin to End. Optionally invalidates global regions as well.
+  const GRState *InvalidateRegions(const MemRegion * const *Begin,
+                                   const MemRegion * const *End,
+                                   const Expr *E, unsigned BlockCount,
+                                   StoreManager::InvalidatedSymbols *IS,
+                                   bool invalidateGlobals) const;
+
+  /// EnterStackFrame - Returns the state for entry to the given stack frame,
+  ///  preserving the current state.
+  const GRState *EnterStackFrame(const StackFrameContext *frame) const;
+
   /// Get the lvalue for a variable reference.
   Loc getLValue(const VarDecl *D, const LocationContext *LC) const;
 
@@ -629,6 +651,25 @@ inline const GRState *GRState::bindDefault(SVal loc, SVal V) const {
   return makeWithStore(new_store);
 }
 
+inline const GRState *
+GRState::InvalidateRegions(const MemRegion * const *Begin,
+                           const MemRegion * const *End,
+                           const Expr *E, unsigned Count,
+                           StoreManager::InvalidatedSymbols *IS,
+                           bool invalidateGlobals) const {
+  Store new_store
+    = getStateManager().StoreMgr->InvalidateRegions(St, Begin, End,
+                                                    E, Count, IS,
+                                                    invalidateGlobals);
+  return makeWithStore(new_store);
+}
+
+inline const GRState *
+GRState::EnterStackFrame(const StackFrameContext *frame) const {
+  Store new_store = getStateManager().StoreMgr->EnterStackFrame(this, frame);
+  return makeWithStore(new_store);
+}
+
 inline Loc GRState::getLValue(const VarDecl* VD,
                                const LocationContext *LC) const {
   return getStateManager().StoreMgr->getLValueVar(VD, LC);
index 7a60ebb0838e3ca58a610c70912d8af4c23fad08..07f02a7e625b5579620d821c66416836146560e7 100644 (file)
@@ -159,12 +159,7 @@ public:
   virtual Store BindDeclWithNoInit(Store store, const VarRegion *VR) = 0;
 
   typedef llvm::DenseSet<SymbolRef> InvalidatedSymbols;
-  
-  virtual Store InvalidateRegion(Store store,
-                                 const MemRegion *R,
-                                 const Expr *E, unsigned Count,
-                                 InvalidatedSymbols *IS) = 0;
-  
+
   virtual Store InvalidateRegions(Store store,
                                   const MemRegion * const *Begin,
                                   const MemRegion * const *End,
@@ -174,10 +169,8 @@ public:
 
   /// EnterStackFrame - Let the StoreManager to do something when execution
   /// engine is about to execute into a callee.
-  virtual const GRState *EnterStackFrame(const GRState *state,
-                                         const StackFrameContext *frame) {
-    return state;
-  }
+  virtual Store EnterStackFrame(const GRState *state,
+                                const StackFrameContext *frame);
 
   virtual void print(Store store, llvm::raw_ostream& Out,
                      const char* nl, const char *sep) = 0;
index e4a2a39fbe7fe0fb8e6744438260c6745cea5246..b3f29392b192f2ce420e91be7fd036de96b14ca6 100644 (file)
@@ -2712,19 +2712,16 @@ void CFRefCount::EvalSummary(ExplodedNodeSet& Dst,
   //  expression (the context) and the expression itself.  This should
   //  disambiguate conjured symbols.
   unsigned Count = Builder.getCurrentBlockCount();
-  StoreManager& StoreMgr = Eng.getStateManager().getStoreManager();
   StoreManager::InvalidatedSymbols IS;
-  Store store = state->getStore();
 
   // NOTE: Even if RegionsToInvalidate is empty, we must still invalidate
   //  global variables.
-  store = StoreMgr.InvalidateRegions(store, RegionsToInvalidate.data(),
-                                     RegionsToInvalidate.data() +
-                                     RegionsToInvalidate.size(),
-                                     Ex, Count, &IS,
-                                     /* invalidateGlobals = */ true);
+  state = state->InvalidateRegions(RegionsToInvalidate.data(),
+                                   RegionsToInvalidate.data() +
+                                   RegionsToInvalidate.size(),
+                                   Ex, Count, &IS,
+                                   /* invalidateGlobals = */ true);
 
-  state = state->makeWithStore(store);
   for (StoreManager::InvalidatedSymbols::iterator I = IS.begin(),
        E = IS.end(); I!=E; ++I) {
     SymbolRef sym = *I;
index d9cd3de87e52da3e0ad156604472e4d70265e6ec..53c9ab67e17ab9f4269cebfc4cb047e92e4c6311 100644 (file)
@@ -197,10 +197,7 @@ void GRExprEngine::VisitCXXNewExpr(const CXXNewExpr *CNE, ExplodedNode *Pred,
     const GRState *state = GetState(*I);
 
     if (ObjTy->isRecordType()) {
-      Store store = state->getStore();
-      StoreManager::InvalidatedSymbols IS;
-      store = getStoreManager().InvalidateRegion(store, EleReg, CNE, Count, &IS);
-      state = state->makeWithStore(store);
+      state = state->InvalidateRegion(EleReg, CNE, Count);
     } else {
       if (CNE->hasInitializer()) {
         SVal V = state->getSVal(*CNE->constructor_arg_begin());
index 328dacfe909329dd45692e989d085549ddfe2b1f..7f8bb9b0cf5b6d388ddbc560b46d433d6861a084 100644 (file)
@@ -1454,8 +1454,7 @@ void GRExprEngine::ProcessCallEnter(GRCallEnterNodeBuilder &B) {
                          B.getBlock(),
                          B.getIndex());
 
-  const GRState *state = B.getState();
-  state = getStoreManager().EnterStackFrame(state, LocCtx);
+  const GRState *state = B.getState()->EnterStackFrame(LocCtx);
 
   B.GenerateNode(state, LocCtx);
 }
index f7e19f6f5104ec72a1f48bf77d72065dd36433ea..733254311f4aead0d3a7c8a2e52526c1a0e1b097 100644 (file)
@@ -357,8 +357,7 @@ public: // Part of public interface to class.
                                     SymbolReaper& SymReaper,
                           llvm::SmallVectorImpl<const MemRegion*>& RegionRoots);
 
-  const GRState *EnterStackFrame(const GRState *state,
-                                 const StackFrameContext *frame);
+  Store EnterStackFrame(const GRState *state, const StackFrameContext *frame);
 
   //===------------------------------------------------------------------===//
   // Region "extents".
@@ -1841,8 +1840,8 @@ const GRState *RegionStoreManager::RemoveDeadBindings(GRState &state,
 }
 
 
-GRState const *RegionStoreManager::EnterStackFrame(GRState const *state,
-                                               StackFrameContext const *frame) {
+Store RegionStoreManager::EnterStackFrame(const GRState *state,
+                                          const StackFrameContext *frame) {
   FunctionDecl const *FD = cast<FunctionDecl>(frame->getDecl());
   FunctionDecl::param_const_iterator PI = FD->param_begin();
   Store store = state->getStore();
@@ -1866,9 +1865,9 @@ GRState const *RegionStoreManager::EnterStackFrame(GRState const *state,
       store = Bind(store, ValMgr.makeLoc(MRMgr.getVarRegion(*PI,frame)),ArgVal);
     }
   } else
-    assert(0 && "Unhandled call expression.");
+    llvm_unreachable("Unhandled call expression.");
 
-  return state->makeWithStore(store);
+  return store;
 }
 
 //===----------------------------------------------------------------------===//
index b3aab66512784e55897c64de949a0bd36145da67..7a43f7bd6618ef5ac71b0f2b6542fc54fd038656 100644 (file)
@@ -21,6 +21,11 @@ StoreManager::StoreManager(GRStateManager &stateMgr)
   : ValMgr(stateMgr.getValueManager()), StateMgr(stateMgr),
     MRMgr(ValMgr.getRegionManager()), Ctx(stateMgr.getContext()) {}
 
+Store StoreManager::EnterStackFrame(const GRState *state,
+                                    const StackFrameContext *frame) {
+  return state->getStore();
+}
+
 const MemRegion *StoreManager::MakeElementRegion(const MemRegion *Base,
                                               QualType EleTy, uint64_t index) {
   SVal idx = ValMgr.makeArrayIndex(index);