[cfe-commits] r47664 - in /cfe/trunk: Analysis/GRExprEngine.cpp Analysis/ValueState.cpp include/clang/Analysis/PathSensitive/GRExprEngine.h include/clang/Analysis/PathSensitive/ValueState.h
Ted Kremenek
kremenek at apple.com
Tue Feb 26 22:47:32 PST 2008
Author: kremenek
Date: Wed Feb 27 00:47:26 2008
New Revision: 47664
URL: http://llvm.org/viewvc/llvm-project?rev=47664&view=rev
Log:
When analyzing a function, eagerly create symbolic values for all
globals/parameters at the beginning of the analysis.
Modified:
cfe/trunk/Analysis/GRExprEngine.cpp
cfe/trunk/Analysis/ValueState.cpp
cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h
cfe/trunk/include/clang/Analysis/PathSensitive/ValueState.h
Modified: cfe/trunk/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRExprEngine.cpp?rev=47664&r1=47663&r2=47664&view=diff
==============================================================================
--- cfe/trunk/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/Analysis/GRExprEngine.cpp Wed Feb 27 00:47:26 2008
@@ -26,6 +26,30 @@
using llvm::cast;
using llvm::APSInt;
+GRExprEngine::StateTy GRExprEngine::getInitialState() {
+
+ // The LiveVariables information already has a compilation of all VarDecls
+ // used in the function. Iterate through this set, and "symbolicate"
+ // any VarDecl whose value originally comes from outside the function.
+
+ typedef LiveVariables::AnalysisDataTy LVDataTy;
+ LVDataTy& D = Liveness.getAnalysisData();
+
+ ValueStateImpl StateImpl = *StateMgr.getInitialState().getImpl();
+
+ for (LVDataTy::decl_iterator I=D.begin_decl(), E=D.end_decl(); I != E; ++I) {
+
+ VarDecl* VD = cast<VarDecl>(const_cast<ScopedDecl*>(I->first));
+
+ if (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD)) {
+ RVal X = RVal::GetSymbolValue(SymMgr, VD);
+ StateMgr.BindVar(StateImpl, VD, X);
+ }
+ }
+
+ return StateMgr.getPersistentState(StateImpl);
+}
+
GRExprEngine::StateTy
GRExprEngine::SetRVal(StateTy St, Expr* Ex, const RVal& V) {
@@ -455,22 +479,6 @@
void GRExprEngine::VisitDeclRefExpr(DeclRefExpr* D, NodeTy* Pred, NodeSet& Dst){
- if (VarDecl* VD = dyn_cast<VarDecl>(D->getDecl()))
- if (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD)) {
-
- StateTy StOld = Pred->getState();
- StateTy St = Symbolicate(StOld, VD);
-
- if (!(St == StOld)) {
- if (D != CurrentStmt)
- Nodify(Dst, D, Pred, St);
- else
- Nodify(Dst, D, Pred, SetRVal(St, D, GetRVal(St, D)));
-
- return;
- }
- }
-
if (D != CurrentStmt) {
Dst.Add(Pred); // No-op. Simply propagate the current state unchanged.
return;
@@ -884,20 +892,7 @@
Ex = Ex->IgnoreParens();
- if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(Ex)) {
-
- if (VarDecl* VD = dyn_cast<VarDecl>(DR->getDecl()))
- if (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD)) {
-
- StateTy StOld = Pred->getState();
- StateTy St = Symbolicate(StOld, VD);
-
- if (!(St == StOld)) {
- Nodify(Dst, Ex, Pred, St);
- return;
- }
- }
-
+ if (isa<DeclRefExpr>(Ex)) {
Dst.Add(Pred);
return;
}
Modified: cfe/trunk/Analysis/ValueState.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/ValueState.cpp?rev=47664&r1=47663&r2=47664&view=diff
==============================================================================
--- cfe/trunk/Analysis/ValueState.cpp (original)
+++ cfe/trunk/Analysis/ValueState.cpp Wed Feb 27 00:47:26 2008
@@ -437,10 +437,14 @@
}
}
+void ValueStateManager::BindVar(ValueStateImpl& StImpl, VarDecl* D, RVal V) {
+ StImpl.VarBindings = VBFactory.Add(StImpl.VarBindings, D, V);
+}
+
ValueState ValueStateManager::BindVar(ValueState St, VarDecl* D, RVal V) {
// Create a new state with the old binding removed.
- ValueStateImpl NewSt = *St;
+ ValueStateImpl NewSt = *St;
NewSt.VarBindings = VBFactory.Add(NewSt.VarBindings, D, V);
// Get the persistent copy.
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=47664&r1=47663&r2=47664&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRExprEngine.h Wed Feb 27 00:47:26 2008
@@ -150,7 +150,7 @@
/// getInitialState - Return the initial state used for the root vertex
/// in the ExplodedGraph.
- StateTy getInitialState() { return StateMgr.getInitialState(); }
+ StateTy getInitialState();
bool isUninitControlFlow(const NodeTy* N) const {
return N->isSink() && UninitBranches.count(const_cast<NodeTy*>(N)) != 0;
@@ -252,15 +252,6 @@
return StateMgr.GetLVal(St, Ex);
}
- StateTy Symbolicate(StateTy St, VarDecl* VD) {
- lval::DeclVal X(VD);
-
- if (GetRVal(St, X).isUnknown()) {
- return SetRVal(St, lval::DeclVal(VD), RVal::GetSymbolValue(SymMgr, VD));
- }
- else return St;
- }
-
inline NonLVal MakeConstantVal(uint64_t X, Expr* Ex) {
return NonLVal::MakeVal(ValMgr, X, Ex->getType(), Ex->getLocStart());
}
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/ValueState.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ValueState.h?rev=47664&r1=47663&r2=47664&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/ValueState.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/ValueState.h Wed Feb 27 00:47:26 2008
@@ -266,6 +266,7 @@
RVal GetBlkExprRVal(ValueState St, Expr* Ex);
+ void BindVar(ValueStateImpl& StImpl, VarDecl* D, RVal V);
ValueState getPersistentState(const ValueStateImpl& Impl);
ValueState AddEQ(ValueState St, SymbolID sym, const llvm::APSInt& V);
More information about the cfe-commits
mailing list