]> granicus.if.org Git - clang/commitdiff
Added a "ConstantNotEq" map to ValueState (and added necessary typedefs and factory...
authorTed Kremenek <kremenek@apple.com>
Tue, 5 Feb 2008 18:51:06 +0000 (18:51 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 5 Feb 2008 18:51:06 +0000 (18:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46758 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/RValues.h
Analysis/ValueState.cpp
Analysis/ValueState.h

index 9048c6753ae1cc0eece305bc2e1ca9193cd3887a..b5b7873f633c9252da4446c31bd20da2faef8dca 100644 (file)
@@ -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 {
index 2166a8699ff953dcb925f1490ff2da2a7a7bceab..9bd02a29bdcdad7dde1c68294e5989c5607229f1 100644 (file)
@@ -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);
 }
index 57d80e90ccd70c4b52a672cbf4eddea2b416b4bb..984901fd793b19517a82d618c6c7abfa3dcd4398 100644 (file)
@@ -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.