aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/GRExprEngine.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-10-30 17:47:32 +0000
committerTed Kremenek <kremenek@apple.com>2009-10-30 17:47:32 +0000
commit094bef56a7900f13bb777f9a352704104b1458e7 (patch)
tree24214582b6d11f2e572bb37dca5254c85d9b3591 /lib/Analysis/GRExprEngine.cpp
parentd86caaa6c3d1f8ec4307f883d6b1a7722aecdc81 (diff)
Make checkers run in deterministic order.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85597 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/GRExprEngine.cpp')
-rw-r--r--lib/Analysis/GRExprEngine.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index 88e67981ac..284fae8675 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -118,13 +118,11 @@ void GRExprEngine::CheckerVisit(Stmt *S, ExplodedNodeSet &Dst,
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 @@ ExplodedNode *GRExprEngine::CheckerVisitLocation(Stmt *S, ExplodedNode *Pred,
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(AnalysisManager &mgr)
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 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
}
//===----------------------------------------------------------------------===//
+// 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.
//===----------------------------------------------------------------------===//