From: Ted Kremenek Date: Tue, 5 Feb 2008 18:51:06 +0000 (+0000) Subject: Added a "ConstantNotEq" map to ValueState (and added necessary typedefs and factory... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=174aea40779dd0c8dc3fd9bbe2e95f92853a9967;p=clang 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 --- 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 IntSetTy; + typedef llvm::ImmutableMap VariableBindingsTy; + typedef llvm::ImmutableMap 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 StateSet; /// ValueMgr - Object that manages the data for all created RValues.