From df9cdf8fce5bb43b335994f946f7c8e3a3bca7fa Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 20 Aug 2008 17:08:29 +0000 Subject: [PATCH] Patch by Zhongxing Xu: This patch moves some code in GRStateManager::RemoveDeadBindings() to EnvironmentManager::RemoveDeadBindings(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55064 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Analysis/PathSensitive/Environment.h | 13 ++++- lib/Analysis/Environment.cpp | 48 +++++++++++++++++++ lib/Analysis/GRState.cpp | 36 +------------- 3 files changed, 62 insertions(+), 35 deletions(-) diff --git a/include/clang/Analysis/PathSensitive/Environment.h b/include/clang/Analysis/PathSensitive/Environment.h index ba06286657..9c9dc54886 100644 --- a/include/clang/Analysis/PathSensitive/Environment.h +++ b/include/clang/Analysis/PathSensitive/Environment.h @@ -14,6 +14,10 @@ #ifndef LLVM_CLANG_ANALYSIS_ENVIRONMENT_H #define LLVM_CLANG_ANALYSIS_ENVIRONMENT_H +// For using typedefs in StoreManager. Should find a better place for these +// typedefs. +#include "clang/Analysis/PathSensitive/Store.h" + #include "llvm/ADT/ImmutableMap.h" #include "clang/Analysis/PathSensitive/RValues.h" #include "llvm/Support/Allocator.h" @@ -23,7 +27,8 @@ namespace clang { class EnvironmentManager; class BasicValueFactory; - +class LiveVariables; + class Environment : public llvm::FoldingSetNode { private: @@ -132,6 +137,12 @@ public: Environment SetRVal(const Environment& Env, Expr* E, RVal V, bool isBlkExpr, bool Invalidate); + + Environment RemoveDeadBindings(Environment Env, + Stmt* Loc, + const LiveVariables& Liveness, + StoreManager::DeclRootsTy& DRoots, + StoreManager::LiveSymbolsTy& LSymbols); }; } // end clang namespace 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(X)) { + lval::DeclVal LV = cast(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(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(X)) { - lval::DeclVal LV = cast(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(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(); -- 2.40.0