[cfe-commits] r66163 - in /cfe/trunk: include/clang/Analysis/PathSensitive/MemRegion.h include/clang/Analysis/PathSensitive/Store.h lib/Analysis/BasicStore.cpp lib/Analysis/BugReporter.cpp lib/Analysis/CFRefCount.cpp

Ted Kremenek kremenek at apple.com
Thu Mar 5 08:31:08 PST 2009


Author: kremenek
Date: Thu Mar  5 10:31:07 2009
New Revision: 66163

URL: http://llvm.org/viewvc/llvm-project?rev=66163&view=rev
Log:
BasicStore:
- Store bindings using a MemRegion -> SVal binding instead of VarDecl -> SVal
  binding. This mirrors some of the idea of RegionStore, but is far simpler and
  not nearly as functional.  This leads to some code simplification and
  some potential for some minor precision hacks.
  
Along the way...
- constify the use of MemRegion* in a few places
- add operator<<(llvm::raw_ostream, const MemRegion*)


Modified:
    cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
    cfe/trunk/include/clang/Analysis/PathSensitive/Store.h
    cfe/trunk/lib/Analysis/BasicStore.cpp
    cfe/trunk/lib/Analysis/BugReporter.cpp
    cfe/trunk/lib/Analysis/CFRefCount.cpp

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h?rev=66163&r1=66162&r2=66163&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h Thu Mar  5 10:31:07 2009
@@ -543,9 +543,15 @@
 
 private:
   MemSpaceRegion* LazyAllocate(MemSpaceRegion*& region);
-};
+};  
+} // end clang namespace
 
+namespace llvm {
+static inline raw_ostream& operator<<(raw_ostream& O,
+                                      const clang::MemRegion* R) { 
+  R->print(O);
+  return O;
+}
+} // end llvm namespace
 
-  
-} // end clang namespace
 #endif

Modified: cfe/trunk/include/clang/Analysis/PathSensitive/Store.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/Store.h?rev=66163&r1=66162&r2=66163&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/Store.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/Store.h Thu Mar  5 10:31:07 2009
@@ -156,7 +156,7 @@
   public:    
     virtual ~BindingsHandler();
     virtual bool HandleBinding(StoreManager& SMgr, Store store,
-                               MemRegion* R, SVal val) = 0;
+                               const MemRegion* R, SVal val) = 0;
   };
   
   /// iterBindings - Iterate over the bindings in the Store.

Modified: cfe/trunk/lib/Analysis/BasicStore.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicStore.cpp?rev=66163&r1=66162&r2=66163&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/BasicStore.cpp (original)
+++ cfe/trunk/lib/Analysis/BasicStore.cpp Thu Mar  5 10:31:07 2009
@@ -19,7 +19,7 @@
 
 using namespace clang;
 
-typedef llvm::ImmutableMap<const VarDecl*,SVal> VarBindingsTy;  
+typedef llvm::ImmutableMap<const MemRegion*,SVal> VarBindingsTy;  
 
 namespace {
   
@@ -307,7 +307,7 @@
       
       Store store = state->getStore();
       VarBindingsTy B = GetVarBindings(store);
-      VarBindingsTy::data_type* T = B.lookup(R->getDecl());      
+      VarBindingsTy::data_type* T = B.lookup(R);
       return T ? *T : UnknownVal();
     }
       
@@ -341,8 +341,8 @@
       
       VarBindingsTy B = GetVarBindings(store);
       return V.isUnknown()
-        ? VBFactory.Remove(B, R->getDecl()).getRoot()
-        : VBFactory.Add(B, R->getDecl(), V).getRoot();
+        ? VBFactory.Remove(B, R).getRoot()
+        : VBFactory.Add(B, R, V).getRoot();
     }
     default:
       assert ("SetSVal for given Loc type not yet implemented.");
@@ -360,7 +360,7 @@
         return store;
       
       VarBindingsTy B = GetVarBindings(store);
-      return VBFactory.Remove(B,R->getDecl()).getRoot();
+      return VBFactory.Remove(B, R).getRoot();
     }
     default:
       assert ("Remove for given Loc type not yet implemented.");
@@ -379,14 +379,16 @@
   typedef SVal::symbol_iterator symbol_iterator;
   
   // Iterate over the variable bindings.
-  for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I)
-    if (SymReaper.isLive(Loc, I.getKey())) {
-      RegionRoots.push_back(MRMgr.getVarRegion(I.getKey()));      
+  for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) {
+    const VarRegion *VR = cast<VarRegion>(I.getKey());
+    if (SymReaper.isLive(Loc, VR->getDecl())) {
+      RegionRoots.push_back(VR);      
       SVal X = I.getData();
       
       for (symbol_iterator SI=X.symbol_begin(), SE=X.symbol_end(); SI!=SE; ++SI)
         SymReaper.markLive(*SI);
     }
+  }
   
   // Scan for live variables and live symbols.
   llvm::SmallPtrSet<const VarRegion*, 10> Marked;
@@ -427,7 +429,7 @@
   
   // Remove dead variable bindings.  
   for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I!=E ; ++I) {
-    const VarRegion* R = cast<VarRegion>(MRMgr.getVarRegion(I.getKey()));
+    const VarRegion* R = cast<VarRegion>(I.getKey());
     
     if (!Marked.count(R)) {
       store = Remove(store, Loc::MakeVal(R));
@@ -548,9 +550,10 @@
   return store;
 }
 
-void BasicStoreManager::print(Store store, std::ostream& Out,
+void BasicStoreManager::print(Store store, std::ostream& O,
                               const char* nl, const char *sep) {
       
+  llvm::raw_os_ostream Out(O);
   VarBindingsTy B = GetVarBindings(store);
   Out << "Variables:" << nl;
   
@@ -560,7 +563,7 @@
     if (isFirst) isFirst = false;
     else Out << nl;
     
-    Out << ' ' << I.getKey()->getNameAsString() << " : ";
+    Out << ' ' << I.getKey() << " : ";
     I.getData().print(Out);
   }
 }
@@ -569,10 +572,9 @@
 void BasicStoreManager::iterBindings(Store store, BindingsHandler& f) {
   VarBindingsTy B = GetVarBindings(store);
   
-  for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I) {
+  for (VarBindingsTy::iterator I=B.begin(), E=B.end(); I != E; ++I)
+    f.HandleBinding(*this, store, I.getKey(), I.getData());
 
-    f.HandleBinding(*this, store, MRMgr.getVarRegion(I.getKey()),I.getData());
-  }
 }
 
 StoreManager::BindingsHandler::~BindingsHandler() {}

Modified: cfe/trunk/lib/Analysis/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BugReporter.cpp?rev=66163&r1=66162&r2=66163&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/BugReporter.cpp (original)
+++ cfe/trunk/lib/Analysis/BugReporter.cpp Thu Mar  5 10:31:07 2009
@@ -419,7 +419,8 @@
                        PathDiagnostic& pd, BugReporter& br)
     : Sym(sym), PrevSt(prevst), S(s), VMgr(vmgr), Pred(pred), PD(pd), BR(br) {}
                         
-  bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal V) {
+  bool HandleBinding(StoreManager& SMgr, Store store,
+                     const MemRegion* R, SVal V) {
 
     SymbolRef ScanSym;
     
@@ -521,7 +522,8 @@
                      PathDiagnostic& pd)
     : N(n), S(s), BR(br), PD(pd) {}
   
-  bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal V) {
+  bool HandleBinding(StoreManager& SMgr, Store store,
+                     const MemRegion* R, SVal V) {
     SymbolRef ScanSym;
   
     if (loc::SymbolVal* SV = dyn_cast<loc::SymbolVal>(&V))

Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=66163&r1=66162&r2=66163&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Thu Mar  5 10:31:07 2009
@@ -2663,13 +2663,14 @@
 class VISIBILITY_HIDDEN FindUniqueBinding :
   public StoreManager::BindingsHandler {
     SymbolRef Sym;
-    MemRegion* Binding;
+    const MemRegion* Binding;
     bool First;
     
   public:
     FindUniqueBinding(SymbolRef sym) : Sym(sym), Binding(0), First(true) {}
     
-  bool HandleBinding(StoreManager& SMgr, Store store, MemRegion* R, SVal val) {
+  bool HandleBinding(StoreManager& SMgr, Store store, const MemRegion* R,
+                     SVal val) {
     SymbolRef SymV = val.getAsSymbol();
     
     if (!SymV.isValid() || SymV != Sym)
@@ -2686,7 +2687,7 @@
   }
     
   operator bool() { return First && Binding; }
-  MemRegion* getRegion() { return Binding; }
+  const MemRegion* getRegion() { return Binding; }
 };  
 }
 





More information about the cfe-commits mailing list