aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Analysis/PathSensitive/Environment.h13
-rw-r--r--lib/Analysis/Environment.cpp48
-rw-r--r--lib/Analysis/GRState.cpp36
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<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();