[cfe-commits] r68731 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRState.h include/clang/Analysis/PathSensitive/SVals.h include/clang/Analysis/PathSensitive/Store.h include/clang/Analysis/PathSensitive/ValueManager.h lib/Analysis/BasicStore.cpp lib/Analysis/CFRefCount.cpp lib/Analysis/GRExprEngine.cpp lib/Analysis/GRSimpleVals.cpp lib/Analysis/RegionStore.cpp lib/Analysis/SVals.cpp

Ted Kremenek kremenek at apple.com
Thu Apr 9 15:22:45 PDT 2009


Author: kremenek
Date: Thu Apr  9 17:22:44 2009
New Revision: 68731

URL: http://llvm.org/viewvc/llvm-project?rev=68731&view=rev
Log:
- Move ownership of MemRegionManager into ValueManager.
- Pull SVal::GetConjuredSymbol() and friends into ValueManager. This greatly
simplifies the calling interface to clients.

Modified:
    cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
    cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
    cfe/trunk/include/clang/Analysis/PathSensitive/Store.h
    cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h
    cfe/trunk/lib/Analysis/BasicStore.cpp
    cfe/trunk/lib/Analysis/CFRefCount.cpp
    cfe/trunk/lib/Analysis/GRExprEngine.cpp
    cfe/trunk/lib/Analysis/GRSimpleVals.cpp
    cfe/trunk/lib/Analysis/RegionStore.cpp
    cfe/trunk/lib/Analysis/SVals.cpp

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

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h Thu Apr  9 17:22:44 2009
@@ -310,9 +310,6 @@
     Liveness(L) {
       StoreMgr.reset((*CreateStoreManager)(*this));
       ConstraintMgr.reset((*CreateConstraintManager)(*this));
-      
-      // FIXME: Have ValueMgr own the MemRegionManager, not StoreManager.
-      ValueMgr.setRegionManager(StoreMgr->getRegionManager());
   }
   
   ~GRStateManager();

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

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h Thu Apr  9 17:22:44 2009
@@ -72,15 +72,6 @@
     return !(*this == R);
   }
 
-  /// GetRValueSymbolVal - make a unique symbol for value of R.
-  static SVal GetRValueSymbolVal(SymbolManager& SymMgr, MemRegionManager& MRMgr,
-                                 const MemRegion* R);
-
-  static SVal GetConjuredSymbolVal(SymbolManager& SymMgr, MemRegionManager&,
-                                   const Expr *E, unsigned Count);  
-  static SVal GetConjuredSymbolVal(SymbolManager &SymMgr, MemRegionManager&,
-                                   const Expr* E, QualType T, unsigned Count);
-
   inline bool isUnknown() const {
     return getRawKind() == UnknownKind;
   }

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=68731&r1=68730&r2=68731&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/Store.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/Store.h Thu Apr  9 17:22:44 2009
@@ -16,6 +16,7 @@
 
 #include "clang/Analysis/PathSensitive/SVals.h"
 #include "clang/Analysis/PathSensitive/MemRegion.h"
+#include "clang/Analysis/PathSensitive/ValueManager.h"
 #include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/DenseSet.h"
@@ -35,10 +36,13 @@
   
 class StoreManager {
 protected:
+  ValueManager &ValMgr;
+
   /// MRMgr - Manages region objects associated with this StoreManager.
-  MemRegionManager MRMgr;
+  MemRegionManager &MRMgr;
 
-  StoreManager(llvm::BumpPtrAllocator& Alloc) : MRMgr(Alloc) {}
+  StoreManager(ValueManager &valMgr)
+    : ValMgr(valMgr), MRMgr(ValMgr.getRegionManager()) {}
 
 public:  
   virtual ~StoreManager() {}

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

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h Thu Apr  9 17:22:44 2009
@@ -22,11 +22,9 @@
 #include "clang/Analysis/PathSensitive/SymbolManager.h"
 
 namespace llvm { class BumpPtrAllocator; }
-namespace clang { class GRStateManager; }
 
 namespace clang {  
 class ValueManager {
-  friend class GRStateManager;
 
   ASTContext &Context;  
   BasicValueFactory BasicVals;
@@ -34,16 +32,14 @@
   /// SymMgr - Object that manages the symbol information.
   SymbolManager SymMgr;
 
-  // FIXME: Eventually ValueManager will own this object.
-  MemRegionManager *MemMgr;
 
-  void setRegionManager(MemRegionManager& mm) { MemMgr = &mm; }
+  MemRegionManager MemMgr;
   
 public:
   ValueManager(llvm::BumpPtrAllocator &alloc, ASTContext &context)
                : Context(context), BasicVals(Context, alloc),
                  SymMgr(Context, BasicVals, alloc),
-                 MemMgr(0) {}
+                 MemMgr(alloc) {}
 
   // Accessors to submanagers.
   
@@ -56,8 +52,8 @@
   SymbolManager &getSymbolManager() { return SymMgr; }
   const SymbolManager &getSymbolManager() const { return SymMgr; }
 
-  MemRegionManager &getRegionManager() { return *MemMgr; }
-  const MemRegionManager &getRegionManager() const { return *MemMgr; }
+  MemRegionManager &getRegionManager() { return MemMgr; }
+  const MemRegionManager &getRegionManager() const { return MemMgr; }
   
   // Forwarding methods to SymbolManager.
   
@@ -75,11 +71,17 @@
   // Aggregation methods that use multiple submanagers.
   
   Loc makeRegionVal(SymbolRef Sym) {
-    return Loc::MakeVal(MemMgr->getSymbolicRegion(Sym));
+    return Loc::MakeVal(MemMgr.getSymbolicRegion(Sym));
   }
   
   /// makeZeroVal - Construct an SVal representing '0' for the specified type.
   SVal makeZeroVal(QualType T);
+  
+  /// GetRValueSymbolVal - make a unique symbol for value of R.
+  SVal getRValueSymbolVal(const MemRegion* R);
+  
+  SVal getConjuredSymbolVal(const Expr *E, unsigned Count);  
+  SVal getConjuredSymbolVal(const Expr* E, QualType T, unsigned Count);
 };
 } // end clang namespace
 #endif

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

==============================================================================
--- cfe/trunk/lib/Analysis/BasicStore.cpp (original)
+++ cfe/trunk/lib/Analysis/BasicStore.cpp Thu Apr  9 17:22:44 2009
@@ -40,7 +40,7 @@
   
 public:
   BasicStoreManager(GRStateManager& mgr)
-    : StoreManager(mgr.getAllocator()),
+    : StoreManager(mgr.getValueManager()),
       VBFactory(mgr.getAllocator()), 
       StateMgr(mgr), 
       SelfRegion(0) {}
@@ -478,11 +478,8 @@
       if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(Base)) {
         if (DR->getDecl() == SelfDecl) {
           const MemRegion *IVR = MRMgr.getObjCIvarRegion(IV->getDecl(),
-                                                         SelfRegion);
-          
-          SVal X = SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(),
-                                            MRMgr, IVR);
-          
+                                                         SelfRegion);          
+          SVal X = ValMgr.getRValueSymbolVal(IVR);          
           St = BindInternal(St, Loc::MakeVal(IVR), X);
         }
       }
@@ -538,7 +535,7 @@
       const MemRegion *R = StateMgr.getRegion(VD);
       SVal X = (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD) ||
                 isa<ImplicitParamDecl>(VD))
-            ? SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(), MRMgr,R)
+            ? ValMgr.getRValueSymbolVal(R)
             : UndefinedVal();
 
       St = BindInternal(St, Loc::MakeVal(R), X);

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

==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Thu Apr  9 17:22:44 2009
@@ -1760,8 +1760,8 @@
             QualType T = R->getRValueType(Ctx);
           
             if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())){
-              SVal V = SVal::GetConjuredSymbolVal(Eng.getSymbolManager(),
-                        Eng.getStoreManager().getRegionManager(), *I, T, Count);
+              ValueManager &ValMgr = Eng.getValueManager();
+              SVal V = ValMgr.getConjuredSymbolVal(*I, T, Count);
               state = state.BindLoc(Loc::MakeVal(R), V);
             }
             else if (const RecordType *RT = T->getAsStructureType()) {
@@ -1787,13 +1787,10 @@
                 QualType FT = FD->getType();
                 
                 if (Loc::IsLocType(FT) || 
-                    (FT->isIntegerType() && FT->isScalarType())) {
-                  
+                    (FT->isIntegerType() && FT->isScalarType())) {                  
                   const FieldRegion* FR = MRMgr.getFieldRegion(FD, R);
-
-                  SVal V = SVal::GetConjuredSymbolVal(Eng.getSymbolManager(),
-                       Eng.getStoreManager().getRegionManager(), *I, FT, Count);
-
+                  ValueManager &ValMgr = Eng.getValueManager();
+                  SVal V = ValMgr.getConjuredSymbolVal(*I, FT, Count);
                   state = state.BindLoc(Loc::MakeVal(FR), V);
                 }                
               }
@@ -1857,8 +1854,8 @@
       
       if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())) {
         unsigned Count = Builder.getCurrentBlockCount();
-        SVal X = SVal::GetConjuredSymbolVal(Eng.getSymbolManager(),
-                       Eng.getStoreManager().getRegionManager(), Ex, T, Count);
+        ValueManager &ValMgr = Eng.getValueManager();
+        SVal X = ValMgr.getConjuredSymbolVal(Ex, T, Count);
         state = state.BindExpr(Ex, X, false);
       }      
       

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

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Thu Apr  9 17:22:44 2009
@@ -2139,8 +2139,7 @@
       // UnknownVal.
       if (InitVal.isUnknown() || 
           !getConstraintManager().canReasonAbout(InitVal)) {
-        InitVal = SVal::GetConjuredSymbolVal(SymMgr, 
-                          getStoreManager().getRegionManager(), InitEx, Count);
+        InitVal = ValMgr.getConjuredSymbolVal(InitEx, Count);
       }        
       
       state = StateMgr.BindDecl(state, VD, InitVal);
@@ -2531,9 +2530,8 @@
       
       // Conjure a new symbol if necessary to recover precision.
       if (Result.isUnknown() || !getConstraintManager().canReasonAbout(Result))
-        Result = SVal::GetConjuredSymbolVal(SymMgr, 
-                                       getStoreManager().getRegionManager(),Ex,
-                                            Builder->getCurrentBlockCount());
+        Result = ValMgr.getConjuredSymbolVal(Ex,
+                                             Builder->getCurrentBlockCount());
       
       state = BindExpr(state, U, U->isPostfix() ? V2 : Result);
 
@@ -2758,10 +2756,8 @@
                !getConstraintManager().canReasonAbout(RightV))              
               && (Loc::IsLocType(T) || 
                   (T->isScalarType() && T->isIntegerType()))) {
-            unsigned Count = Builder->getCurrentBlockCount();
-            
-            RightV = SVal::GetConjuredSymbolVal(SymMgr, 
-                      getStoreManager().getRegionManager(), B->getRHS(), Count);
+            unsigned Count = Builder->getCurrentBlockCount();            
+            RightV = ValMgr.getConjuredSymbolVal(B->getRHS(), Count);
           }
           
           // Simulate the effects of a "store":  bind the value of the RHS
@@ -2932,8 +2928,7 @@
           // The symbolic value is actually for the type of the left-hand side
           // expression, not the computation type, as this is the value the
           // LValue on the LHS will bind to.
-          LHSVal = SVal::GetConjuredSymbolVal(SymMgr, 
-                getStoreManager().getRegionManager(), B->getRHS(), LTy, Count);
+          LHSVal = ValMgr.getConjuredSymbolVal(B->getRHS(), LTy, Count);
           
           // However, we need to convert the symbol to the computation type.
           Result = (LTy == CTy) ? LHSVal : EvalCast(LHSVal,CTy);

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

==============================================================================
--- cfe/trunk/lib/Analysis/GRSimpleVals.cpp (original)
+++ cfe/trunk/lib/Analysis/GRSimpleVals.cpp Thu Apr  9 17:22:44 2009
@@ -449,10 +449,7 @@
   QualType T = CE->getType();  
   if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())) {    
     unsigned Count = Builder.getCurrentBlockCount();
-        
-    SVal X = SVal::GetConjuredSymbolVal(Eng.getSymbolManager(),
-                          Eng.getStoreManager().getRegionManager(), CE, Count);
-    
+    SVal X = Eng.getValueManager().getConjuredSymbolVal(CE, Count);
     St = StateMgr.BindExpr(St, CE, X, Eng.getCFG().isBlkExpr(CE), false);
   }  
     

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

==============================================================================
--- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
+++ cfe/trunk/lib/Analysis/RegionStore.cpp Thu Apr  9 17:22:44 2009
@@ -148,7 +148,7 @@
 
 public:
   RegionStoreManager(GRStateManager& mgr) 
-    : StoreManager(mgr.getAllocator()),
+    : StoreManager(mgr.getValueManager()),
       RBFactory(mgr.getAllocator()),
       RVFactory(mgr.getAllocator()),
       StateMgr(mgr), SelfRegion(0), SelfDecl(0) {
@@ -159,8 +159,6 @@
 
   virtual ~RegionStoreManager() {}
 
-  MemRegionManager& getRegionManager() { return MRMgr; }
-  
   SubRegionMap* getSubRegionMap(const GRState *state);
   
   const GRState* BindCompoundLiteral(const GRState* St, 
@@ -756,7 +754,7 @@
     if (SR == SelfRegion) {
       // FIXME: Do we need to handle the case where the super region
       // has a view?  We want to canonicalize the bindings.
-      return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, R);
+      return ValMgr.getRValueSymbolVal(R);
     }
     
     // Otherwise, we need a new symbol.  For now return Unknown.
@@ -778,7 +776,7 @@
         VD->hasGlobalStorage()) {
       QualType VTy = VD->getType();
       if (Loc::IsLocType(VTy) || VTy->isIntegerType())
-        return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, VR);
+        return ValMgr.getRValueSymbolVal(VR);
       else
         return UnknownVal();
     }
@@ -794,7 +792,7 @@
 
   // All other integer values are symbolic.
   if (Loc::IsLocType(RTy) || RTy->isIntegerType())
-    return SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, R);
+    return ValMgr.getRValueSymbolVal(R);
   else
     return UnknownVal();
 }
@@ -833,7 +831,7 @@
       if (MRMgr.onStack(FR) || MRMgr.onHeap(FR))
         FieldValue = UndefinedVal();
       else
-        FieldValue = SVal::GetRValueSymbolVal(getSymbolManager(), MRMgr, FR);
+        FieldValue = ValMgr.getRValueSymbolVal(FR);
     }
 
     StructVal = getBasicVals().consVals(FieldValue, StructVal);

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

==============================================================================
--- cfe/trunk/lib/Analysis/SVals.cpp (original)
+++ cfe/trunk/lib/Analysis/SVals.cpp Thu Apr  9 17:22:44 2009
@@ -280,15 +280,14 @@
   return nonloc::CompoundVal(BasicVals.getCompoundValData(T, Vals));
 }
 
-SVal SVal::GetRValueSymbolVal(SymbolManager& SymMgr, MemRegionManager& MRMgr,
-                              const MemRegion* R) {
+SVal ValueManager::getRValueSymbolVal(const MemRegion* R) {
   SymbolRef sym = SymMgr.getRegionRValueSymbol(R);
                                 
   if (const TypedRegion* TR = dyn_cast<TypedRegion>(R)) {
     QualType T = TR->getRValueType(SymMgr.getContext());
     
     if (Loc::IsLocType(T))
-      return Loc::MakeVal(MRMgr.getSymbolicRegion(sym));
+      return Loc::MakeVal(MemMgr.getSymbolicRegion(sym));
   
     // Only handle integers for now.
     if (T->isIntegerType() && T->isScalarType())
@@ -298,13 +297,12 @@
   return UnknownVal();
 }
 
-SVal SVal::GetConjuredSymbolVal(SymbolManager &SymMgr, MemRegionManager& MRMgr,
-                                const Expr* E, unsigned Count) {
+SVal ValueManager::getConjuredSymbolVal(const Expr* E, unsigned Count) {
   QualType T = E->getType();
   SymbolRef sym = SymMgr.getConjuredSymbol(E, Count);
 
   if (Loc::IsLocType(T))
-    return Loc::MakeVal(MRMgr.getSymbolicRegion(sym));
+    return Loc::MakeVal(MemMgr.getSymbolicRegion(sym));
 
   if (T->isIntegerType() && T->isScalarType())
     return NonLoc::MakeVal(sym);
@@ -312,12 +310,13 @@
   return UnknownVal();
 }
 
-SVal SVal::GetConjuredSymbolVal(SymbolManager &SymMgr, MemRegionManager& MRMgr,
-                                const Expr* E, QualType T, unsigned Count) {
+SVal ValueManager::getConjuredSymbolVal(const Expr* E, QualType T,
+                                        unsigned Count) {
+
   SymbolRef sym = SymMgr.getConjuredSymbol(E, T, Count);
 
   if (Loc::IsLocType(T))
-    return Loc::MakeVal(MRMgr.getSymbolicRegion(sym));
+    return Loc::MakeVal(MemMgr.getSymbolicRegion(sym));
 
   if (T->isIntegerType() && T->isScalarType())
     return NonLoc::MakeVal(sym);





More information about the cfe-commits mailing list