diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Analysis/Environment.cpp | 48 | ||||
-rw-r--r-- | lib/Analysis/GRState.cpp | 36 |
2 files changed, 50 insertions, 34 deletions
diff --git a/lib/Analysis/Environment.cpp b/lib/Analysis/Environment.cpp index 7f6fbd3051..570a38f89e 100644 --- a/lib/Analysis/Environment.cpp +++ b/lib/Analysis/Environment.cpp @@ -12,7 +12,9 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/PathSensitive/Environment.h" +#include "clang/Analysis/Analyses/LiveVariables.h" #include "llvm/ADT/ImmutableMap.h" +#include "llvm/Support/Streams.h" using namespace clang; @@ -103,3 +105,49 @@ Environment EnvironmentManager::SetRVal(const Environment& Env, Expr* E, RVal V, return isBlkExpr ? AddBlkExpr(Env, E, V) : AddSubExpr(Env, E, V); } + +Environment +EnvironmentManager::RemoveDeadBindings(Environment Env, + Stmt* Loc, + const LiveVariables& Liveness, + StoreManager::DeclRootsTy& DRoots, + StoreManager::LiveSymbolsTy& LSymbols) { + // Drop bindings for subexpressions. + Env = RemoveSubExprBindings(Env); + + // Iterate over the block-expr bindings. + for (Environment::beb_iterator I = Env.beb_begin(), E = Env.beb_end(); + I != E; ++I) { + Expr* BlkExpr = I.getKey(); + + if (Liveness.isLive(Loc, BlkExpr)) { + RVal X = I.getData(); + + // If the block expr's value is the address of some Decl, then mark that + // Decl. + if (isa<lval::DeclVal>(X)) { + lval::DeclVal LV = cast<lval::DeclVal>(X); + DRoots.push_back(LV.getDecl()); + } + + // Mark all symbols in the block expr's value. + for (RVal::symbol_iterator SI = X.symbol_begin(), SE = X.symbol_end(); + SI != SE; ++SI) { + LSymbols.insert(*SI); + } + } else { + // The block expr is dead. + RVal X = I.getData(); + + // Do not misclean LogicalExpr or ConditionalOperator. + // Why is it dead? Should look at LiveVariables. + + if (X.isUndef() && cast<UndefinedVal>(X).getData()) + continue; + + Env = RemoveBlkExpr(Env, BlkExpr); + } + } + + return Env; +} diff --git a/lib/Analysis/GRState.cpp b/lib/Analysis/GRState.cpp index c9494fe7ea..1cee484357 100644 --- a/lib/Analysis/GRState.cpp +++ b/lib/Analysis/GRState.cpp @@ -88,40 +88,8 @@ GRStateManager::RemoveDeadBindings(const GRState* St, Stmt* Loc, GRState NewSt = *St; - // FIXME: Put this in environment. - // Clean up the environment. - - // Drop bindings for subexpressions. - NewSt.Env = EnvMgr.RemoveSubExprBindings(NewSt.Env); - - // Iterate over the block-expr bindings. - - for (GRState::beb_iterator I = St->beb_begin(), E = St->beb_end(); - I!=E ; ++I) { - Expr* BlkExpr = I.getKey(); - - if (Liveness.isLive(Loc, BlkExpr)) { - RVal X = I.getData(); - - if (isa<lval::DeclVal>(X)) { - lval::DeclVal LV = cast<lval::DeclVal>(X); - DRoots.push_back(LV.getDecl()); - } - - for (RVal::symbol_iterator SI = X.symbol_begin(), SE = X.symbol_end(); - SI != SE; ++SI) { - LSymbols.insert(*SI); - } - } - else { - RVal X = I.getData(); - - if (X.isUndef() && cast<UndefinedVal>(X).getData()) - continue; - - NewSt.Env = EnvMgr.RemoveBlkExpr(NewSt.Env, BlkExpr); - } - } + NewSt.Env = EnvMgr.RemoveDeadBindings(NewSt.Env, Loc, Liveness, + DRoots, LSymbols); // Clean up the store. DSymbols.clear(); |