[cfe-commits] r73771 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRExprEngine.h include/clang/Analysis/PathSensitive/GRState.h lib/Analysis/GRExprEngine.cpp

Ted Kremenek kremenek at apple.com
Fri Jun 19 10:10:33 PDT 2009


Author: kremenek
Date: Fri Jun 19 12:10:32 2009
New Revision: 73771

URL: http://llvm.org/viewvc/llvm-project?rev=73771&view=rev
Log:
Remove more GetSVal/GetLValue methods in GRExprEngine/GRState, instead
preferring to use their replacements in GRState. This further unifies the code
paths for such logic and leads to some code reduction.

Modified:
    cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
    cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h
    cfe/trunk/lib/Analysis/GRExprEngine.cpp

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

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Fri Jun 19 12:10:32 2009
@@ -477,47 +477,11 @@
   const SymbolManager& getSymbolManager() const { return SymMgr; }
   
 protected:
-  
   const GRState* GetState(NodeTy* N) {
     return N == EntryNode ? CleanedState : N->getState();
   }
   
-public:
-  
-  const GRState* BindExpr(const GRState* St, Expr* Ex, SVal V) {
-    return StateMgr.BindExpr(St, Ex, V);
-  }
-  
-  const GRState* BindExpr(const GRState* St, const Expr* Ex, SVal V) {
-    return BindExpr(St, const_cast<Expr*>(Ex), V);
-  }
-    
-protected:
- 
-  const GRState* BindBlkExpr(const GRState* St, Expr* Ex, SVal V) {
-    return StateMgr.BindExpr(St, Ex, V, true, false);
-  }
-  
-  const GRState* BindLoc(const GRState* St, Loc LV, SVal V) {
-    return StateMgr.BindLoc(St, LV, V);
-  }
-
-  SVal GetSVal(const GRState* St, Stmt* Ex) {
-    return StateMgr.GetSVal(St, Ex);
-  }
-    
-  SVal GetSVal(const GRState* St, const Stmt* Ex) {
-    return GetSVal(St, const_cast<Stmt*>(Ex));
-  }
-  
-  SVal GetBlkExprSVal(const GRState* St, Stmt* Ex) {
-    return StateMgr.GetBlkExprSVal(St, Ex);
-  }
-    
-  SVal GetSVal(const GRState* St, Loc LV, QualType T = QualType()) {    
-    return StateMgr.GetSVal(St, LV, T);
-  }
-  
+public:  
   inline NonLoc MakeConstantVal(uint64_t X, Expr* Ex) {
     return NonLoc::MakeVal(getBasicVals(), X, Ex->getType());
   }  

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=73771&r1=73770&r2=73771&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h Fri Jun 19 12:10:32 2009
@@ -202,10 +202,21 @@
   // Binding and retrieving values to/from the environment and symbolic store.
   //==---------------------------------------------------------------------==//
   
+  /// BindCompoundLiteral - Return the state that has the bindings currently
+  ///  in 'state' plus the bindings for the CompoundLiteral.  'R' is the region
+  ///  for the compound literal and 'BegInit' and 'EndInit' represent an
+  ///  array of initializer values.
+  const GRState* bindCompoundLiteral(const CompoundLiteralExpr* CL,
+                                     SVal V) const;
+  
   const GRState *bindExpr(const Stmt* Ex, SVal V, bool isBlkExpr,
                           bool Invalidate) const;
   
-  const GRState *bindExpr(const Stmt* Ex, SVal V, bool Invalidate = true) const;  
+  const GRState *bindExpr(const Stmt* Ex, SVal V, bool Invalidate = true) const;
+  
+  const GRState *bindBlkExpr(const Stmt *Ex, SVal V) const {
+    return bindExpr(Ex, V, true, false);
+  }
   
   const GRState *bindLoc(Loc location, SVal V) const;
   
@@ -213,7 +224,22 @@
   
   const GRState *unbindLoc(Loc LV) const;
 
-  SVal getLValue(const VarDecl* VD) const;
+  /// Get the lvalue for a variable reference.
+  SVal getLValue(const VarDecl *decl) const;
+  
+  /// Get the lvalue for a StringLiteral.
+  SVal getLValue(const StringLiteral *literal) const;
+  
+  SVal getLValue(const CompoundLiteralExpr *literal) const;
+  
+  /// Get the lvalue for an ivar reference.
+  SVal getLValue(const ObjCIvarDecl *decl, SVal base) const;
+  
+  /// Get the lvalue for a field reference.
+  SVal getLValue(SVal Base, const FieldDecl *decl) const;
+  
+  /// Get the lvalue for an array index.
+  SVal getLValue(QualType ElementType, SVal Base, SVal Idx) const;
   
   const llvm::APSInt *getSymVal(SymbolRef sym) const;
 
@@ -481,15 +507,6 @@
     // Store manager should return a persistent state.
     return StoreMgr->BindDeclWithNoInit(St, VD);
   }
-  
-  /// BindCompoundLiteral - Return the state that has the bindings currently
-  ///  in 'state' plus the bindings for the CompoundLiteral.  'R' is the region
-  ///  for the compound literal and 'BegInit' and 'EndInit' represent an
-  ///  array of initializer values.
-  const GRState* BindCompoundLiteral(const GRState* St,
-                                     const CompoundLiteralExpr* CL, SVal V) {
-    return StoreMgr->BindCompoundLiteral(St, CL, V);
-  }
 
   const GRState* RemoveDeadBindings(const GRState* St, Stmt* Loc, 
                                     SymbolReaper& SymReaper);
@@ -512,34 +529,6 @@
   }
   
 private:
-  // Get the lvalue for a variable reference.
-  SVal GetLValue(const GRState* St, const VarDecl* D) {
-    return StoreMgr->getLValueVar(St, D);
-  }
-
-  // Get the lvalue for a StringLiteral.
-  SVal GetLValue(const GRState* St, const StringLiteral* E) {
-    return StoreMgr->getLValueString(St, E);
-  }
-
-  SVal GetLValue(const GRState* St, const CompoundLiteralExpr* CL) {
-    return StoreMgr->getLValueCompoundLiteral(St, CL);
-  }
-
-  // Get the lvalue for an ivar reference.
-  SVal GetLValue(const GRState* St, const ObjCIvarDecl* D, SVal Base) {
-    return StoreMgr->getLValueIvar(St, D, Base);
-  }
-  
-  // Get the lvalue for a field reference.
-  SVal GetLValue(const GRState* St, SVal Base, const FieldDecl* D) {
-    return StoreMgr->getLValueField(St, Base, D);
-  }
-  
-  // Get the lvalue for an array index.
-  SVal GetLValue(const GRState* St, QualType ElementType, SVal Base, SVal Idx) {
-    return StoreMgr->getLValueElement(St, ElementType, Base, Idx);
-  }  
 
   // Methods that query & manipulate the Environment.  
   SVal GetSVal(const GRState* St, const Stmt* Ex) {
@@ -738,7 +727,12 @@
 inline const GRState *GRState::assumeInBound(SVal Idx, SVal UpperBound,
                                              bool Assumption) const {
   return Mgr->ConstraintMgr->AssumeInBound(this, Idx, UpperBound, Assumption);
-}  
+} 
+
+inline const GRState *GRState::bindCompoundLiteral(const CompoundLiteralExpr* CL,
+                                            SVal V) const {
+  return Mgr->StoreMgr->BindCompoundLiteral(this, CL, V);
+}
   
 inline const GRState *GRState::bindExpr(const Stmt* Ex, SVal V, bool isBlkExpr,
                                         bool Invalidate) const {
@@ -759,8 +753,28 @@
 }
   
 inline SVal GRState::getLValue(const VarDecl* VD) const {
-  return Mgr->GetLValue(this, VD);
-}  
+  return Mgr->StoreMgr->getLValueVar(this, VD);
+}
+
+inline SVal GRState::getLValue(const StringLiteral *literal) const {
+  return Mgr->StoreMgr->getLValueString(this, literal);
+}
+  
+inline SVal GRState::getLValue(const CompoundLiteralExpr *literal) const {
+  return Mgr->StoreMgr->getLValueCompoundLiteral(this, literal);
+}
+
+inline SVal GRState::getLValue(const ObjCIvarDecl *D, SVal Base) const {
+  return Mgr->StoreMgr->getLValueIvar(this, D, Base);
+}
+  
+inline SVal GRState::getLValue(SVal Base, const FieldDecl* D) const {
+  return Mgr->StoreMgr->getLValueField(this, Base, D);
+}
+  
+inline SVal GRState::getLValue(QualType ElementType, SVal Base, SVal Idx) const{
+  return Mgr->StoreMgr->getLValueElement(this, ElementType, Base, Idx);
+}
   
 inline const llvm::APSInt *GRState::getSymVal(SymbolRef sym) const {
   return Mgr->getSymVal(this, sym);

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

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Fri Jun 19 12:10:32 2009
@@ -177,7 +177,7 @@
       QualType T = PD->getType();
       if (T->isIntegerType())
         if (const MemRegion *R = StateMgr.getRegion(PD)) {
-          SVal V = GetSVal(state, loc::MemRegionVal(R));
+          SVal V = state->getSVal(loc::MemRegionVal(R));
           SVal Constraint = EvalBinOp(state, BinaryOperator::GT, V,
                                       ValMgr.makeZeroVal(T),
                                       getContext().IntTy);          
@@ -309,7 +309,7 @@
       }
       else if (B->getOpcode() == BinaryOperator::Comma) {
         const GRState* state = GetState(Pred);
-        MakeNode(Dst, B, Pred, BindExpr(state, B, GetSVal(state, B->getRHS())));
+        MakeNode(Dst, B, Pred, state->bindExpr(B, state->getSVal(B->getRHS())));
         break;
       }
 
@@ -425,7 +425,7 @@
                
       if (Expr* LastExpr = dyn_cast<Expr>(*SE->getSubStmt()->body_rbegin())) {
         const GRState* state = GetState(Pred);
-        MakeNode(Dst, SE, Pred, BindExpr(state, SE, GetSVal(state, LastExpr)));
+        MakeNode(Dst, SE, Pred, state->bindExpr(SE, state->getSVal(LastExpr)));
       }
       else
         Dst.Add(Pred);
@@ -505,8 +505,8 @@
 
     case Stmt::StringLiteralClass: {
       const GRState* state = GetState(Pred);
-      SVal V = StateMgr.GetLValue(state, cast<StringLiteral>(Ex));
-      MakeNode(Dst, Ex, Pred, BindExpr(state, Ex, V));
+      SVal V = state->getLValue(cast<StringLiteral>(Ex));
+      MakeNode(Dst, Ex, Pred, state->bindExpr(Ex, V));
       return;
     }
       
@@ -578,7 +578,7 @@
                  (Op == BinaryOperator::LOr && !branchTaken)  
                ? B->getRHS() : B->getLHS();
         
-      return BindBlkExpr(state, B, UndefinedVal(Ex));
+      return state->bindBlkExpr(B, UndefinedVal(Ex));
     }
       
     case Stmt::ConditionalOperatorClass: { // ?:
@@ -595,7 +595,7 @@
       else
         Ex = C->getRHS();
       
-      return BindBlkExpr(state, C, UndefinedVal(Ex));
+      return state->bindBlkExpr(C, UndefinedVal(Ex));
     }
       
     case Stmt::ChooseExprClass: { // ?:
@@ -603,7 +603,7 @@
       ChooseExpr* C = cast<ChooseExpr>(Terminator);
       
       Expr* Ex = branchTaken ? C->getLHS() : C->getRHS();      
-      return BindBlkExpr(state, C, UndefinedVal(Ex));
+      return state->bindBlkExpr(C, UndefinedVal(Ex));
     }
   }
 }
@@ -664,7 +664,7 @@
                                 Condition->getLocStart(),
                                 "Error evaluating branch");
   
-  SVal V = GetSVal(PrevState, Condition);
+  SVal V = PrevState->getSVal(Condition);
   
   switch (V.getBaseKind()) {
     default:
@@ -723,8 +723,8 @@
 ///  nodes by processing the 'effects' of a computed goto jump.
 void GRExprEngine::ProcessIndirectGoto(IndirectGotoNodeBuilder& builder) {
 
-  const GRState* state = builder.getState();  
-  SVal V = GetSVal(state, builder.getTarget());
+  const GRState *state = builder.getState();  
+  SVal V = state->getSVal(builder.getTarget());
   
   // Three possibilities:
   //
@@ -770,18 +770,16 @@
   assert (Ex == CurrentStmt && getCFG().isBlkExpr(Ex));
   
   const GRState* state = GetState(Pred);
-  SVal X = GetBlkExprSVal(state, Ex);
+  SVal X = state->getBlkExprSVal(Ex);
   
   assert (X.isUndef());
   
-  Expr* SE = (Expr*) cast<UndefinedVal>(X).getData();
-  
-  assert (SE);
-  
-  X = GetBlkExprSVal(state, SE);
+  Expr *SE = (Expr*) cast<UndefinedVal>(X).getData();
+  assert(SE);  
+  X = state->getBlkExprSVal(SE);
   
   // Make sure that we invalidate the previous binding.
-  MakeNode(Dst, Ex, Pred, StateMgr.BindExpr(state, Ex, X, true, true));
+  MakeNode(Dst, Ex, Pred, state->bindExpr(Ex, X, true, true));
 }
 
 /// ProcessSwitch - Called by GRCoreEngine.  Used to generate successor
@@ -790,7 +788,7 @@
   typedef SwitchNodeBuilder::iterator iterator;  
   const GRState* state = builder.getState();  
   Expr* CondE = builder.getCondition();
-  SVal  CondV = GetSVal(state, CondE);
+  SVal  CondV = state->getSVal(CondE);
 
   if (CondV.isUndef()) {
     NodeTy* N = builder.generateDefaultCaseNode(state, true);
@@ -876,28 +874,27 @@
 void GRExprEngine::VisitLogicalExpr(BinaryOperator* B, NodeTy* Pred,
                                     NodeSet& Dst) {
   
-  assert (B->getOpcode() == BinaryOperator::LAnd ||
-          B->getOpcode() == BinaryOperator::LOr);
+  assert(B->getOpcode() == BinaryOperator::LAnd ||
+         B->getOpcode() == BinaryOperator::LOr);
   
-  assert (B == CurrentStmt && getCFG().isBlkExpr(B));
+  assert(B == CurrentStmt && getCFG().isBlkExpr(B));
   
   const GRState* state = GetState(Pred);
-  SVal X = GetBlkExprSVal(state, B);
-  
-  assert (X.isUndef());
+  SVal X = state->getBlkExprSVal(B);
+  assert(X.isUndef());
   
   Expr* Ex = (Expr*) cast<UndefinedVal>(X).getData();
   
-  assert (Ex);
+  assert(Ex);
   
   if (Ex == B->getRHS()) {
     
-    X = GetBlkExprSVal(state, Ex);
+    X = state->getBlkExprSVal(Ex);
     
     // Handle undefined values.
     
     if (X.isUndef()) {
-      MakeNode(Dst, B, Pred, BindBlkExpr(state, B, X));
+      MakeNode(Dst, B, Pred, state->bindBlkExpr(B, X));
       return;
     }
     
@@ -908,17 +905,17 @@
     // this right now, and since most logical expressions are used for branches,
     // the payoff is not likely to be large.  Instead, we do eager evaluation.        
     if (const GRState *newState = state->assume(X, true))
-      MakeNode(Dst, B, Pred, BindBlkExpr(newState, B, MakeConstantVal(1U, B)));
+      MakeNode(Dst, B, Pred, newState->bindBlkExpr(B, MakeConstantVal(1U, B)));
       
     if (const GRState *newState = state->assume(X, false))
-      MakeNode(Dst, B, Pred, BindBlkExpr(newState, B, MakeConstantVal(0U, B)));
+      MakeNode(Dst, B, Pred, newState->bindBlkExpr(B, MakeConstantVal(0U, B)));
   }
   else {
     // We took the LHS expression.  Depending on whether we are '&&' or
     // '||' we know what the value of the expression is via properties of
     // the short-circuiting.
     X = MakeConstantVal( B->getOpcode() == BinaryOperator::LAnd ? 0U : 1U, B);
-    MakeNode(Dst, B, Pred, BindBlkExpr(state, B, X));
+    MakeNode(Dst, B, Pred, state->bindBlkExpr(B, X));
   }
 }
  
@@ -935,10 +932,10 @@
 
   if (const VarDecl* VD = dyn_cast<VarDecl>(D)) {
 
-    SVal V = StateMgr.GetLValue(state, VD);
+    SVal V = state->getLValue(VD);
 
     if (asLValue)
-      MakeNode(Dst, Ex, Pred, BindExpr(state, Ex, V),
+      MakeNode(Dst, Ex, Pred, state->bindExpr(Ex, V),
                ProgramPoint::PostLValueKind);
     else
       EvalLoad(Dst, Ex, Pred, state, V);
@@ -949,13 +946,13 @@
 
     BasicValueFactory& BasicVals = StateMgr.getBasicVals();
     SVal V = nonloc::ConcreteInt(BasicVals.getValue(ED->getInitVal()));
-    MakeNode(Dst, Ex, Pred, BindExpr(state, Ex, V));
+    MakeNode(Dst, Ex, Pred, state->bindExpr(Ex, V));
     return;
 
   } else if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(D)) {
     assert(asLValue);
     SVal V = ValMgr.getFunctionPointer(FD);
-    MakeNode(Dst, Ex, Pred, BindExpr(state, Ex, V),
+    MakeNode(Dst, Ex, Pred, state->bindExpr(Ex, V),
              ProgramPoint::PostLValueKind);
     return;
   }
@@ -988,12 +985,11 @@
       
     for (NodeSet::iterator I2=Tmp2.begin(), E2=Tmp2.end(); I2!=E2; ++I2) {
       const GRState* state = GetState(*I2);
-      SVal V = StateMgr.GetLValue(state, A->getType(),
-                                  GetSVal(state, Base),
-                                  GetSVal(state, Idx));
+      SVal V = state->getLValue(A->getType(), state->getSVal(Base),
+                                state->getSVal(Idx));
 
       if (asLValue)
-        MakeNode(Dst, A, *I2, BindExpr(state, A, V),
+        MakeNode(Dst, A, *I2, state->bindExpr(A, V),
                  ProgramPoint::PostLValueKind);
       else
         EvalLoad(Dst, A, *I2, state, V);
@@ -1022,10 +1018,10 @@
     // FIXME: Should we insert some assumption logic in here to determine
     // if "Base" is a valid piece of memory?  Before we put this assumption
     // later when using FieldOffset lvals (which we no longer have).
-    SVal L = StateMgr.GetLValue(state, GetSVal(state, Base), Field);
+    SVal L = state->getLValue(state->getSVal(Base), Field);
 
     if (asLValue)
-      MakeNode(Dst, M, *I, BindExpr(state, M, L),
+      MakeNode(Dst, M, *I, state->bindExpr(M, L),
                ProgramPoint::PostLValueKind);
     else
       EvalLoad(Dst, M, *I, state, L);
@@ -1109,11 +1105,11 @@
 
   if (location.isUnknown()) {
     // This is important.  We must nuke the old binding.
-    MakeNode(Dst, Ex, Pred, BindExpr(state, Ex, UnknownVal()), K, tag);
+    MakeNode(Dst, Ex, Pred, state->bindExpr(Ex, UnknownVal()), K, tag);
   }
   else {
-    SVal V = GetSVal(state, cast<Loc>(location), Ex->getType());
-    MakeNode(Dst, Ex, Pred, BindExpr(state, Ex, V), K, tag);
+    SVal V = state->getSVal(cast<Loc>(location), Ex->getType());
+    MakeNode(Dst, Ex, Pred, state->bindExpr(Ex, V), K, tag);
   }
 }
 
@@ -1317,14 +1313,14 @@
         ExplodedNode<GRState> *predNew = *I2;
         const GRState *stateNew = predNew->getState();
         SVal Res = Engine.getValueManager().makeTruthVal(true, CE->getType());
-        Engine.MakeNode(Dst, CE, predNew, Engine.BindExpr(stateNew, CE, Res));
+        Engine.MakeNode(Dst, CE, predNew, stateNew->bindExpr(CE, Res));
       }
     }
     
     // Were they not equal?
     if (const GRState *stateNotEqual = stateLoad->assume(Cmp, false)) {
       SVal Res = Engine.getValueManager().makeTruthVal(false, CE->getType());
-      Engine.MakeNode(Dst, CE, N, Engine.BindExpr(stateNotEqual, CE, Res));
+      Engine.MakeNode(Dst, CE, N, stateNotEqual->bindExpr(CE, Res));
     }
   }
       
@@ -1418,7 +1414,7 @@
   for (NodeSet::iterator DI = DstTmp.begin(), DE = DstTmp.end(); DI!=DE; ++DI) {
 
     const GRState* state = GetState(*DI);
-    SVal L = GetSVal(state, Callee);
+    SVal L = state->getSVal(Callee);
 
     // FIXME: Add support for symbolic function calls (calls involving
     //  function pointer values that are symbolic).
@@ -1463,7 +1459,7 @@
             if (!memcmp(s, "panic", 5)) Builder->BuildSinks = true;
             else if (!memcmp(s, "error", 5)) {
               if (CE->getNumArgs() > 0) {
-                SVal X = GetSVal(state, *CE->arg_begin());
+                SVal X = state->getSVal(*CE->arg_begin());
                 // FIXME: use Assume to inspect the possible symbolic value of
                 // X. Also check the specific signature of error().
                 nonloc::ConcreteInt* CI = dyn_cast<nonloc::ConcreteInt>(&X);
@@ -1530,8 +1526,8 @@
           case Builtin::BI__builtin_expect: {
             // For __builtin_expect, just return the value of the subexpression.
             assert (CE->arg_begin() != CE->arg_end());            
-            SVal X = GetSVal(state, *(CE->arg_begin()));
-            MakeNode(Dst, CE, *DI, BindExpr(state, CE, X));
+            SVal X = state->getSVal(*(CE->arg_begin()));
+            MakeNode(Dst, CE, *DI, state->bindExpr(CE, X));
             continue;            
           }
             
@@ -1544,10 +1540,10 @@
             // Set the extent of the region in bytes. This enables us to use the
             // SVal of the argument directly. If we save the extent in bits, we
             // cannot represent values like symbol*8.
-            SVal Extent = GetSVal(state, *(CE->arg_begin()));
+            SVal Extent = state->getSVal(*(CE->arg_begin()));
             state = getStoreManager().setExtent(state, R, Extent);
 
-            MakeNode(Dst, CE, *DI, BindExpr(state, CE, loc::MemRegionVal(R)));
+            MakeNode(Dst, CE, *DI, state->bindExpr(CE, loc::MemRegionVal(R)));
             continue;            
           }
             
@@ -1563,7 +1559,7 @@
     for (CallExpr::arg_iterator I = CE->arg_begin(), E = CE->arg_end();
          I != E; ++I) {
 
-      if (GetSVal(GetState(*DI), *I).isUndef()) {        
+      if (GetState(*DI)->getSVal(*I).isUndef()) {        
         NodeTy* N = Builder->generateNode(CE, GetState(*DI), *DI);
       
         if (N) {
@@ -1615,7 +1611,7 @@
     }    
 
     const GRState* state = Pred->getState();    
-    SVal V = GetSVal(state, Ex);    
+    SVal V = state->getSVal(Ex);    
     if (isa<nonloc::SymExprVal>(V)) {
       // First assume that the condition is true.
       if (const GRState *stateTrue = state->assume(V, true)) {
@@ -1650,11 +1646,11 @@
   
   for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
     const GRState* state = GetState(*I);
-    SVal BaseVal = GetSVal(state, Base);
-    SVal location = StateMgr.GetLValue(state, Ex->getDecl(), BaseVal);
+    SVal BaseVal = state->getSVal(Base);
+    SVal location = state->getLValue(Ex->getDecl(), BaseVal);
     
     if (asLValue)
-      MakeNode(Dst, Ex, *I, BindExpr(state, Ex, location));
+      MakeNode(Dst, Ex, *I, state->bindExpr(Ex, location));
     else
       EvalLoad(Dst, Ex, *I, state, location);
   }
@@ -1698,7 +1694,7 @@
   if (DeclStmt* DS = dyn_cast<DeclStmt>(elem)) {
     VarDecl* ElemD = cast<VarDecl>(DS->getSingleDecl());
     assert (ElemD->getInit() == 0);
-    ElementV = getStateManager().GetLValue(GetState(Pred), ElemD);
+    ElementV = GetState(Pred)->getLValue(ElemD);
     VisitObjCForCollectionStmtAux(S, Pred, Dst, ElementV);
     return;
   }
@@ -1708,7 +1704,7 @@
   
   for (NodeSet::iterator I = Tmp.begin(), E = Tmp.end(); I!=E; ++I) {
     const GRState* state = GetState(*I);
-    VisitObjCForCollectionStmtAux(S, *I, Dst, GetSVal(state, elem));
+    VisitObjCForCollectionStmtAux(S, *I, Dst, state->getSVal(elem));
   }
 }
 
@@ -1813,7 +1809,7 @@
   
   if (Expr* Receiver = ME->getReceiver()) {
     
-    SVal L = GetSVal(state, Receiver);
+    SVal L = state->getSVal(Receiver);
     
     // Check for undefined control-flow.    
     if (L.isUndef()) {
@@ -1887,7 +1883,7 @@
               // of this case unless we have *a lot* more knowledge.
               //
               SVal V = ValMgr.makeZeroVal(ME->getType());
-              MakeNode(Dst, ME, Pred, BindExpr(StNull, ME, V));
+              MakeNode(Dst, ME, Pred, StNull->bindExpr(ME, V));
               return;
             }
           }
@@ -1957,7 +1953,7 @@
   for (ObjCMessageExpr::arg_iterator I = ME->arg_begin(), E = ME->arg_end();
        I != E; ++I) {
     
-    if (GetSVal(state, *I).isUndef()) {
+    if (state->getSVal(*I).isUndef()) {
       
       // Generate an error node for passing an uninitialized/undefined value
       // as an argument to a message expression.  This node is a sink.
@@ -2006,11 +2002,11 @@
     // FIXME: Determine if the number of bits of the target type is 
     // equal or exceeds the number of bits to store the pointer value.
     // If not, flag an error.    
-    MakeNode(Dst, CastE, Pred, BindExpr(state, CastE, EvalCast(cast<Loc>(V),
+    MakeNode(Dst, CastE, Pred, state->bindExpr(CastE, EvalCast(cast<Loc>(V),
                                                                CastE->getType())));
   }
   else  
-    MakeNode(Dst, CastE, Pred, BindExpr(state, CastE, V));
+    MakeNode(Dst, CastE, Pred, state->bindExpr(CastE, V));
 }
 
   
@@ -2042,7 +2038,7 @@
   for (NodeSet::iterator I1 = S1.begin(), E1 = S1.end(); I1 != E1; ++I1) {
     NodeTy* N = *I1;
     const GRState* state = GetState(N);
-    SVal V = GetSVal(state, Ex);
+    SVal V = state->getSVal(Ex);
     ASTContext& C = getContext();
 
     // Unknown?
@@ -2071,7 +2067,7 @@
       if (nonloc::LocAsInteger *LV = dyn_cast<nonloc::LocAsInteger>(&V)) {
         // Just unpackage the lval and return it.
         V = LV->getLoc();
-        MakeNode(Dst, CastE, N, BindExpr(state, CastE, V));
+        MakeNode(Dst, CastE, N, state->bindExpr(CastE, V));
         continue;
       }
       
@@ -2143,18 +2139,18 @@
       if (R) { V = loc::MemRegionVal(R); } else { V = UnknownVal(); }
       
       // Generate the new node in the ExplodedGraph.
-      MakeNode(Dst, CastE, N, BindExpr(Res.getState(), CastE, V));
+      MakeNode(Dst, CastE, N, Res.getState()->bindExpr(CastE, V));
       continue;
     }
     // All other cases.
     DispatchCast: {
-      MakeNode(Dst, CastE, N, BindExpr(state, CastE,
-                                       EvalCast(V, CastE->getType())));
+      MakeNode(Dst, CastE, N, state->bindExpr(CastE,
+                                              EvalCast(V, CastE->getType())));
       continue;
     }
     
     PassThrough: {
-      MakeNode(Dst, CastE, N, BindExpr(state, CastE, V));
+      MakeNode(Dst, CastE, N, state->bindExpr(CastE, V));
     }
   }
 }
@@ -2168,13 +2164,13 @@
   
   for (NodeSet::iterator I = Tmp.begin(), EI = Tmp.end(); I!=EI; ++I) {
     const GRState* state = GetState(*I);
-    SVal ILV = GetSVal(state, ILE);
-    state = StateMgr.BindCompoundLiteral(state, CL, ILV);
+    SVal ILV = state->getSVal(ILE);
+    state = state->bindCompoundLiteral(CL, ILV);
 
     if (asLValue)
-      MakeNode(Dst, CL, *I, BindExpr(state, CL, StateMgr.GetLValue(state, CL)));
+      MakeNode(Dst, CL, *I, state->bindExpr(CL, state->getLValue(CL)));
     else
-      MakeNode(Dst, CL, *I, BindExpr(state, CL, ILV));
+      MakeNode(Dst, CL, *I, state->bindExpr(CL, ILV));
   }
 }
 
@@ -2209,7 +2205,7 @@
       // FIXME: Handle multi-dimensional VLAs.
       
       Expr* SE = VLA->getSizeExpr();
-      SVal Size = GetSVal(state, SE);
+      SVal Size = state->getSVal(SE);
       
       if (Size.isUndef()) {
         if (NodeTy* N = Builder->generateNode(DS, state, Pred)) {
@@ -2238,7 +2234,7 @@
     
     // Decls without InitExpr are not initialized explicitly.
     if (InitEx) {
-      SVal InitVal = GetSVal(state, InitEx);
+      SVal InitVal = state->getSVal(InitEx);
       QualType T = VD->getType();
       
       // Recover some path-sensitivity if a scalar value evaluated to
@@ -2295,7 +2291,7 @@
     // e.g: static int* myArray[] = {};
     if (NumInitElements == 0) {
       SVal V = NonLoc::MakeCompoundVal(T, StartVals, getBasicVals());
-      MakeNode(Dst, E, Pred, BindExpr(state, E, V));
+      MakeNode(Dst, E, Pred, state->bindExpr(E, V));
       return;
     }      
     
@@ -2318,7 +2314,7 @@
       for (NodeSet::iterator NI=Tmp.begin(), NE=Tmp.end(); NI!=NE; ++NI) {
         // Get the last initializer value.
         state = GetState(*NI);
-        SVal InitV = GetSVal(state, cast<Expr>(*X.Itr));
+        SVal InitV = state->getSVal(cast<Expr>(*X.Itr));
         
         // Construct the new list of values by prepending the new value to
         // the already constructed list.
@@ -2330,7 +2326,7 @@
           SVal V = NonLoc::MakeCompoundVal(T, NewVals, getBasicVals());
 
           // Make final state and node.
-          MakeNode(Dst, E, *NI, BindExpr(state, E, V));
+          MakeNode(Dst, E, *NI, state->bindExpr(E, V));
         }
         else {
           // Still some initializer values to go.  Push them onto the worklist.
@@ -2356,7 +2352,7 @@
     Visit(Init, Pred, Tmp);
     for (NodeSet::iterator I = Tmp.begin(), EI = Tmp.end(); I != EI; ++I) {
       state = GetState(*I);
-      MakeNode(Dst, E, *I, BindExpr(state, E, GetSVal(state, Init)));
+      MakeNode(Dst, E, *I, state->bindExpr(E, state->getSVal(Init)));
     }
     return;
   }
@@ -2397,8 +2393,8 @@
     amt = getContext().getTypeAlign(T) / 8;
   
   MakeNode(Dst, Ex, Pred,
-           BindExpr(GetState(Pred), Ex,
-                    NonLoc::MakeVal(getBasicVals(), amt, Ex->getType())));  
+           GetState(Pred)->bindExpr(Ex, NonLoc::MakeVal(getBasicVals(), amt,
+                                                        Ex->getType())));  
 }
 
 
@@ -2419,10 +2415,10 @@
       for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
         
         const GRState* state = GetState(*I);
-        SVal location = GetSVal(state, Ex);
+        SVal location = state->getSVal(Ex);
         
         if (asLValue)
-          MakeNode(Dst, U, *I, BindExpr(state, U, location),
+          MakeNode(Dst, U, *I, state->bindExpr(U, location),
                    ProgramPoint::PostLValueKind);
         else
           EvalLoad(Dst, U, *I, state, location);
@@ -2449,7 +2445,7 @@
         // For all other types, UnaryOperator::Real is an identity operation.
         assert (U->getType() == Ex->getType());
         const GRState* state = GetState(*I);
-        MakeNode(Dst, U, *I, BindExpr(state, U, GetSVal(state, Ex)));
+        MakeNode(Dst, U, *I, state->bindExpr(U, state->getSVal(Ex)));
       } 
       
       return;
@@ -2473,7 +2469,7 @@
         assert (Ex->getType()->isIntegerType());
         const GRState* state = GetState(*I);
         SVal X = NonLoc::MakeVal(getBasicVals(), 0, Ex->getType());
-        MakeNode(Dst, U, *I, BindExpr(state, U, X));
+        MakeNode(Dst, U, *I, state->bindExpr(U, X));
       }
       
       return;
@@ -2498,7 +2494,7 @@
       
       for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {        
         const GRState* state = GetState(*I);
-        MakeNode(Dst, U, *I, BindExpr(state, U, GetSVal(state, Ex)));
+        MakeNode(Dst, U, *I, state->bindExpr(U, state->getSVal(Ex)));
       }
       
       return;
@@ -2513,8 +2509,8 @@
      
       for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {        
         const GRState* state = GetState(*I);
-        SVal V = GetSVal(state, Ex);
-        state = BindExpr(state, U, V);
+        SVal V = state->getSVal(Ex);
+        state = state->bindExpr(U, V);
         MakeNode(Dst, U, *I, state);
       }
 
@@ -2534,10 +2530,10 @@
         const GRState* state = GetState(*I);
         
         // Get the value of the subexpression.
-        SVal V = GetSVal(state, Ex);
+        SVal V = state->getSVal(Ex);
 
         if (V.isUnknownOrUndef()) {
-          MakeNode(Dst, U, *I, BindExpr(state, U, V));
+          MakeNode(Dst, U, *I, state->bindExpr(U, V));
           continue;
         }
         
@@ -2559,12 +2555,12 @@
             
           case UnaryOperator::Not:
             // FIXME: Do we need to handle promotions?
-            state = BindExpr(state, U, EvalComplement(cast<NonLoc>(V)));
+            state = state->bindExpr(U, EvalComplement(cast<NonLoc>(V)));
             break;            
             
           case UnaryOperator::Minus:
             // FIXME: Do we need to handle promotions?
-            state = BindExpr(state, U, EvalMinus(U, cast<NonLoc>(V)));
+            state = state->bindExpr(U, EvalMinus(U, cast<NonLoc>(V)));
             break;   
             
           case UnaryOperator::LNot:   
@@ -2578,7 +2574,7 @@
               Loc X = Loc::MakeNull(getBasicVals());
               SVal Result = EvalBinOp(state,BinaryOperator::EQ, cast<Loc>(V), X,
                                       U->getType());
-              state = BindExpr(state, U, Result);
+              state = state->bindExpr(U, Result);
             }
             else {
               nonloc::ConcreteInt X(getBasicVals().getValue(0, Ex->getType()));
@@ -2612,7 +2608,7 @@
   for (NodeSet::iterator I = Tmp.begin(), E = Tmp.end(); I!=E; ++I) {
     
     const GRState* state = GetState(*I);
-    SVal V1 = GetSVal(state, Ex);
+    SVal V1 = state->getSVal(Ex);
     
     // Perform a load.      
     NodeSet Tmp2;
@@ -2621,11 +2617,11 @@
     for (NodeSet::iterator I2 = Tmp2.begin(), E2 = Tmp2.end(); I2!=E2; ++I2) {
         
       state = GetState(*I2);
-      SVal V2 = GetSVal(state, Ex);
+      SVal V2 = state->getSVal(Ex);
         
       // Propagate unknown and undefined values.      
       if (V2.isUnknownOrUndef()) {
-        MakeNode(Dst, U, *I2, BindExpr(state, U, V2));
+        MakeNode(Dst, U, *I2, state->bindExpr(U, V2));
         continue;
       }
       
@@ -2710,11 +2706,11 @@
     for (AsmStmt::outputs_iterator OI = A->begin_outputs(),
                                    OE = A->end_outputs(); OI != OE; ++OI) {
       
-      SVal X = GetSVal(state, *OI);      
+      SVal X = state->getSVal(*OI);      
       assert (!isa<NonLoc>(X));  // Should be an Lval, or unknown, undef.
       
       if (isa<Loc>(X))
-        state = BindLoc(state, cast<Loc>(X), UnknownVal());
+        state = state->bindLoc(cast<Loc>(X), UnknownVal());
     }
     
     MakeNode(Dst, A, Pred, state);
@@ -2759,7 +2755,7 @@
   Visit(R, Pred, Tmp);
 
   for (NodeSet::iterator I = Tmp.begin(), E = Tmp.end(); I != E; ++I) {
-    SVal X = GetSVal((*I)->getState(), R);
+    SVal X = (*I)->getState()->getSVal(R);
     
     // Check if we return the address of a stack variable.
     if (isa<loc::MemRegionVal>(X)) {
@@ -2851,7 +2847,7 @@
 
   for (NodeSet::iterator I1=Tmp1.begin(), E1=Tmp1.end(); I1 != E1; ++I1) {
 
-    SVal LeftV = GetSVal((*I1)->getState(), LHS);
+    SVal LeftV = (*I1)->getState()->getSVal(LHS);
     
     // Process the RHS.
     
@@ -2865,7 +2861,7 @@
       const GRState* state = GetState(*I2);
       const GRState* OldSt = state;
 
-      SVal RightV = GetSVal(state, RHS);
+      SVal RightV = state->getSVal(RHS);
       BinaryOperator::Opcode Op = B->getOpcode();
       
       switch (Op) {
@@ -2886,7 +2882,7 @@
           
           // Simulate the effects of a "store":  bind the value of the RHS
           // to the L-Value represented by the LHS.          
-          EvalStore(Dst, B, LHS, *I2, BindExpr(state, B, RightV), LeftV,
+          EvalStore(Dst, B, LHS, *I2, state->bindExpr(B, RightV), LeftV,
                     RightV);
           continue;
         }
@@ -2940,7 +2936,7 @@
           
           // Otherwise, create a new node.
           
-          MakeNode(Dst, B, *I2, BindExpr(state, B, Result));
+          MakeNode(Dst, B, *I2, state->bindExpr(B, Result));
           continue;
         }
       }
@@ -2965,13 +2961,13 @@
       // Perform a load (the LHS).  This performs the checks for
       // null dereferences, and so on.
       NodeSet Tmp3;
-      SVal location = GetSVal(state, LHS);
+      SVal location = state->getSVal(LHS);
       EvalLoad(Tmp3, LHS, *I2, state, location);
       
       for (NodeSet::iterator I3=Tmp3.begin(), E3=Tmp3.end(); I3!=E3; ++I3) {
         
         state = GetState(*I3);
-        SVal V = GetSVal(state, LHS);
+        SVal V = state->getSVal(LHS);
 
         // Check for divide-by-zero.
         if ((Op == BinaryOperator::Div || Op == BinaryOperator::Rem)
@@ -2988,13 +2984,13 @@
         
         // Propagate undefined values (left-side).          
         if (V.isUndef()) {
-          EvalStore(Dst, B, LHS, *I3, BindExpr(state, B, V), location, V);
+          EvalStore(Dst, B, LHS, *I3, state->bindExpr(B, V), location, V);
           continue;
         }
         
         // Propagate unknown values (left and right-side).
         if (RightV.isUnknown() || V.isUnknown()) {
-          EvalStore(Dst, B, LHS, *I3, BindExpr(state, B, UnknownVal()),
+          EvalStore(Dst, B, LHS, *I3, state->bindExpr(B, UnknownVal()),
                     location, UnknownVal());
           continue;
         }
@@ -3020,7 +3016,7 @@
         // Evaluate operands and promote to result type.                    
         if (RightV.isUndef()) {            
           // Propagate undefined values (right-side).          
-          EvalStore(Dst, B, LHS, *I3, BindExpr(state, B, RightV), location,
+          EvalStore(Dst, B, LHS, *I3, state->bindExpr(B, RightV), location,
                     RightV);
           continue;
         }
@@ -3064,7 +3060,7 @@
           LHSVal = (LTy == CTy) ? Result : EvalCast(Result,LTy);
         }
           
-        EvalStore(Dst, B, LHS, *I3, BindExpr(state, B, Result), location,
+        EvalStore(Dst, B, LHS, *I3, state->bindExpr(B, Result), location,
                   LHSVal);
       }
     }





More information about the cfe-commits mailing list