Patch by Zhongxing Xu:
This patch moves some code in GRStateManager::RemoveDeadBindings() to EnvironmentManager::RemoveDeadBindings(). llvm-svn: 55064
This commit is contained in:
parent
1ac3e2545b
commit
e5edbdd4ee
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue