diff options
| author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-04-09 05:57:11 +0000 |
|---|---|---|
| committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-04-09 05:57:11 +0000 |
| commit | cb5d3ced7037f89ee10c3769f10c6cea94d05d6c (patch) | |
| tree | c26d666ff53a1c7bc5575f84c7cdbe24dc88d2a7 | |
| parent | fc8b2b9ff9938167e8007c599fd992f0b62e7ddf (diff) | |
| download | bcm5719-llvm-cb5d3ced7037f89ee10c3769f10c6cea94d05d6c.tar.gz bcm5719-llvm-cb5d3ced7037f89ee10c3769f10c6cea94d05d6c.zip | |
Create a symbolic region instead of a loc::SymbolVal. This is a continued step
to eliminate the use of loc::SymbolVal.
llvm-svn: 68685
| -rw-r--r-- | clang/include/clang/Analysis/PathSensitive/SVals.h | 4 | ||||
| -rw-r--r-- | clang/lib/Analysis/GRExprEngine.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Analysis/SVals.cpp | 23 |
3 files changed, 14 insertions, 16 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/SVals.h b/clang/include/clang/Analysis/PathSensitive/SVals.h index 0f334f12f2b..6667f9323b1 100644 --- a/clang/include/clang/Analysis/PathSensitive/SVals.h +++ b/clang/include/clang/Analysis/PathSensitive/SVals.h @@ -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; diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index 7e3fd45ab94..1fb7e5d9663 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/lib/Analysis/GRExprEngine.cpp @@ -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); diff --git a/clang/lib/Analysis/SVals.cpp b/clang/lib/Analysis/SVals.cpp index c5900b30cd8..cf3e800d994 100644 --- a/clang/lib/Analysis/SVals.cpp +++ b/clang/lib/Analysis/SVals.cpp @@ -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(); } |

