]> granicus.if.org Git - clang/commitdiff
Create a symbolic region instead of a loc::SymbolVal. This is a continued step
authorZhongxing Xu <xuzhongxing@gmail.com>
Thu, 9 Apr 2009 05:57:11 +0000 (05:57 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Thu, 9 Apr 2009 05:57:11 +0000 (05:57 +0000)
to eliminate the use of loc::SymbolVal.

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

include/clang/Analysis/PathSensitive/SVals.h
lib/Analysis/GRExprEngine.cpp
lib/Analysis/SVals.cpp

index 0f334f12f2bd3ae480df3cbfeea794648020f3df..6667f9323b113b93bbd6106ef58441f105fe5279 100644 (file)
@@ -76,8 +76,8 @@ public:
   static SVal GetRValueSymbolVal(SymbolManager& SymMgr, MemRegionManager& MRMgr,
                                  const MemRegion* R);
 
-  static SVal GetConjuredSymbolVal(SymbolManager& SymMgr, const Expr *E,
-                                   unsigned Count);  
+  static SVal GetConjuredSymbolVal(SymbolManager& SymMgr, MemRegionManager&,
+                                   const Expr *E, unsigned Count);  
 
   inline bool isUnknown() const {
     return getRawKind() == UnknownKind;
index 7e3fd45ab94d6a750651814aea0af98d985799f3..1fb7e5d96636c121fdd30f1ff3387fc0fc7a1154 100644 (file)
@@ -2536,7 +2536,8 @@ void GRExprEngine::VisitUnaryOperator(UnaryOperator* U, NodeTy* Pred,
       
       // Conjure a new symbol if necessary to recover precision.
       if (Result.isUnknown() || !getConstraintManager().canReasonAbout(Result))
-        Result = SVal::GetConjuredSymbolVal(SymMgr, Ex,
+        Result = SVal::GetConjuredSymbolVal(SymMgr, 
+                                       getStoreManager().getRegionManager(),Ex,
                                             Builder->getCurrentBlockCount());
       
       state = BindExpr(state, U, U->isPostfix() ? V2 : Result);
index c5900b30cd862e911c8d4e71ba622c5765a19e55..cf3e800d994ae283c04a3258078abe54e79309bb 100644 (file)
@@ -291,26 +291,23 @@ SVal SVal::GetRValueSymbolVal(SymbolManager& SymMgr, MemRegionManager& MRMgr,
       return Loc::MakeVal(MRMgr.getSymbolicRegion(sym));
   
     // Only handle integers for now.
-    if (T->isIntegerType())
+    if (T->isIntegerType() && T->isScalarType())
       return NonLoc::MakeVal(sym);
   }
 
   return UnknownVal();
 }
 
-SVal SVal::GetConjuredSymbolVal(SymbolManager &SymMgr, const Expr* E,
-                                unsigned Count) {
-
+SVal SVal::GetConjuredSymbolVal(SymbolManager &SymMgr, MemRegionManager& MRMgr,
+                                const Expr* E, unsigned Count) {
   QualType T = E->getType();
-  
-  if (Loc::IsLocType(T)) {
-    SymbolRef Sym = SymMgr.getConjuredSymbol(E, Count);        
-    return loc::SymbolVal(Sym);
-  }
-  else if (T->isIntegerType() && T->isScalarType()) {
-    SymbolRef Sym = SymMgr.getConjuredSymbol(E, Count);        
-    return nonloc::SymbolVal(Sym);                    
-  }
+  SymbolRef sym = SymMgr.getConjuredSymbol(E, Count);
+
+  if (Loc::IsLocType(T))
+    return Loc::MakeVal(MRMgr.getSymbolicRegion(sym));
+
+  if (T->isIntegerType() && T->isScalarType())
+    return NonLoc::MakeVal(sym);
 
   return UnknownVal();
 }