diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-02-27 06:47:26 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-02-27 06:47:26 +0000 |
commit | 1c64daba5bae3790429fc455a530e466a6a3a8cf (patch) | |
tree | 19fd34ca2c9d001027d81d662ef0392012c3985d /clang/Analysis | |
parent | 97925ec7044dd8e9fd9edab14e151495e1cdcfd7 (diff) | |
download | bcm5719-llvm-1c64daba5bae3790429fc455a530e466a6a3a8cf.tar.gz bcm5719-llvm-1c64daba5bae3790429fc455a530e466a6a3a8cf.zip |
When analyzing a function, eagerly create symbolic values for all
globals/parameters at the beginning of the analysis.
llvm-svn: 47664
Diffstat (limited to 'clang/Analysis')
-rw-r--r-- | clang/Analysis/GRExprEngine.cpp | 55 | ||||
-rw-r--r-- | clang/Analysis/ValueState.cpp | 6 |
2 files changed, 30 insertions, 31 deletions
diff --git a/clang/Analysis/GRExprEngine.cpp b/clang/Analysis/GRExprEngine.cpp index d2200bfa0fe..758e038865f 100644 --- a/clang/Analysis/GRExprEngine.cpp +++ b/clang/Analysis/GRExprEngine.cpp @@ -26,6 +26,30 @@ using llvm::dyn_cast; 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::Nodify(NodeSet& Dst, Stmt* S, NodeTy* Pred, 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 @@ void GRExprEngine::VisitLVal(Expr* Ex, NodeTy* Pred, NodeSet& Dst) { 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; } diff --git a/clang/Analysis/ValueState.cpp b/clang/Analysis/ValueState.cpp index cdd616fb147..b90e265af24 100644 --- a/clang/Analysis/ValueState.cpp +++ b/clang/Analysis/ValueState.cpp @@ -437,10 +437,14 @@ ValueState ValueStateManager::SetRVal(ValueState St, LVal LV, RVal V) { } } +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. |