Make checkers run in deterministic order.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85597 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index 88e6798..284fae8 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -118,13 +118,11 @@
   ExplodedNodeSet Tmp;
   ExplodedNodeSet *PrevSet = &Src;
 
-  for (llvm::DenseMap<void*, Checker*>::iterator I = Checkers.begin(), 
-         E = Checkers.end(); I != E; ++I) {
-
-    llvm::DenseMap<void*, Checker*>::iterator X = I;
-
-    ExplodedNodeSet *CurrSet = (++X == E) ? &Dst
+  for (CheckersOrdered::iterator I=Checkers.begin(),E=Checkers.end(); I!=E; ++I)
+  {
+    ExplodedNodeSet *CurrSet = (I+1 == E) ? &Dst 
                                           : (PrevSet == &Tmp) ? &Src : &Tmp;
+
     CurrSet->clear();
     void *tag = I->first;
     Checker *checker = I->second;
@@ -146,7 +144,7 @@
   if (Checkers.empty())
     return Pred;
 
-  for (llvm::DenseMap<void*, Checker*>::iterator I = Checkers.begin(), 
+  for (CheckersOrdered::iterator I = Checkers.begin(), 
          E = Checkers.end(); I != E; ++I) {
     Pred = I->second->CheckLocation(S, Pred, state, V, *this);
     if (!Pred)
@@ -184,8 +182,7 @@
 GRExprEngine::~GRExprEngine() {
   BR.FlushReports();
   delete [] NSExceptionInstanceRaiseSelectors;
-  for (llvm::DenseMap<void*, Checker*>::iterator I=Checkers.begin(), 
-         E=Checkers.end(); I!=E; ++I)
+  for (CheckersOrdered::iterator I=Checkers.begin(), E=Checkers.end(); I!=E;++I)
     delete I->second;
 }
 
@@ -2861,6 +2858,15 @@
 }
 
 //===----------------------------------------------------------------------===//
+// Checker registration/lookup.
+//===----------------------------------------------------------------------===//
+
+Checker *GRExprEngine::lookupChecker(void *tag) const {
+  CheckerMap::iterator I = CheckerM.find(tag);
+  return (I == CheckerM.end()) ? NULL : Checkers[I->second].second;
+}
+
+//===----------------------------------------------------------------------===//
 // Visualization.
 //===----------------------------------------------------------------------===//