<div dir="ltr">This is somewhat nit-picky, but can you try and make sure that files always end<br>with a newline? Note that svn diff will warn about this with:<br>
\ No newline at end of file<br><br>It seems silly that this still matters but for whatever reason my version of gcov gets <br>unhappy if the newline is not present.<br><br> - Daniel<br><br><div class="gmail_quote">On Fri, Aug 29, 2008 at 7:52 AM, Zhongxing Xu <span dir="ltr"><<a href="mailto:xuzhongxing@gmail.com">xuzhongxing@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Author: zhongxingxu<br>
Date: Fri Aug 29 09:52:36 2008<br>
New Revision: 55536<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=55536&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=55536&view=rev</a><br>
Log:<br>
Migrate the rest symbolic analysis stuff to BasicConstraintManager.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Analysis/PathSensitive/ConstraintManager.h<br>
    cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h<br>
    cfe/trunk/lib/Analysis/BasicConstraintManager.cpp<br>
    cfe/trunk/lib/Analysis/CFRefCount.cpp<br>
    cfe/trunk/lib/Analysis/GRState.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/ConstraintManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ConstraintManager.h?rev=55536&r1=55535&r2=55536&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ConstraintManager.h?rev=55536&r1=55535&r2=55536&view=diff</a><br>

<br>
==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/PathSensitive/ConstraintManager.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/PathSensitive/ConstraintManager.h Fri Aug 29 09:52:36 2008<br>
@@ -1,17 +1,39 @@<br>
-#ifndef CONSTRAINT_MANAGER_H<br>
-#define CONSTRAINT_MANAGER_H<br>
+#ifndef LLVM_CLANG_ANALYSIS_CONSTRAINT_MANAGER_H<br>
+#define LLVM_CLANG_ANALYSIS_CONSTRAINT_MANAGER_H<br>
+<br>
+// FIXME: Typedef LiveSymbolsTy/DeadSymbolsTy at a more appropriate place.<br>
+#include "clang/Analysis/PathSensitive/Store.h"<br>
+<br>
+namespace llvm {<br>
+class APSInt;<br>
+}<br>
<br>
 namespace clang {<br>
<br>
 class GRState;<br>
 class GRStateManager;<br>
 class RVal;<br>
+class SymbolID;<br>
<br>
 class ConstraintManager {<br>
 public:<br>
   virtual ~ConstraintManager();<br>
   virtual const GRState* Assume(const GRState* St, RVal Cond, bool Assumption,<br>
                                 bool& isFeasible) = 0;<br>
+<br>
+  virtual const GRState* AddNE(const GRState* St, SymbolID sym,<br>
+                               const llvm::APSInt& V) = 0;<br>
+  virtual const llvm::APSInt* getSymVal(const GRState* St, SymbolID sym) = 0;<br>
+<br>
+  virtual bool isEqual(const GRState* St, SymbolID sym,<br>
+                       const llvm::APSInt& V) const = 0;<br>
+<br>
+  virtual const GRState* RemoveDeadBindings(const GRState* St,<br>
+                                    StoreManager::LiveSymbolsTy& LSymbols,<br>
+                                    StoreManager::DeadSymbolsTy& DSymbols) = 0;<br>
+<br>
+  virtual void print(const GRState* St, std::ostream& Out,<br>
+                     const char* nl, const char *sep) = 0;<br>
 };<br>
<br>
 ConstraintManager* CreateBasicConstraintManager(GRStateManager& statemgr);<br>
<br>
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h?rev=55536&r1=55535&r2=55536&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h?rev=55536&r1=55535&r2=55536&view=diff</a><br>

<br>
==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRState.h Fri Aug 29 09:52:36 2008<br>
@@ -115,13 +115,6 @@<br>
     Profile(ID, this);<br>
   }<br>
<br>
-  // Queries.<br>
-<br>
-  bool isNotEqual(SymbolID sym, const llvm::APSInt& V) const;<br>
-  bool isEqual(SymbolID sym, const llvm::APSInt& V) const;<br>
-<br>
-  const llvm::APSInt* getSymVal(SymbolID sym) const;<br>
-<br>
   RVal LookupExpr(Expr* E) const {<br>
     return Env.LookupExpr(E);<br>
   }<br>
@@ -153,7 +146,8 @@<br>
   void* const* FindGDM(void* K) const;<br>
<br>
   template <typename T><br>
-  typename GRStateTrait<T>::data_type get() const {<br>
+  typename GRStateTrait<T>::data_type<br>
+  get() const {<br>
     return GRStateTrait<T>::MakeData(FindGDM(GRStateTrait<T>::GDMIndex()));<br>
   }<br>
<br>
@@ -173,6 +167,7 @@<br>
   };<br>
<br>
   void print(std::ostream& Out, StoreManager& StoreMgr,<br>
+             ConstraintManager& ConstraintMgr,<br>
              Printer **Beg = 0, Printer **End = 0,<br>
              const char* nl = "\n", const char *sep = "") const;<br>
 };<br>
@@ -412,12 +407,6 @@<br>
<br>
   const GRState* getPersistentState(GRState& Impl);<br>
<br>
-  const GRState* AddEQ(const GRState* St, SymbolID sym,<br>
-                          const llvm::APSInt& V);<br>
-<br>
-  const GRState* AddNE(const GRState* St, SymbolID sym,<br>
-                          const llvm::APSInt& V);<br>
-<br>
   bool isEqual(const GRState* state, Expr* Ex, const llvm::APSInt& V);<br>
   bool isEqual(const GRState* state, Expr* Ex, uint64_t);<br>
<br>
@@ -460,12 +449,19 @@<br>
<br>
     return GRStateTrait<T>::MakeContext(p);<br>
   }<br>
-<br>
-  // Assumption logic.<br>
+<br>
   const GRState* Assume(const GRState* St, RVal Cond, bool Assumption,<br>
                            bool& isFeasible) {<br>
     return ConstraintMgr->Assume(St, Cond, Assumption, isFeasible);<br>
   }<br>
+<br>
+  const GRState* AddNE(const GRState* St, SymbolID sym, const llvm::APSInt& V) {<br>
+    return ConstraintMgr->AddNE(St, sym, V);<br>
+  }<br>
+<br>
+  const llvm::APSInt* getSymVal(const GRState* St, SymbolID sym) {<br>
+    return ConstraintMgr->getSymVal(St, sym);<br>
+  }<br>
 };<br>
<br>
 //===----------------------------------------------------------------------===//<br>
<br>
Modified: cfe/trunk/lib/Analysis/BasicConstraintManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicConstraintManager.cpp?rev=55536&r1=55535&r2=55536&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicConstraintManager.cpp?rev=55536&r1=55535&r2=55536&view=diff</a><br>

<br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/BasicConstraintManager.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/BasicConstraintManager.cpp Fri Aug 29 09:52:36 2008<br>
@@ -1,17 +1,19 @@<br>
 #include "clang/Analysis/PathSensitive/ConstraintManager.h"<br>
 #include "clang/Analysis/PathSensitive/GRState.h"<br>
+#include "clang/Analysis/PathSensitive/GRStateTrait.h"<br>
 #include "llvm/Support/Compiler.h"<br>
+#include "llvm/Support/raw_ostream.h"<br>
<br>
 using namespace clang;<br>
<br>
 namespace {<br>
<br>
+typedef llvm::ImmutableMap<SymbolID,GRState::IntSetTy> ConstNotEqTy;<br>
+typedef llvm::ImmutableMap<SymbolID,const llvm::APSInt*> ConstEqTy;<br>
+<br>
 // BasicConstraintManager only tracks equality and inequality constraints of<br>
 // constants and integer variables.<br>
 class VISIBILITY_HIDDEN BasicConstraintManager : public ConstraintManager {<br>
-  typedef llvm::ImmutableMap<SymbolID, GRState::IntSetTy> ConstNotEqTy;<br>
-  typedef llvm::ImmutableMap<SymbolID, const llvm::APSInt*> ConstEqTy;<br>
-<br>
   GRStateManager& StateMgr;<br>
<br>
 public:<br>
@@ -52,7 +54,22 @@<br>
<br>
   const GRState* AssumeSymLE(const GRState* St, SymbolID sym,<br>
                              const llvm::APSInt& V, bool& isFeasible);<br>
-  };<br>
+<br>
+  const GRState* AddEQ(const GRState* St, SymbolID sym, const llvm::APSInt& V);<br>
+<br>
+  const GRState* AddNE(const GRState* St, SymbolID sym, const llvm::APSInt& V);<br>
+<br>
+  const llvm::APSInt* getSymVal(const GRState* St, SymbolID sym);<br>
+  bool isNotEqual(const GRState* St, SymbolID sym, const llvm::APSInt& V) const;<br>
+  bool isEqual(const GRState* St, SymbolID sym, const llvm::APSInt& V) const;<br>
+<br>
+  const GRState* RemoveDeadBindings(const GRState* St,<br>
+                                    StoreManager::LiveSymbolsTy& LSymbols,<br>
+                                    StoreManager::DeadSymbolsTy& DSymbols);<br>
+<br>
+  void print(const GRState* St, std::ostream& Out,<br>
+             const char* nl, const char *sep);<br>
+};<br>
<br>
 } // end anonymous namespace<br>
<br>
@@ -205,17 +222,19 @@<br>
   } // end switch<br>
 }<br>
<br>
+<br>
+<br>
 const GRState*<br>
 BasicConstraintManager::AssumeSymNE(const GRState* St, SymbolID sym,<br>
                                     const llvm::APSInt& V, bool& isFeasible) {<br>
   // First, determine if sym == X, where X != V.<br>
-  if (const llvm::APSInt* X = St->getSymVal(sym)) {<br>
+  if (const llvm::APSInt* X = getSymVal(St, sym)) {<br>
     isFeasible = (*X != V);<br>
     return St;<br>
   }<br>
<br>
   // Second, determine if sym != V.<br>
-  if (St->isNotEqual(sym, V)) {<br>
+  if (isNotEqual(St, sym, V)) {<br>
     isFeasible = true;<br>
     return St;<br>
   }<br>
@@ -223,20 +242,20 @@<br>
   // If we reach here, sym is not a constant and we don't know if it is != V.<br>
   // Make that assumption.<br>
   isFeasible = true;<br>
-  return StateMgr.AddNE(St, sym, V);<br>
+  return AddNE(St, sym, V);<br>
 }<br>
<br>
 const GRState*<br>
 BasicConstraintManager::AssumeSymEQ(const GRState* St, SymbolID sym,<br>
                                     const llvm::APSInt& V, bool& isFeasible) {<br>
   // First, determine if sym == X, where X != V.<br>
-  if (const llvm::APSInt* X = St->getSymVal(sym)) {<br>
+  if (const llvm::APSInt* X = getSymVal(St, sym)) {<br>
     isFeasible = *X == V;<br>
     return St;<br>
   }<br>
<br>
   // Second, determine if sym != V.<br>
-  if (St->isNotEqual(sym, V)) {<br>
+  if (isNotEqual(St, sym, V)) {<br>
     isFeasible = false;<br>
     return St;<br>
   }<br>
@@ -245,7 +264,7 @@<br>
   // Make that assumption.<br>
<br>
   isFeasible = true;<br>
-  return StateMgr.AddEQ(St, sym, V);<br>
+  return AddEQ(St, sym, V);<br>
 }<br>
<br>
 // These logic will be handled in another ConstraintManager.<br>
@@ -272,7 +291,7 @@<br>
   // FIXME: Primitive logic for now.  Only reject a path if the value of<br>
   //  sym is a constant X and !(X >= V).<br>
<br>
-  if (const llvm::APSInt* X = St->getSymVal(sym)) {<br>
+  if (const llvm::APSInt* X = getSymVal(St, sym)) {<br>
     isFeasible = *X >= V;<br>
     return St;<br>
   }<br>
@@ -288,7 +307,7 @@<br>
   // FIXME: Primitive logic for now.  Only reject a path if the value of<br>
   //  sym is a constant X and !(X <= V).<br>
<br>
-  if (const llvm::APSInt* X = St->getSymVal(sym)) {<br>
+  if (const llvm::APSInt* X = getSymVal(St, sym)) {<br>
     isFeasible = *X <= V;<br>
     return St;<br>
   }<br>
@@ -296,3 +315,136 @@<br>
   isFeasible = true;<br>
   return St;<br>
 }<br>
+<br>
+static int ConstEqTyIndex = 0;<br>
+static int ConstNotEqTyIndex = 0;<br>
+<br>
+namespace clang {<br>
+  template<><br>
+  struct GRStateTrait<ConstNotEqTy> : public GRStatePartialTrait<ConstNotEqTy> {<br>
+    static inline void* GDMIndex() { return &ConstNotEqTyIndex; }<br>
+  };<br>
+<br>
+  template<><br>
+  struct GRStateTrait<ConstEqTy> : public GRStatePartialTrait<ConstEqTy> {<br>
+    static inline void* GDMIndex() { return &ConstEqTyIndex; }<br>
+  };<br>
+}<br>
+<br>
+const GRState* BasicConstraintManager::AddEQ(const GRState* St, SymbolID sym,<br>
+                                             const llvm::APSInt& V) {<br>
+  // Create a new state with the old binding replaced.<br>
+  GRStateRef state(St, StateMgr);<br>
+  return state.set<ConstEqTy>(sym, &V);<br>
+}<br>
+<br>
+const GRState* BasicConstraintManager::AddNE(const GRState* St, SymbolID sym,<br>
+                                             const llvm::APSInt& V) {<br>
+  GRState::IntSetTy::Factory ISetFactory(StateMgr.getAllocator());<br>
+  GRStateRef state(St, StateMgr);<br>
+<br>
+  // First, retrieve the NE-set associated with the given symbol.<br>
+  ConstNotEqTy::data_type* T = state.get<ConstNotEqTy>(sym);<br>
+  GRState::IntSetTy S = T ? *T : ISetFactory.GetEmptySet();<br>
+<br>
+<br>
+  // Now add V to the NE set.<br>
+  S = ISetFactory.Add(S, &V);<br>
+<br>
+  // Create a new state with the old binding replaced.<br>
+  return state.set<ConstNotEqTy>(sym, S);<br>
+}<br>
+<br>
+const llvm::APSInt* BasicConstraintManager::getSymVal(const GRState* St,<br>
+                                                      SymbolID sym) {<br>
+  const ConstEqTy::data_type* T = St->get<ConstEqTy>(sym);<br>
+  return T ? *T : NULL;<br>
+}<br>
+<br>
+bool BasicConstraintManager::isNotEqual(const GRState* St, SymbolID sym,<br>
+                                        const llvm::APSInt& V) const {<br>
+<br>
+  // Retrieve the NE-set associated with the given symbol.<br>
+  const ConstNotEqTy::data_type* T = St->get<ConstNotEqTy>(sym);<br>
+<br>
+  // See if V is present in the NE-set.<br>
+  return T ? T->contains(&V) : false;<br>
+}<br>
+<br>
+bool BasicConstraintManager::isEqual(const GRState* St, SymbolID sym,<br>
+                                     const llvm::APSInt& V) const {<br>
+  // Retrieve the EQ-set associated with the given symbol.<br>
+  const ConstEqTy::data_type* T = St->get<ConstEqTy>(sym);<br>
+  // See if V is present in the EQ-set.<br>
+  return T ? **T == V : false;<br>
+}<br>
+<br>
+const GRState* BasicConstraintManager::RemoveDeadBindings(const GRState* St,<br>
+                                        StoreManager::LiveSymbolsTy& LSymbols,<br>
+                                        StoreManager::DeadSymbolsTy& DSymbols) {<br>
+  GRStateRef state(St, StateMgr);<br>
+  ConstEqTy CE = state.get<ConstEqTy>();<br>
+  ConstEqTy::Factory& CEFactory = state.get_context<ConstEqTy>();<br>
+<br>
+  for (ConstEqTy::iterator I = CE.begin(), E = CE.end(); I!=E; ++I) {<br>
+    SymbolID sym = I.getKey();<br>
+    if (!LSymbols.count(sym)) {<br>
+      DSymbols.insert(sym);<br>
+      CE = CEFactory.Remove(CE, sym);<br>
+    }<br>
+  }<br>
+  state = state.set<ConstEqTy>(CE);<br>
+<br>
+  ConstNotEqTy CNE = state.get<ConstNotEqTy>();<br>
+  ConstNotEqTy::Factory& CNEFactory = state.get_context<ConstNotEqTy>();<br>
+<br>
+  for (ConstNotEqTy::iterator I = CNE.begin(), E = CNE.end(); I != E; ++I) {<br>
+    SymbolID sym = I.getKey();<br>
+    if (!LSymbols.count(sym)) {<br>
+      DSymbols.insert(sym);<br>
+      CNE = CNEFactory.Remove(CNE, sym);<br>
+    }<br>
+  }<br>
+<br>
+  return state.set<ConstNotEqTy>(CNE);<br>
+}<br>
+<br>
+void BasicConstraintManager::print(const GRState* St, std::ostream& Out,<br>
+                                   const char* nl, const char *sep) {<br>
+  // Print equality constraints.<br>
+<br>
+  ConstEqTy CE = St->get<ConstEqTy>();<br>
+<br>
+  if (!CE.isEmpty()) {<br>
+    Out << nl << sep << "'==' constraints:";<br>
+<br>
+    for (ConstEqTy::iterator I = CE.begin(), E = CE.end(); I!=E; ++I) {<br>
+      Out << nl << " $" << I.getKey();<br>
+      llvm::raw_os_ostream OS(Out);<br>
+      OS << " : "   << *I.getData();<br>
+    }<br>
+  }<br>
+<br>
+  // Print != constraints.<br>
+<br>
+  ConstNotEqTy CNE = St->get<ConstNotEqTy>();<br>
+<br>
+  if (!CNE.isEmpty()) {<br>
+    Out << nl << sep << "'!=' constraints:";<br>
+<br>
+    for (ConstNotEqTy::iterator I = CNE.begin(), EI = CNE.end(); I!=EI; ++I) {<br>
+      Out << nl << " $" << I.getKey() << " : ";<br>
+      bool isFirst = true;<br>
+<br>
+      GRState::IntSetTy::iterator J = I.getData().begin(),<br>
+                                  EJ = I.getData().end();<br>
+<br>
+      for ( ; J != EJ; ++J) {<br>
+        if (isFirst) isFirst = false;<br>
+        else Out << ", ";<br>
+<br>
+        Out << *J;<br>
+      }<br>
+    }<br>
+  }<br>
+}<br>
\ No newline at end of file<br>
<br>
Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=55536&r1=55535&r2=55536&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=55536&r1=55535&r2=55536&view=diff</a><br>

<br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Fri Aug 29 09:52:36 2008<br>
@@ -1905,7 +1905,7 @@<br>
   for (RefBindings::iterator I=B.begin(), E=B.end(); I!=E; ++I) {<br>
     // Check if the symbol is null (or equal to any constant).<br>
     // If this is the case, stop tracking the symbol.<br>
-    if (St->getSymVal(I.getKey())) {<br>
+    if (VMgr.getSymVal(St, I.getKey())) {<br>
       changed = true;<br>
       B = RefBFactory.Remove(B, I.getKey());<br>
     }<br>
<br>
Modified: cfe/trunk/lib/Analysis/GRState.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRState.cpp?rev=55536&r1=55535&r2=55536&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRState.cpp?rev=55536&r1=55535&r2=55536&view=diff</a><br>

<br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/GRState.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/GRState.cpp Fri Aug 29 09:52:36 2008<br>
@@ -32,50 +32,6 @@<br>
     I->second.second(I->second.first);<br>
 }<br>
<br>
-//===----------------------------------------------------------------------===//<br>
-//  Basic symbolic analysis.  This will eventually be refactored into a<br>
-//  separate component.<br>
-//===----------------------------------------------------------------------===//<br>
-<br>
-typedef llvm::ImmutableMap<SymbolID,GRState::IntSetTy> ConstNotEqTy;<br>
-typedef llvm::ImmutableMap<SymbolID,const llvm::APSInt*> ConstEqTy;<br>
-<br>
-static int ConstEqTyIndex = 0;<br>
-static int ConstNotEqTyIndex = 0;<br>
-<br>
-namespace clang {<br>
-  template<><br>
-  struct GRStateTrait<ConstNotEqTy> : public GRStatePartialTrait<ConstNotEqTy> {<br>
-    static inline void* GDMIndex() { return &ConstNotEqTyIndex; }<br>
-  };<br>
-<br>
-  template<><br>
-  struct GRStateTrait<ConstEqTy> : public GRStatePartialTrait<ConstEqTy> {<br>
-    static inline void* GDMIndex() { return &ConstEqTyIndex; }<br>
-  };<br>
-}<br>
-<br>
-bool GRState::isNotEqual(SymbolID sym, const llvm::APSInt& V) const {<br>
-<br>
-  // Retrieve the NE-set associated with the given symbol.<br>
-  const ConstNotEqTy::data_type* T = get<ConstNotEqTy>(sym);<br>
-<br>
-  // See if V is present in the NE-set.<br>
-  return T ? T->contains(&V) : false;<br>
-}<br>
-<br>
-bool GRState::isEqual(SymbolID sym, const llvm::APSInt& V) const {<br>
-  // Retrieve the EQ-set associated with the given symbol.<br>
-  const ConstEqTy::data_type* T = get<ConstEqTy>(sym);<br>
-  // See if V is present in the EQ-set.<br>
-  return T ? **T == V : false;<br>
-}<br>
-<br>
-const llvm::APSInt* GRState::getSymVal(SymbolID sym) const {<br>
-  const ConstEqTy::data_type* T = get<ConstEqTy>(sym);<br>
-  return T ? *T : NULL;<br>
-}<br>
-<br>
 const GRState*<br>
 GRStateManager::RemoveDeadBindings(const GRState* St, Stmt* Loc,<br>
                                    const LiveVariables& Liveness,<br>
@@ -99,37 +55,9 @@<br>
   DSymbols.clear();<br>
   NewSt.St = StMgr->RemoveDeadBindings(St->getStore(), Loc, Liveness, DRoots,<br>
                                        LSymbols, DSymbols);<br>
-<br>
-<br>
-  GRStateRef state(getPersistentState(NewSt), *this);<br>
-<br>
-  // Remove the dead symbols from the symbol tracker.<br>
-  // FIXME: Refactor into something else that manages symbol values.<br>
-<br>
-  ConstEqTy CE = state.get<ConstEqTy>();<br>
-  ConstEqTy::Factory& CEFactory = state.get_context<ConstEqTy>();<br>
-<br>
-  for (ConstEqTy::iterator I = CE.begin(), E = CE.end(); I!=E; ++I) {<br>
-    SymbolID sym = I.getKey();<br>
-    if (!LSymbols.count(sym)) {<br>
-      DSymbols.insert(sym);<br>
-      CE = CEFactory.Remove(CE, sym);<br>
-    }<br>
-  }<br>
-  state = state.set<ConstEqTy>(CE);<br>
<br>
-  ConstNotEqTy CNE = state.get<ConstNotEqTy>();<br>
-  ConstNotEqTy::Factory& CNEFactory = state.get_context<ConstNotEqTy>();<br>
-<br>
-  for (ConstNotEqTy::iterator I = CNE.begin(), E = CNE.end(); I != E; ++I) {<br>
-    SymbolID sym = I.getKey();<br>
-    if (!LSymbols.count(sym)) {<br>
-      DSymbols.insert(sym);<br>
-      CNE = CNEFactory.Remove(CNE, sym);<br>
-    }<br>
-  }<br>
-<br>
-  return state.set<ConstNotEqTy>(CNE);<br>
+  return ConstraintMgr->RemoveDeadBindings(getPersistentState(NewSt),<br>
+                                           LSymbols, DSymbols);<br>
 }<br>
<br>
 const GRState* GRStateManager::SetRVal(const GRState* St, LVal LV,<br>
@@ -177,30 +105,6 @@<br>
   return getPersistentState(NewSt);<br>
 }<br>
<br>
-<br>
-const GRState* GRStateManager::AddNE(const GRState* St, SymbolID sym,<br>
-                                     const llvm::APSInt& V) {<br>
-<br>
-  GRStateRef state(St, *this);<br>
-<br>
-  // First, retrieve the NE-set associated with the given symbol.<br>
-  ConstNotEqTy::data_type* T = state.get<ConstNotEqTy>(sym);<br>
-  GRState::IntSetTy S = T ? *T : ISetFactory.GetEmptySet();<br>
-<br>
-  // Now add V to the NE set.<br>
-  S = ISetFactory.Add(S, &V);<br>
-<br>
-  // Create a new state with the old binding replaced.<br>
-  return state.set<ConstNotEqTy>(sym, S);<br>
-}<br>
-<br>
-const GRState* GRStateManager::AddEQ(const GRState* St, SymbolID sym,<br>
-                                           const llvm::APSInt& V) {<br>
-  // Create a new state with the old binding replaced.<br>
-  GRStateRef state(St, *this);<br>
-  return state.set<ConstEqTy>(sym, &V);<br>
-}<br>
-<br>
 const GRState* GRStateManager::getInitialState() {<br>
<br>
   GRState StateImpl(EnvMgr.getInitialEnvironment(),<br>
@@ -231,6 +135,7 @@<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 void GRState::print(std::ostream& Out, StoreManager& StoreMgr,<br>
+                    ConstraintManager& ConstraintMgr,<br>
                     Printer** Beg, Printer** End,<br>
                     const char* nl, const char* sep) const {<br>
<br>
@@ -271,42 +176,7 @@<br>
     I.getData().print(Out);<br>
   }<br>
<br>
-  // Print equality constraints.<br>
-  // FIXME: Make just another printer do this.<br>
-  ConstEqTy CE = get<ConstEqTy>();<br>
-<br>
-  if (!CE.isEmpty()) {<br>
-    Out << nl << sep << "'==' constraints:";<br>
-<br>
-    for (ConstEqTy::iterator I = CE.begin(), E = CE.end(); I!=E; ++I) {<br>
-      Out << nl << " $" << I.getKey();<br>
-      llvm::raw_os_ostream OS(Out);<br>
-      OS << " : "   << *I.getData();<br>
-    }<br>
-  }<br>
-<br>
-  // Print != constraints.<br>
-  // FIXME: Make just another printer do this.<br>
-<br>
-  ConstNotEqTy CNE = get<ConstNotEqTy>();<br>
-<br>
-  if (!CNE.isEmpty()) {<br>
-    Out << nl << sep << "'!=' constraints:";<br>
-<br>
-    for (ConstNotEqTy::iterator I = CNE.begin(), EI = CNE.end(); I!=EI; ++I) {<br>
-      Out << nl << " $" << I.getKey() << " : ";<br>
-      isFirst = true;<br>
-<br>
-      IntSetTy::iterator J = I.getData().begin(), EJ = I.getData().end();<br>
-<br>
-      for ( ; J != EJ; ++J) {<br>
-        if (isFirst) isFirst = false;<br>
-        else Out << ", ";<br>
-<br>
-        Out << *J;<br>
-      }<br>
-    }<br>
-  }<br>
+  ConstraintMgr.print(this, Out, nl, sep);<br>
<br>
   // Print checker-specific data.<br>
   for ( ; Beg != End ; ++Beg) (*Beg)->Print(Out, this, nl, sep);<br>
@@ -323,7 +193,7 @@<br>
 void GRStateRef::print(std::ostream& Out, const char* nl, const char* sep)const{<br>
   GRState::Printer **beg = Mgr->Printers.empty() ? 0 : &Mgr->Printers[0];<br>
   GRState::Printer **end = !beg ? 0 : beg + Mgr->Printers.size();<br>
-  St->print(Out, *Mgr->StMgr, beg, end, nl, sep);<br>
+  St->print(Out, *Mgr->StMgr, *Mgr->ConstraintMgr, beg, end, nl, sep);<br>
 }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
@@ -376,10 +246,10 @@<br>
     return X->getValue() == Y;<br>
<br>
   if (nonlval::SymbolVal* X = dyn_cast<nonlval::SymbolVal>(&V))<br>
-    return state->isEqual(X->getSymbol(), Y);<br>
+    return ConstraintMgr->isEqual(state, X->getSymbol(), Y);<br>
<br>
   if (lval::SymbolVal* X = dyn_cast<lval::SymbolVal>(&V))<br>
-    return state->isEqual(X->getSymbol(), Y);<br>
+    return ConstraintMgr->isEqual(state, X->getSymbol(), Y);<br>
<br>
   return false;<br>
 }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>