aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-02-05 18:51:06 +0000
committerTed Kremenek <kremenek@apple.com>2008-02-05 18:51:06 +0000
commit174aea40779dd0c8dc3fd9bbe2e95f92853a9967 (patch)
treeda17325775882ec76c6047402c407b7b38b50e87
parent6f886bd34b6da6e4a92246e573067f2fac048137 (diff)
Added a "ConstantNotEq" map to ValueState (and added necessary typedefs and factory objects to ValueStateManager).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46758 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Analysis/RValues.h6
-rw-r--r--Analysis/ValueState.cpp3
-rw-r--r--Analysis/ValueState.h37
3 files changed, 36 insertions, 10 deletions
diff --git a/Analysis/RValues.h b/Analysis/RValues.h
index 9048c6753a..b5b7873f63 100644
--- a/Analysis/RValues.h
+++ b/Analysis/RValues.h
@@ -50,6 +50,12 @@ public:
bool isInitialized() const { return Data != (unsigned) ~0; }
operator unsigned() const { assert (isInitialized()); return Data; }
+
+ void Profile(llvm::FoldingSetNodeID& ID) const { ID.AddInteger(Data); }
+
+ static inline void Profile(llvm::FoldingSetNodeID& ID, SymbolID X) {
+ X.Profile(ID);
+ }
};
class SymbolData {
diff --git a/Analysis/ValueState.cpp b/Analysis/ValueState.cpp
index 2166a8699f..9bd02a29bd 100644
--- a/Analysis/ValueState.cpp
+++ b/Analysis/ValueState.cpp
@@ -162,7 +162,8 @@ ValueStateManager::StateTy
ValueStateManager::getInitialState() {
// Create a state with empty variable bindings.
- ValueStateImpl StateImpl(VBFactory.GetEmptyMap());
+ ValueStateImpl StateImpl(VBFactory.GetEmptyMap(),
+ CNEFactory.GetEmptyMap());
return getPersistentState(StateImpl);
}
diff --git a/Analysis/ValueState.h b/Analysis/ValueState.h
index 57d80e90cc..984901fd79 100644
--- a/Analysis/ValueState.h
+++ b/Analysis/ValueState.h
@@ -114,7 +114,10 @@ public:
//===----------------------------------------------------------------------===//
namespace vstate {
+ typedef llvm::ImmutableSet<llvm::APSInt*> IntSetTy;
+
typedef llvm::ImmutableMap<VarBindKey,RValue> VariableBindingsTy;
+ typedef llvm::ImmutableMap<SymbolID,IntSetTy> ConstantNotEqTy;
}
/// ValueStateImpl - This class encapsulates the actual data values for
@@ -123,19 +126,27 @@ namespace vstate {
/// "persistent" in a FoldingSet its values will never change.
struct ValueStateImpl : public llvm::FoldingSetNode {
vstate::VariableBindingsTy VariableBindings;
+ vstate::ConstantNotEqTy ConstantNotEq;
- ValueStateImpl(vstate::VariableBindingsTy VB)
- : VariableBindings(VB) {}
+ /// This ctor is used when creating the first ValueStateImpl object.
+ ValueStateImpl(vstate::VariableBindingsTy VB, vstate::ConstantNotEqTy CNE)
+ : VariableBindings(VB), ConstantNotEq(CNE) {}
+ /// Copy ctor - We must explicitly define this or else the "Next" ptr
+ /// in FoldingSetNode will also get copied.
ValueStateImpl(const ValueStateImpl& RHS)
: llvm::FoldingSetNode(),
- VariableBindings(RHS.VariableBindings) {}
-
+ VariableBindings(RHS.VariableBindings),
+ ConstantNotEq(RHS.ConstantNotEq) {}
+ /// Profile - Profile the contents of a ValueStateImpl object for use
+ /// in a FoldingSet.
static void Profile(llvm::FoldingSetNodeID& ID, const ValueStateImpl& V) {
V.VariableBindings.Profile(ID);
}
-
+
+ /// Profile - Used to profile the contents of this object for inclusion
+ /// in a FoldingSet.
void Profile(llvm::FoldingSetNodeID& ID) const {
Profile(ID, *this);
}
@@ -159,12 +170,16 @@ public:
// Accessors.
ValueStateImpl* getImpl() const { return Data; }
-
- // Iterators.
+
+
+ // Binding maps typedefs.
typedef vstate::VariableBindingsTy VariableBindingsTy;
- typedef VariableBindingsTy::iterator vb_iterator;
-
+ typedef vstate::ConstantNotEqTy ConstantNotEqTy;
+
+ // Iterators.
+
+ typedef VariableBindingsTy::iterator vb_iterator;
vb_iterator begin() { return Data->VariableBindings.begin(); }
vb_iterator end() { return Data->VariableBindings.end(); }
@@ -199,6 +214,10 @@ public:
private:
ValueState::VariableBindingsTy::Factory VBFactory;
+ ValueState::ConstantNotEqTy::Factory CNEFactory;
+
+ /// StateSet - FoldingSet containing all the states created for analyzing
+ /// a particular function. This is used to unique states.
llvm::FoldingSet<ValueStateImpl> StateSet;
/// ValueMgr - Object that manages the data for all created RValues.