]> granicus.if.org Git - clang/commitdiff
Implement RegionStoreManager::Remove().
authorZhongxing Xu <xuzhongxing@gmail.com>
Tue, 16 Dec 2008 02:36:30 +0000 (02:36 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Tue, 16 Dec 2008 02:36:30 +0000 (02:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61069 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/RegionStore.cpp

index b78c2edb1449ad108e219174ad8ce31308efa797..98b408156f1fabf2e8f64cb773b76570c3ef2b0b 100644 (file)
@@ -111,10 +111,7 @@ public:
 
   Store Bind(Store St, Loc LV, SVal V);
 
-  Store Remove(Store store, Loc LV) {
-    // FIXME: Implement.
-    return store;
-  }
+  Store Remove(Store store, Loc LV);
 
   Store getInitialStore();
   
@@ -141,7 +138,7 @@ public:
   const GRState* setExtent(const GRState* St, const MemRegion* R, SVal Extent);
 
   static inline RegionBindingsTy GetRegionBindings(Store store) {
-    return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store));
+   return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store));
   }
 
   void print(Store store, std::ostream& Out, const char* nl, const char *sep);
@@ -482,6 +479,15 @@ Store RegionStoreManager::Bind(Store store, Loc LV, SVal V) {
          : RBFactory.Add(B, R, V).getRoot();
 }
 
+Store RegionStoreManager::Remove(Store store, Loc L) {
+  RegionBindingsTy B = GetRegionBindings(store);
+
+  const MemRegion* R = cast<loc::MemRegionVal>(L).getRegion();
+  assert(R);
+
+  return RBFactory.Remove(B, R).getRoot();
+}
+
 Store RegionStoreManager::BindStruct(Store store, const TypedRegion* R, SVal V){
   // Verify we want getRValueType.
   QualType T = R->getRValueType(getContext());
@@ -747,7 +753,7 @@ Store RegionStoreManager::RemoveDeadBindings(const GRState* state, Stmt* Loc,
       continue;
     
     // Remove this dead region from the store.
-    store = Remove(store, loc::MemRegionVal(R));
+    store = Remove(store, Loc::MakeVal(R));
 
     // Mark all non-live symbols that this region references as dead.
     if (const SymbolicRegion* SymR = dyn_cast<SymbolicRegion>(R)) {