From c179a7fbb294fe3ff6cf5479f6239a10f39628c7 Mon Sep 17 00:00:00 2001 From: Zhongxing Xu Date: Fri, 5 Mar 2010 04:45:36 +0000 Subject: [PATCH] Remove reference to AnalysisContext in Environment. We already have LocationContext information in ExplodedNode. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97785 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../clang/Checker/PathSensitive/Environment.h | 14 ++++--------- include/clang/Checker/PathSensitive/GRState.h | 14 +++---------- .../Checker/PathSensitive/SymbolManager.h | 15 ++++++-------- lib/Checker/Environment.cpp | 8 ++++---- lib/Checker/GRCoreEngine.cpp | 1 - lib/Checker/GRExprEngine.cpp | 8 ++++---- lib/Checker/GRState.cpp | 20 ++++++------------- lib/Checker/SymbolManager.cpp | 10 +++++++--- 8 files changed, 34 insertions(+), 56 deletions(-) diff --git a/include/clang/Checker/PathSensitive/Environment.h b/include/clang/Checker/PathSensitive/Environment.h index e7c8319fb7..6051654f48 100644 --- a/include/clang/Checker/PathSensitive/Environment.h +++ b/include/clang/Checker/PathSensitive/Environment.h @@ -26,7 +26,6 @@ namespace clang { -class AnalysisContext; class EnvironmentManager; class ValueManager; class LiveVariables; @@ -41,10 +40,9 @@ private: // Data. BindingsTy ExprBindings; - AnalysisContext *ACtx; - Environment(BindingsTy eb, AnalysisContext *aCtx) - : ExprBindings(eb), ACtx(aCtx) {} + Environment(BindingsTy eb) + : ExprBindings(eb) {} public: typedef BindingsTy::iterator iterator; @@ -58,14 +56,10 @@ public: SVal GetSVal(const Stmt* Ex, ValueManager& ValMgr) const; - AnalysisContext &getAnalysisContext() const { return *ACtx; } - void setAnalysisContext(AnalysisContext *ctx) { ACtx = ctx; } - /// Profile - Profile the contents of an Environment object for use /// in a FoldingSet. static void Profile(llvm::FoldingSetNodeID& ID, const Environment* E) { E->ExprBindings.Profile(ID); - ID.AddPointer(E->ACtx); } /// Profile - Used to profile the contents of this object for inclusion @@ -88,8 +82,8 @@ public: EnvironmentManager(llvm::BumpPtrAllocator& Allocator) : F(Allocator) {} ~EnvironmentManager() {} - Environment getInitialEnvironment(AnalysisContext *ACtx) { - return Environment(F.GetEmptyMap(), ACtx); + Environment getInitialEnvironment() { + return Environment(F.GetEmptyMap()); } Environment BindExpr(Environment Env, const Stmt *S, SVal V, diff --git a/include/clang/Checker/PathSensitive/GRState.h b/include/clang/Checker/PathSensitive/GRState.h index 7e2720ba48..1178143bcc 100644 --- a/include/clang/Checker/PathSensitive/GRState.h +++ b/include/clang/Checker/PathSensitive/GRState.h @@ -109,14 +109,6 @@ public: return *StateMgr; } - /// getAnalysisContext - Return the AnalysisContext associated with this - /// state. - AnalysisContext &getAnalysisContext() const { - return Env.getAnalysisContext(); - } - - const GRState *setAnalysisContext(AnalysisContext *ctx) const; - /// getEnvironment - Return the environment associated with this state. /// The environment is the mapping from expressions to values. const Environment& getEnvironment() const { return Env; } @@ -338,12 +330,12 @@ public: }; // Pretty-printing. - void print(llvm::raw_ostream& Out, const char *nl = "\n", + void print(llvm::raw_ostream& Out, CFG &C, const char *nl = "\n", const char *sep = "") const; - void printStdErr() const; + void printStdErr(CFG &C) const; - void printDOT(llvm::raw_ostream& Out) const; + void printDOT(llvm::raw_ostream& Out, CFG &C) const; }; class GRStateSet { diff --git a/include/clang/Checker/PathSensitive/SymbolManager.h b/include/clang/Checker/PathSensitive/SymbolManager.h index d49f5e81c8..b6630c3d97 100644 --- a/include/clang/Checker/PathSensitive/SymbolManager.h +++ b/include/clang/Checker/PathSensitive/SymbolManager.h @@ -331,23 +331,20 @@ class SymbolReaper { SetTy TheLiving; SetTy TheDead; - LiveVariables& Liveness; + const LocationContext *LCtx; SymbolManager& SymMgr; - const StackFrameContext *CurrentStackFrame; public: - SymbolReaper(LiveVariables& liveness, SymbolManager& symmgr, - const StackFrameContext *currentStackFrame) - : Liveness(liveness), SymMgr(symmgr), CurrentStackFrame(currentStackFrame) - {} + SymbolReaper(const LocationContext *ctx, SymbolManager& symmgr) + : LCtx(ctx), SymMgr(symmgr) {} ~SymbolReaper() {} + const LocationContext *getLocationContext() const { return LCtx; } + bool isLive(SymbolRef sym); - bool isLive(const Stmt* Loc, const Stmt* ExprVal) const { - return Liveness.isLive(Loc, ExprVal); - } + bool isLive(const Stmt* Loc, const Stmt* ExprVal) const; bool isLive(const Stmt* Loc, const VarRegion *VR) const; diff --git a/lib/Checker/Environment.cpp b/lib/Checker/Environment.cpp index c2c9190fc9..671cf89119 100644 --- a/lib/Checker/Environment.cpp +++ b/lib/Checker/Environment.cpp @@ -78,12 +78,12 @@ Environment EnvironmentManager::BindExpr(Environment Env, const Stmt *S, if (V.isUnknown()) { if (Invalidate) - return Environment(F.Remove(Env.ExprBindings, S), Env.ACtx); + return Environment(F.Remove(Env.ExprBindings, S)); else return Env; } - return Environment(F.Add(Env.ExprBindings, S, V), Env.ACtx); + return Environment(F.Add(Env.ExprBindings, S, V)); } namespace { @@ -109,12 +109,12 @@ EnvironmentManager::RemoveDeadBindings(Environment Env, const Stmt *S, const GRState *ST, llvm::SmallVectorImpl &DRoots) { - CFG &C = *Env.getAnalysisContext().getCFG(); + CFG &C = *SymReaper.getLocationContext()->getCFG(); // We construct a new Environment object entirely, as this is cheaper than // individually removing all the subexpression bindings (which will greatly // outnumber block-level expression bindings). - Environment NewEnv = getInitialEnvironment(&Env.getAnalysisContext()); + Environment NewEnv = getInitialEnvironment(); // Iterate over the block-expr bindings. for (Environment::iterator I = Env.begin(), E = Env.end(); diff --git a/lib/Checker/GRCoreEngine.cpp b/lib/Checker/GRCoreEngine.cpp index 63ac31d606..a9347d0164 100644 --- a/lib/Checker/GRCoreEngine.cpp +++ b/lib/Checker/GRCoreEngine.cpp @@ -682,7 +682,6 @@ void GRCallExitNodeBuilder::GenerateNode(const GRState *state) { // Get the callee's location context. const StackFrameContext *LocCtx = cast(Pred->getLocationContext()); - state = state->setAnalysisContext(LocCtx->getParent()->getAnalysisContext()); PostStmt Loc(LocCtx->getCallSite(), LocCtx->getParent()); bool isNew; diff --git a/lib/Checker/GRExprEngine.cpp b/lib/Checker/GRExprEngine.cpp index d25526e1ed..2ea689e56a 100644 --- a/lib/Checker/GRExprEngine.cpp +++ b/lib/Checker/GRExprEngine.cpp @@ -477,8 +477,9 @@ void GRExprEngine::ProcessStmt(CFGElement CE, GRStmtNodeBuilder& builder) { // Create the cleaned state. const ExplodedNode *BasePred = Builder->getBasePredecessor(); - SymbolReaper SymReaper(BasePred->getLiveVariables(), SymMgr, - BasePred->getLocationContext()->getCurrentStackFrame()); + + SymbolReaper SymReaper(BasePred->getLocationContext(), SymMgr); + CleanedState = AMgr.shouldPurgeDead() ? StateMgr.RemoveDeadBindings(EntryNode->getState(), CurrentStmt, SymReaper) : EntryNode->getState(); @@ -1309,7 +1310,6 @@ void GRExprEngine::ProcessCallEnter(GRCallEnterNodeBuilder &B) { const GRState *state = B.getState(); state = getStoreManager().EnterStackFrame(state, LocCtx); - state = state->setAnalysisContext(LocCtx->getAnalysisContext()); B.GenerateNode(state, LocCtx); } @@ -3320,7 +3320,7 @@ struct DOTGraphTraits : Out << "\\|StateID: " << (void*) N->getState() << "\\|"; const GRState *state = N->getState(); - state->printDOT(Out); + state->printDOT(Out, *N->getLocationContext()->getCFG()); Out << "\\l"; return Out.str(); diff --git a/lib/Checker/GRState.cpp b/lib/Checker/GRState.cpp index ce7d6e2a83..97ede1d480 100644 --- a/lib/Checker/GRState.cpp +++ b/lib/Checker/GRState.cpp @@ -23,12 +23,6 @@ using namespace clang; // FIXME: Move this elsewhere. ConstraintManager::~ConstraintManager() {} -const GRState *GRState::setAnalysisContext(AnalysisContext *ctx) const { - GRState NewState = *this; - NewState.Env.setAnalysisContext(ctx); - return StateMgr->getPersistentState(NewState); -} - GRStateManager::~GRStateManager() { for (std::vector::iterator I=Printers.begin(), E=Printers.end(); I!=E; ++I) @@ -105,7 +99,7 @@ const GRState *GRState::BindExpr(const Stmt* Ex, SVal V, bool Invalidate) const{ const GRState* GRStateManager::getInitialState(const LocationContext *InitLoc) { GRState State(this, - EnvMgr.getInitialEnvironment(InitLoc->getAnalysisContext()), + EnvMgr.getInitialEnvironment(), StoreMgr->getInitialStore(InitLoc), GDMFactory.GetEmptyMap()); @@ -137,14 +131,12 @@ const GRState* GRState::makeWithStore(Store store) const { // State pretty-printing. //===----------------------------------------------------------------------===// -void GRState::print(llvm::raw_ostream& Out, const char* nl, +void GRState::print(llvm::raw_ostream& Out, CFG &C, const char* nl, const char* sep) const { // Print the store. GRStateManager &Mgr = getStateManager(); Mgr.getStoreManager().print(getStore(), Out, nl, sep); - CFG &C = *getAnalysisContext().getCFG(); - // Print Subexpression bindings. bool isFirst = true; @@ -192,12 +184,12 @@ void GRState::print(llvm::raw_ostream& Out, const char* nl, } } -void GRState::printDOT(llvm::raw_ostream& Out) const { - print(Out, "\\l", "\\|"); +void GRState::printDOT(llvm::raw_ostream& Out, CFG &C) const { + print(Out, C, "\\l", "\\|"); } -void GRState::printStdErr() const { - print(llvm::errs()); +void GRState::printStdErr(CFG &C) const { + print(llvm::errs(), C); } //===----------------------------------------------------------------------===// diff --git a/lib/Checker/SymbolManager.cpp b/lib/Checker/SymbolManager.cpp index f2d630cdf6..65a46e31fe 100644 --- a/lib/Checker/SymbolManager.cpp +++ b/lib/Checker/SymbolManager.cpp @@ -215,13 +215,17 @@ bool SymbolReaper::isLive(SymbolRef sym) { return isa(sym); } +bool SymbolReaper::isLive(const Stmt* Loc, const Stmt* ExprVal) const { + return LCtx->getLiveVariables()->isLive(Loc, ExprVal); +} + bool SymbolReaper::isLive(const Stmt *Loc, const VarRegion *VR) const { const StackFrameContext *SFC = VR->getStackFrame(); - if (SFC == CurrentStackFrame) - return Liveness.isLive(Loc, VR->getDecl()); + if (SFC == LCtx->getCurrentStackFrame()) + return LCtx->getLiveVariables()->isLive(Loc, VR->getDecl()); else - return SFC->isParentOf(CurrentStackFrame); + return SFC->isParentOf(LCtx->getCurrentStackFrame()); } SymbolVisitor::~SymbolVisitor() {} -- 2.40.0