Added "symbol iterators" for RValues, allowing easy iteration over the symbols
referenced by an RValue, instead of having to query the type of the RValue.
Modified ValueState::RemoveDeadBindings to also prune dead symbols.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47142 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/RValues.cpp b/Analysis/RValues.cpp
index 8d16f12..8eb607c 100644
--- a/Analysis/RValues.cpp
+++ b/Analysis/RValues.cpp
@@ -123,8 +123,32 @@
return *C;
}
+//===----------------------------------------------------------------------===//
+// Symbol Iteration.
+//===----------------------------------------------------------------------===//
-
+RValue::symbol_iterator RValue::symbol_begin() const {
+ if (isa<LValue>(this)) {
+ if (isa<lval::SymbolVal>(this))
+ return (symbol_iterator) (&Data);
+ }
+ else {
+ if (isa<nonlval::SymbolVal>(this))
+ return (symbol_iterator) (&Data);
+ else if (isa<nonlval::SymIntConstraintVal>(this)) {
+ const SymIntConstraint& C =
+ cast<nonlval::SymIntConstraintVal>(this)->getConstraint();
+ return (symbol_iterator) &C.getSymbol();
+ }
+ }
+
+ return NULL;
+}
+
+RValue::symbol_iterator RValue::symbol_end() const {
+ symbol_iterator X = symbol_begin();
+ return X ? X+1 : NULL;
+}
//===----------------------------------------------------------------------===//
// Transfer function dispatch for Non-LValues.