Split off expression-bindings in ValueState from variable-bindings.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46892 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/ValueState.cpp b/Analysis/ValueState.cpp
index 5f42e11..6a9023a 100644
--- a/Analysis/ValueState.cpp
+++ b/Analysis/ValueState.cpp
@@ -43,34 +43,34 @@
// for optimum performance.
llvm::SmallVector<ValueDecl*, 10> WList;
-
- for (StateTy::vb_iterator I = St.begin(), E = St.end(); I!=E ; ++I) {
+
+ for (StateTy::eb_iterator I = St.eb_begin(), E = St.eb_end(); I!=E ; ++I) {
+
+ ExprBindKey K = I.getKey();
// Remove old bindings for subexpressions.
- if (I.getKey().isSubExpr()) {
- St = Remove(St, I.getKey());
+ if (K.isSubExpr()) {
+ St = Remove(St, K);
continue;
}
- if (I.getKey().isBlkExpr()) {
- if (Liveness.isLive(Loc, cast<Stmt>(I.getKey()))) {
- if (isa<lval::DeclVal>(I.getData())) {
- lval::DeclVal LV = cast<lval::DeclVal>(I.getData());
- WList.push_back(LV.getDecl());
- }
+ assert (I.getKey().isBlkExpr());
+
+ if (Liveness.isLive(Loc, K.getExpr())) {
+ if (isa<lval::DeclVal>(I.getData())) {
+ lval::DeclVal LV = cast<lval::DeclVal>(I.getData());
+ WList.push_back(LV.getDecl());
}
- else
- St = Remove(St, I.getKey());
-
- continue;
}
+ else
+ St = Remove(St, K);
- assert (I.getKey().isDecl());
-
- if (VarDecl* V = dyn_cast<VarDecl>(cast<ValueDecl>(I.getKey())))
- if (Liveness.isLive(Loc, V))
- WList.push_back(V);
+ continue;
}
+
+ for (StateTy::vb_iterator I = St.vb_begin(), E = St.vb_end(); I!=E ; ++I)
+ if (Liveness.isLive(Loc, I.getKey()))
+ WList.push_back(I.getKey());
llvm::SmallPtrSet<ValueDecl*, 10> Marked;
@@ -94,11 +94,9 @@
}
}
- for (StateTy::vb_iterator I = St.begin(), E = St.end(); I!=E ; ++I)
- if (I.getKey().isDecl())
- if (VarDecl* V = dyn_cast<VarDecl>(cast<ValueDecl>(I.getKey())))
- if (!Marked.count(V))
- St = Remove(St, V);
+ for (StateTy::vb_iterator I = St.vb_begin(), E = St.vb_end(); I!=E ; ++I)
+ if (!Marked.count(I.getKey()))
+ St = Remove(St, I.getKey());
return St;
}
@@ -112,7 +110,9 @@
switch (LV.getSubKind()) {
case lval::DeclValKind: {
StateTy::VarBindingsTy::TreeTy* T =
- St.getImpl()->VarBindings.SlimFind(cast<lval::DeclVal>(LV).getDecl());
+ // FIXME: We should make lval::DeclVal only contain VarDecl
+ St.getImpl()->VarBindings.SlimFind(
+ cast<VarDecl>(cast<lval::DeclVal>(LV).getDecl()));
return T ? T->getValue().second : UnknownVal();
}
@@ -222,8 +222,8 @@
break;
}
- StateTy::VarBindingsTy::TreeTy* T =
- St.getImpl()->VarBindings.SlimFind(S);
+ StateTy::ExprBindingsTy::TreeTy* T =
+ St.getImpl()->ExprBindings.SlimFind(S);
if (T) {
if (hasVal) *hasVal = true;
@@ -235,28 +235,28 @@
}
}
-LValue ValueStateManager::GetLValue(const StateTy& St, Expr* S) {
+LValue ValueStateManager::GetLValue(const StateTy& St, Expr* E) {
- while (ParenExpr* P = dyn_cast<ParenExpr>(S))
- S = P->getSubExpr();
+ while (ParenExpr* P = dyn_cast<ParenExpr>(E))
+ E = P->getSubExpr();
- if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(S))
+ if (DeclRefExpr* DR = dyn_cast<DeclRefExpr>(E))
return lval::DeclVal(DR->getDecl());
- if (UnaryOperator* U = dyn_cast<UnaryOperator>(S))
+ if (UnaryOperator* U = dyn_cast<UnaryOperator>(E))
if (U->getOpcode() == UnaryOperator::Deref)
return cast<LValue>(GetValue(St, U->getSubExpr()));
- return cast<LValue>(GetValue(St, S));
+ return cast<LValue>(GetValue(St, E));
}
ValueStateManager::StateTy
-ValueStateManager::SetValue(StateTy St, Expr* S, bool isBlkExpr,
+ValueStateManager::SetValue(StateTy St, Expr* E, bool isBlkExpr,
const RValue& V) {
- assert (S);
- return V.isKnown() ? Add(St, ExprBindKey(S, isBlkExpr), V) : St;
+ assert (E);
+ return V.isKnown() ? Add(St, ExprBindKey(E, isBlkExpr), V) : St;
}
ValueStateManager::StateTy
@@ -264,8 +264,9 @@
switch (LV.getSubKind()) {
case lval::DeclValKind:
- return V.isKnown() ? Add(St, cast<lval::DeclVal>(LV).getDecl(), V)
- : Remove(St, cast<lval::DeclVal>(LV).getDecl());
+ return V.isKnown() // FIXME: Have DeclVal only contain VarDecl
+ ? Add(St, cast<VarDecl>(cast<lval::DeclVal>(LV).getDecl()), V)
+ : Remove(St, cast<VarDecl>(cast<lval::DeclVal>(LV).getDecl()));
default:
assert ("SetValue for given LValue type not yet implemented.");
@@ -274,35 +275,59 @@
}
ValueStateManager::StateTy
-ValueStateManager::Remove(StateTy St, ExprBindKey K) {
-
+ValueStateManager::Add(StateTy St, ExprBindKey K, const RValue& V) {
+
// Create a new state with the old binding removed.
ValueStateImpl NewStateImpl = *St.getImpl();
- NewStateImpl.VarBindings =
- VBFactory.Remove(NewStateImpl.VarBindings, K);
-
+ NewStateImpl.ExprBindings =
+ EXFactory.Add(NewStateImpl.ExprBindings, K, V);
+
// Get the persistent copy.
return getPersistentState(NewStateImpl);
}
ValueStateManager::StateTy
-ValueStateManager::Add(StateTy St, ExprBindKey K, const RValue& V) {
+ValueStateManager::Remove(StateTy St, ExprBindKey K) {
// Create a new state with the old binding removed.
ValueStateImpl NewStateImpl = *St.getImpl();
- NewStateImpl.VarBindings =
- VBFactory.Add(NewStateImpl.VarBindings, K, V);
+ NewStateImpl.ExprBindings =
+ EXFactory.Remove(NewStateImpl.ExprBindings, K);
// Get the persistent copy.
return getPersistentState(NewStateImpl);
}
+ValueStateManager::StateTy
+ValueStateManager::Add(StateTy St, VarDecl* D, const RValue& V) {
+
+ // Create a new state with the old binding removed.
+ ValueStateImpl NewStateImpl = *St.getImpl();
+ NewStateImpl.VarBindings =
+ VBFactory.Add(NewStateImpl.VarBindings, D, V);
+
+ // Get the persistent copy.
+ return getPersistentState(NewStateImpl);
+}
+
+ValueStateManager::StateTy
+ValueStateManager::Remove(StateTy St, VarDecl* D) {
+
+ // Create a new state with the old binding removed.
+ ValueStateImpl NewStateImpl = *St.getImpl();
+ NewStateImpl.VarBindings =
+ VBFactory.Remove(NewStateImpl.VarBindings, D);
+
+ // Get the persistent copy.
+ return getPersistentState(NewStateImpl);
+}
ValueStateManager::StateTy
ValueStateManager::getInitialState() {
// Create a state with empty variable bindings.
- ValueStateImpl StateImpl(VBFactory.GetEmptyMap(),
+ ValueStateImpl StateImpl(EXFactory.GetEmptyMap(),
+ VBFactory.GetEmptyMap(),
CNEFactory.GetEmptyMap(),
CEFactory.GetEmptyMap());