Patch by Zhongxing Xu:

This patch moves some code in GRStateManager::RemoveDeadBindings() to EnvironmentManager::RemoveDeadBindings().

llvm-svn: 55064
This commit is contained in:
Ted Kremenek 2008-08-20 17:08:29 +00:00
parent 1ac3e2545b
commit e5edbdd4ee
3 changed files with 62 additions and 35 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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();