diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-01-05 00:15:18 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-01-05 00:15:18 +0000 |
commit | 32a58084a4c53e6938dd81bfce224db25a5976d1 (patch) | |
tree | b87110336d229ca6e376bb3f9809e71297b02c2c /lib/Analysis | |
parent | 51313c39c84407dd6a323be99a8c322bf8d052a9 (diff) |
Remove references to 'Checker' and 'GRTransferFuncs' from
GRStateManager. Having these references was an abstraction violation,
as they really should only be known about GRExprEngine.
This change required adding a new 'ProcessAssume' callback in
GRSubEngine. GRExprEngine implements this callback by calling
'EvalAssume' on all registered Checker objects as well as the
registered GRTransferFunc object.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92549 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/BasicConstraintManager.cpp | 11 | ||||
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 38 | ||||
-rw-r--r-- | lib/Analysis/RangeConstraintManager.cpp | 8 | ||||
-rw-r--r-- | lib/Analysis/SimpleConstraintManager.cpp | 47 | ||||
-rw-r--r-- | lib/Analysis/SimpleConstraintManager.h | 3 |
5 files changed, 48 insertions, 59 deletions
diff --git a/lib/Analysis/BasicConstraintManager.cpp b/lib/Analysis/BasicConstraintManager.cpp index 6c3f7b2245..6dfc470530 100644 --- a/lib/Analysis/BasicConstraintManager.cpp +++ b/lib/Analysis/BasicConstraintManager.cpp @@ -49,8 +49,9 @@ class BasicConstraintManager : public SimpleConstraintManager { GRState::IntSetTy::Factory ISetFactory; public: - BasicConstraintManager(GRStateManager& statemgr) - : ISetFactory(statemgr.getAllocator()) {} + BasicConstraintManager(GRStateManager &statemgr, GRSubEngine &subengine) + : SimpleConstraintManager(subengine), + ISetFactory(statemgr.getAllocator()) {} const GRState* AssumeSymNE(const GRState* state, SymbolRef sym, const llvm::APSInt& V); @@ -88,9 +89,9 @@ public: } // end anonymous namespace -ConstraintManager* clang::CreateBasicConstraintManager(GRStateManager& StateMgr) -{ - return new BasicConstraintManager(StateMgr); +ConstraintManager* clang::CreateBasicConstraintManager(GRStateManager& statemgr, + GRSubEngine &subengine) { + return new BasicConstraintManager(statemgr, subengine); } const GRState* diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 2ce8edd1cc..013bed04f9 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -300,23 +300,27 @@ static void RegisterInternalChecks(GRExprEngine &Eng) { RegisterOSAtomicChecker(Eng); } -GRExprEngine::GRExprEngine(AnalysisManager &mgr) +GRExprEngine::GRExprEngine(AnalysisManager &mgr, GRTransferFuncs *tf) : AMgr(mgr), CoreEngine(mgr.getASTContext(), *this), G(CoreEngine.getGraph()), Builder(NULL), StateMgr(G.getContext(), mgr.getStoreManagerCreator(), - mgr.getConstraintManagerCreator(), G.getAllocator()), + mgr.getConstraintManagerCreator(), G.getAllocator(), + *this), SymMgr(StateMgr.getSymbolManager()), ValMgr(StateMgr.getValueManager()), SVator(ValMgr.getSValuator()), CurrentStmt(NULL), NSExceptionII(NULL), NSExceptionInstanceRaiseSelectors(NULL), RaiseSel(GetNullarySelector("raise", G.getContext())), - BR(mgr, *this) -{ + BR(mgr, *this), TF(tf) { // Register internal checks. RegisterInternalChecks(*this); + + // FIXME: Eventually remove the TF object entirely. + TF->RegisterChecks(*this); + TF->RegisterPrinters(getStateManager().Printers); } GRExprEngine::~GRExprEngine() { @@ -330,13 +334,6 @@ GRExprEngine::~GRExprEngine() { // Utility methods. //===----------------------------------------------------------------------===// -void GRExprEngine::setTransferFunctionsAndCheckers(GRTransferFuncs* tf) { - StateMgr.TF = tf; - StateMgr.Checkers = &Checkers; - tf->RegisterChecks(*this); - tf->RegisterPrinters(getStateManager().Printers); -} - void GRExprEngine::AddCheck(GRSimpleAPICheck* A, Stmt::StmtClass C) { if (!BatchAuditor) BatchAuditor.reset(new MappedBatchAuditor(getGraph().getAllocator())); @@ -415,6 +412,25 @@ const GRState* GRExprEngine::getInitialState(const LocationContext *InitLoc) { // Top-level transfer function logic (Dispatcher). //===----------------------------------------------------------------------===// +/// EvalAssume - Called by ConstraintManager. Used to call checker-specific +/// logic for handling assumptions on symbolic values. +const GRState *GRExprEngine::ProcessAssume(const GRState *state, SVal cond, + bool assumption) { + for (CheckersOrdered::iterator I = Checkers.begin(), E = Checkers.end(); + I != E; ++I) { + + if (!state) + return NULL; + + state = I->second->EvalAssume(state, cond, assumption); + } + + if (!state) + return NULL; + + return TF->EvalAssume(state, cond, assumption); +} + void GRExprEngine::ProcessStmt(CFGElement CE, GRStmtNodeBuilder& builder) { CurrentStmt = CE.getStmt(); PrettyStackTraceLoc CrashInfo(getContext().getSourceManager(), diff --git a/lib/Analysis/RangeConstraintManager.cpp b/lib/Analysis/RangeConstraintManager.cpp index 7330b62614..2cf3dfb6d0 100644 --- a/lib/Analysis/RangeConstraintManager.cpp +++ b/lib/Analysis/RangeConstraintManager.cpp @@ -234,7 +234,8 @@ namespace { class RangeConstraintManager : public SimpleConstraintManager{ RangeSet GetRange(const GRState *state, SymbolRef sym); public: - RangeConstraintManager() {} + RangeConstraintManager(GRSubEngine &subengine) + : SimpleConstraintManager(subengine) {} const GRState* AssumeSymNE(const GRState* St, SymbolRef sym, const llvm::APSInt& V); @@ -273,8 +274,9 @@ private: } // end anonymous namespace -ConstraintManager* clang::CreateRangeConstraintManager(GRStateManager&) { - return new RangeConstraintManager(); +ConstraintManager* clang::CreateRangeConstraintManager(GRStateManager&, + GRSubEngine &subeng) { + return new RangeConstraintManager(subeng); } const llvm::APSInt* RangeConstraintManager::getSymVal(const GRState* St, diff --git a/lib/Analysis/SimpleConstraintManager.cpp b/lib/Analysis/SimpleConstraintManager.cpp index 23c3b41758..eca20d574d 100644 --- a/lib/Analysis/SimpleConstraintManager.cpp +++ b/lib/Analysis/SimpleConstraintManager.cpp @@ -65,25 +65,10 @@ const GRState *SimpleConstraintManager::Assume(const GRState *state, return Assume(state, cast<Loc>(Cond), Assumption); } -const GRState *SimpleConstraintManager::Assume(const GRState *state, Loc Cond, - bool Assumption) { - - state = AssumeAux(state, Cond, Assumption); - - // EvalAssume is used to call into the GRTransferFunction object to perform - // any checker-specific update of the state based on this assumption being - // true or false. - - if (!state) - return 0; - - std::vector<std::pair<void *, Checker*> >::iterator - I = state->checker_begin(), E = state->checker_end(); - - for (; I != E; ++I) { - state = I->second->EvalAssume(state, Cond, Assumption); - } - return state->getTransferFuncs().EvalAssume(state, Cond, Assumption); +const GRState *SimpleConstraintManager::Assume(const GRState *state, Loc cond, + bool assumption) { + state = AssumeAux(state, cond, assumption); + return SU.ProcessAssume(state, cond, assumption); } const GRState *SimpleConstraintManager::AssumeAux(const GRState *state, @@ -130,26 +115,10 @@ const GRState *SimpleConstraintManager::AssumeAux(const GRState *state, } const GRState *SimpleConstraintManager::Assume(const GRState *state, - NonLoc Cond, - bool Assumption) { - - state = AssumeAux(state, Cond, Assumption); - - // EvalAssume is used to call into the GRTransferFunction object to perform - // any checker-specific update of the state based on this assumption being - // true or false. - - if (!state) - return 0; - - std::vector<std::pair<void *, Checker*> >::iterator - I = state->checker_begin(), E = state->checker_end(); - - for (; I != E; ++I) { - state = I->second->EvalAssume(state, Cond, Assumption); - } - - return state->getTransferFuncs().EvalAssume(state, Cond, Assumption); + NonLoc cond, + bool assumption) { + state = AssumeAux(state, cond, assumption); + return SU.ProcessAssume(state, cond, assumption); } const GRState *SimpleConstraintManager::AssumeAux(const GRState *state, diff --git a/lib/Analysis/SimpleConstraintManager.h b/lib/Analysis/SimpleConstraintManager.h index 0c58440ac0..8182398319 100644 --- a/lib/Analysis/SimpleConstraintManager.h +++ b/lib/Analysis/SimpleConstraintManager.h @@ -20,8 +20,9 @@ namespace clang { class SimpleConstraintManager : public ConstraintManager { + GRSubEngine &SU; public: - SimpleConstraintManager() {} + SimpleConstraintManager(GRSubEngine &subengine) : SU(subengine) {} virtual ~SimpleConstraintManager(); //===------------------------------------------------------------------===// |