summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/ValueState.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-07-08 21:46:56 +0000
committerTed Kremenek <kremenek@apple.com>2008-07-08 21:46:56 +0000
commit852ed373aa7427c58a026db10e00d402a22ac779 (patch)
tree291b4e2346985590c6e3d001adba93cc6cc14be0 /clang/lib/Analysis/ValueState.cpp
parent891c737e39790e490db86e10650a926d567afd56 (diff)
downloadbcm5719-llvm-852ed373aa7427c58a026db10e00d402a22ac779.tar.gz
bcm5719-llvm-852ed373aa7427c58a026db10e00d402a22ac779.zip
Initial work on splitting the ValueState into an Environment, Store, and
Constraints. These concepts are already present in the current ValueState, but the implementation is monolothic. Making ValueState more modular opens up new design choices for customizing the analysis engine. In the context of the analysis engine, the "Environment" is the binding between Expr* (expressions) and intermediate symbolic values (RValues). llvm-svn: 53252
Diffstat (limited to 'clang/lib/Analysis/ValueState.cpp')
-rw-r--r--clang/lib/Analysis/ValueState.cpp41
1 files changed, 16 insertions, 25 deletions
diff --git a/clang/lib/Analysis/ValueState.cpp b/clang/lib/Analysis/ValueState.cpp
index 097969ba964..23c93ae1d69 100644
--- a/clang/lib/Analysis/ValueState.cpp
+++ b/clang/lib/Analysis/ValueState.cpp
@@ -49,7 +49,7 @@ ValueStateManager::RemoveDeadBindings(ValueState* St, Stmt* Loc,
ValueState NewSt = *St;
// Drop bindings for subexpressions.
- NewSt.SubExprBindings = EXFactory.GetEmptyMap();
+ NewSt.Env = EnvMgr.RemoveSubExprBindings(NewSt.Env);
// Iterate over the block-expr bindings.
@@ -76,7 +76,7 @@ ValueStateManager::RemoveDeadBindings(ValueState* St, Stmt* Loc,
if (X.isUndef() && cast<UndefinedVal>(X).getData())
continue;
- NewSt.BlockExprBindings = Remove(NewSt, BlkExpr);
+ NewSt.Env = EnvMgr.RemoveBlkExpr(NewSt.Env, BlkExpr);
}
}
@@ -258,6 +258,7 @@ ValueState* ValueStateManager::AddEQ(ValueState* St, SymbolID sym,
return getPersistentState(NewSt);
}
+// FIXME: This should all go into the environment.
RVal ValueStateManager::GetRVal(ValueState* St, Expr* E) {
for (;;) {
@@ -321,13 +322,7 @@ RVal ValueStateManager::GetRVal(ValueState* St, Expr* E) {
break;
}
- ValueState::ExprBindingsTy::data_type* T = St->SubExprBindings.lookup(E);
-
- if (T)
- return *T;
-
- T = St->BlockExprBindings.lookup(E);
- return T ? *T : UnknownVal();
+ return St->LookupExpr(E);
}
RVal ValueStateManager::GetBlkExprRVal(ValueState* St, Expr* E) {
@@ -344,10 +339,8 @@ RVal ValueStateManager::GetBlkExprRVal(ValueState* St, Expr* E) {
return NonLVal::MakeVal(BasicVals, cast<IntegerLiteral>(E));
}
- default: {
- ValueState::ExprBindingsTy::data_type* T=St->BlockExprBindings.lookup(E);
- return T ? *T : UnknownVal();
- }
+ default:
+ return St->getEnvironment().LookupBlkExpr(E);
}
}
@@ -364,9 +357,9 @@ ValueStateManager::SetRVal(ValueState* St, Expr* E, RVal V,
ValueState NewSt = *St;
if (isBlkExpr)
- NewSt.BlockExprBindings = EXFactory.Remove(NewSt.BlockExprBindings, E);
+ NewSt.Env = EnvMgr.RemoveBlkExpr(NewSt.Env, E);
else
- NewSt.SubExprBindings = EXFactory.Remove(NewSt.SubExprBindings, E);
+ NewSt.Env = EnvMgr.RemoveSubExpr(NewSt.Env, E);
return getPersistentState(NewSt);
}
@@ -376,12 +369,10 @@ ValueStateManager::SetRVal(ValueState* St, Expr* E, RVal V,
ValueState NewSt = *St;
- if (isBlkExpr) {
- NewSt.BlockExprBindings = EXFactory.Add(NewSt.BlockExprBindings, E, V);
- }
- else {
- NewSt.SubExprBindings = EXFactory.Add(NewSt.SubExprBindings, E, V);
- }
+ if (isBlkExpr)
+ NewSt.Env = EnvMgr.AddBlkExpr(NewSt.Env, E, V);
+ else
+ NewSt.Env = EnvMgr.AddSubExpr(NewSt.Env, E, V);
return getPersistentState(NewSt);
}
@@ -437,10 +428,10 @@ void ValueStateManager::Unbind(ValueState& StImpl, LVal LV) {
ValueState* ValueStateManager::getInitialState() {
// Create a state with empty variable bindings.
- ValueState StateImpl(EXFactory.GetEmptyMap(),
- VBFactory.GetEmptyMap(),
- CNEFactory.GetEmptyMap(),
- CEFactory.GetEmptyMap());
+ ValueState StateImpl(EnvMgr.getInitialEnvironment(),
+ VBFactory.GetEmptyMap(),
+ CNEFactory.GetEmptyMap(),
+ CEFactory.GetEmptyMap());
return getPersistentState(StateImpl);
}
OpenPOWER on IntegriCloud