]> granicus.if.org Git - clang/commitdiff
Remove reference to AnalysisContext in Environment. We already have LocationContext
authorZhongxing Xu <xuzhongxing@gmail.com>
Fri, 5 Mar 2010 04:45:36 +0000 (04:45 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Fri, 5 Mar 2010 04:45:36 +0000 (04:45 +0000)
information in ExplodedNode.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97785 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Checker/PathSensitive/Environment.h
include/clang/Checker/PathSensitive/GRState.h
include/clang/Checker/PathSensitive/SymbolManager.h
lib/Checker/Environment.cpp
lib/Checker/GRCoreEngine.cpp
lib/Checker/GRExprEngine.cpp
lib/Checker/GRState.cpp
lib/Checker/SymbolManager.cpp

index e7c8319fb72bdfb30369f2dda1b60754a208cb2e..6051654f4855f677ccb19898b08a70c666144a1d 100644 (file)
@@ -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,
index 7e2720ba48dd7d35b060fefef420638022898464..1178143bccddbd83de49e192cdc4243088858c1c 100644 (file)
@@ -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 {
index d49f5e81c802d3ff0af2d52b66d9d1e32d5a50df..b6630c3d97d2b8242dd68b460c7137cc581811d3 100644 (file)
@@ -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;
   
index c2c9190fc9ff4384bd4347dfc62381c644f322d1..671cf89119f3c89b0101e4ef535a01cd32a49dfa 100644 (file)
@@ -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<const MemRegion*> &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();
index 63ac31d6064d4a8055df734c64741711bc64ad7f..a9347d01641c9195200684fb4353fcfdba952a49 100644 (file)
@@ -682,7 +682,6 @@ void GRCallExitNodeBuilder::GenerateNode(const GRState *state) {
   // Get the callee's location context.
   const StackFrameContext *LocCtx 
                          = cast<StackFrameContext>(Pred->getLocationContext());
-  state = state->setAnalysisContext(LocCtx->getParent()->getAnalysisContext());
 
   PostStmt Loc(LocCtx->getCallSite(), LocCtx->getParent());
   bool isNew;
index d25526e1ede24b4e2cb01fe214a44b7d9e5aa71e..2ea689e56a82cb657e381ef63a225097886dcd06 100644 (file)
@@ -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<ExplodedNode*> :
     Out << "\\|StateID: " << (void*) N->getState() << "\\|";
 
     const GRState *state = N->getState();
-    state->printDOT(Out);
+    state->printDOT(Out, *N->getLocationContext()->getCFG());
 
     Out << "\\l";
     return Out.str();
index ce7d6e2a83888ca23c7d781aec5b403493766641..97ede1d480f9d70b49e66f48fd27e2bda0fbcb7b 100644 (file)
@@ -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<GRState::Printer*>::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);
 }
 
 //===----------------------------------------------------------------------===//
index f2d630cdf64b192923c1b38c5d1a938d79ca825b..65a46e31fefa16c4c0764cf5e66a56ed5a0a373d 100644 (file)
@@ -215,13 +215,17 @@ bool SymbolReaper::isLive(SymbolRef sym) {
   return isa<SymbolRegionValue>(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() {}