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
diff --git a/lib/Analysis/Environment.cpp b/lib/Analysis/Environment.cpp
index 7f6fbd3..570a38f 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 @@
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;
+}