diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-08-25 03:33:41 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-08-25 03:33:41 +0000 |
commit | cc0255383f96a557c36923f602819bdb0cdd2761 (patch) | |
tree | 1e81f7083c79b8158d1476ae7c9f7f28c3ce7738 | |
parent | 9351c173cd538f7f7c28af1494ac7e68b815b0e8 (diff) |
Remove Decl and CFG from ExplodedGraph. This leads to a series small changes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79973 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Analysis/PathSensitive/ExplodedGraph.h | 22 | ||||
-rw-r--r-- | include/clang/Analysis/PathSensitive/GRCoreEngine.h | 12 | ||||
-rw-r--r-- | include/clang/Analysis/PathSensitive/GRExprEngine.h | 3 | ||||
-rw-r--r-- | lib/Analysis/BugReporter.cpp | 3 | ||||
-rw-r--r-- | lib/Analysis/CFRefCount.cpp | 2 | ||||
-rw-r--r-- | lib/Analysis/GRCoreEngine.cpp | 6 | ||||
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 10 |
7 files changed, 17 insertions, 41 deletions
diff --git a/include/clang/Analysis/PathSensitive/ExplodedGraph.h b/include/clang/Analysis/PathSensitive/ExplodedGraph.h index 79df895d6c..55f64339ad 100644 --- a/include/clang/Analysis/PathSensitive/ExplodedGraph.h +++ b/include/clang/Analysis/PathSensitive/ExplodedGraph.h @@ -223,14 +223,6 @@ protected: /// Allocator - BumpPtrAllocator to create nodes. llvm::BumpPtrAllocator Allocator; - /// cfg - The CFG associated with this analysis graph. - CFG& cfg; - - // FIXME: Remove. - /// CodeDecl - The declaration containing the code being analyzed. This - /// can be a FunctionDecl or and ObjCMethodDecl. - const Decl& CodeDecl; - /// Ctx - The ASTContext used to "interpret" CodeDecl. ASTContext& Ctx; @@ -247,7 +239,7 @@ public: bool* IsNew = 0); ExplodedGraph* MakeEmptyGraph() const { - return new ExplodedGraph(cfg, CodeDecl, Ctx); + return new ExplodedGraph(Ctx); } /// addRoot - Add an untyped node to the set of roots. @@ -262,8 +254,7 @@ public: return V; } - ExplodedGraph(CFG& c, const Decl &cd, ASTContext& ctx) - : cfg(c), CodeDecl(cd), Ctx(ctx), NumNodes(0) {} + ExplodedGraph(ASTContext& ctx) : Ctx(ctx), NumNodes(0) {} virtual ~ExplodedGraph() {} @@ -308,16 +299,9 @@ public: const_eop_iterator eop_end() const { return EndNodes.end(); } llvm::BumpPtrAllocator& getAllocator() { return Allocator; } - CFG& getCFG() { return cfg; } - ASTContext& getContext() { return Ctx; } - // FIXME: Remove. - const Decl& getCodeDecl() const { return CodeDecl; } + ASTContext& getContext() { return Ctx; } - const FunctionDecl* getFunctionDecl() const { - return llvm::dyn_cast<FunctionDecl>(&CodeDecl); - } - typedef llvm::DenseMap<const ExplodedNode*, ExplodedNode*> NodeMap; std::pair<ExplodedGraph*, InterExplodedGraphMap*> diff --git a/include/clang/Analysis/PathSensitive/GRCoreEngine.h b/include/clang/Analysis/PathSensitive/GRCoreEngine.h index ee7a095748..36b52f135f 100644 --- a/include/clang/Analysis/PathSensitive/GRCoreEngine.h +++ b/include/clang/Analysis/PathSensitive/GRCoreEngine.h @@ -98,18 +98,16 @@ private: public: /// Construct a GRCoreEngine object to analyze the provided CFG using /// a DFS exploration of the exploded graph. - GRCoreEngine(CFG& cfg, const Decl &cd, ASTContext& ctx, - GRSubEngine& subengine) - : SubEngine(subengine), G(new ExplodedGraph(cfg, cd, ctx)), + GRCoreEngine(ASTContext& ctx, GRSubEngine& subengine) + : SubEngine(subengine), G(new ExplodedGraph(ctx)), WList(GRWorkList::MakeBFS()), BCounterFactory(G->getAllocator()) {} /// Construct a GRCoreEngine object to analyze the provided CFG and to /// use the provided worklist object to execute the worklist algorithm. /// The GRCoreEngine object assumes ownership of 'wlist'. - GRCoreEngine(CFG& cfg, const Decl &cd, ASTContext& ctx, GRWorkList* wlist, - GRSubEngine& subengine) - : SubEngine(subengine), G(new ExplodedGraph(cfg, cd, ctx)), WList(wlist), + GRCoreEngine(ASTContext& ctx, GRWorkList* wlist, GRSubEngine& subengine) + : SubEngine(subengine), G(new ExplodedGraph(ctx)), WList(wlist), BCounterFactory(G->getAllocator()) {} ~GRCoreEngine() { @@ -126,8 +124,6 @@ public: /// ExecuteWorkList - Run the worklist algorithm for a maximum number of /// steps. Returns true if there is still simulation state on the worklist. bool ExecuteWorkList(const LocationContext *L, unsigned Steps); - - CFG& getCFG() { return G->getCFG(); } }; class GRStmtNodeBuilder { diff --git a/include/clang/Analysis/PathSensitive/GRExprEngine.h b/include/clang/Analysis/PathSensitive/GRExprEngine.h index 6ca8cf4b7f..b330e01590 100644 --- a/include/clang/Analysis/PathSensitive/GRExprEngine.h +++ b/include/clang/Analysis/PathSensitive/GRExprEngine.h @@ -217,9 +217,6 @@ public: /// getContext - Return the ASTContext associated with this analysis. ASTContext& getContext() const { return G.getContext(); } - /// getCFG - Returns the CFG associated with this analysis. - CFG& getCFG() { return G.getCFG(); } - SValuator &getSValuator() { return SVator; } GRTransferFuncs& getTF() { return *StateMgr.TF; } diff --git a/lib/Analysis/BugReporter.cpp b/lib/Analysis/BugReporter.cpp index 1a77ecb55f..bda31fa4b7 100644 --- a/lib/Analysis/BugReporter.cpp +++ b/lib/Analysis/BugReporter.cpp @@ -1373,8 +1373,7 @@ MakeReportGraph(const ExplodedGraph* G, // Create a new (third!) graph with a single path. This is the graph // that will be returned to the caller. - ExplodedGraph *GNew = new ExplodedGraph(GTrim->getCFG(), GTrim->getCodeDecl(), - GTrim->getContext()); + ExplodedGraph *GNew = new ExplodedGraph(GTrim->getContext()); // Sometimes the trimmed graph can contain a cycle. Perform a reverse BFS // to the root node, and then construct a new graph that contains only diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index d1f293e40c..6d678f1c4f 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -3025,7 +3025,7 @@ void CFRefCount::EvalObjCMessageExpr(ExplodedNodeSet& Dst, // Special-case: are we sending a mesage to "self"? // This is a hack. When we have full-IP this should be removed. - if (isa<ObjCMethodDecl>(&Eng.getGraph().getCodeDecl())) { + if (isa<ObjCMethodDecl>(Pred->getLocationContext()->getDecl())) { if (Expr* Receiver = ME->getReceiver()) { SVal X = St->getSValAsScalarOrLoc(Receiver); if (loc::MemRegionVal* L = dyn_cast<loc::MemRegionVal>(&X)) { diff --git a/lib/Analysis/GRCoreEngine.cpp b/lib/Analysis/GRCoreEngine.cpp index 3ff27fc498..7983dd841b 100644 --- a/lib/Analysis/GRCoreEngine.cpp +++ b/lib/Analysis/GRCoreEngine.cpp @@ -151,7 +151,7 @@ bool GRCoreEngine::ExecuteWorkList(const LocationContext *L, unsigned Steps) { if (G->num_roots() == 0) { // Initialize the analysis by constructing // the root if none exists. - CFGBlock* Entry = &getCFG().getEntry(); + CFGBlock* Entry = &(L->getCFG()->getEntry()); assert (Entry->empty() && "Entry block must be empty."); @@ -214,9 +214,9 @@ void GRCoreEngine::HandleBlockEdge(const BlockEdge& L, ExplodedNode* Pred) { CFGBlock* Blk = L.getDst(); // Check if we are entering the EXIT block. - if (Blk == &getCFG().getExit()) { + if (Blk == &(Pred->getLocationContext()->getCFG()->getExit())) { - assert (getCFG().getExit().size() == 0 + assert (Pred->getLocationContext()->getCFG()->getExit().size() == 0 && "EXIT block cannot contain Stmts."); // Process the final state transition. diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index ace75cb943..17baca7b65 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -153,7 +153,7 @@ GRExprEngine::GRExprEngine(CFG &cfg, const Decl &CD, ASTContext &Ctx, StoreManagerCreator SMC, ConstraintManagerCreator CMC) : AMgr(mgr), - CoreEngine(cfg, CD, Ctx, *this), + CoreEngine(Ctx, *this), G(CoreEngine.getGraph()), Liveness(L), Builder(NULL), @@ -316,7 +316,7 @@ void GRExprEngine::Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) { // this check when we KNOW that there is no block-level subexpression. // The motivation is that this check requires a hashtable lookup. - if (S != CurrentStmt && getCFG().isBlkExpr(S)) { + if (S != CurrentStmt && Pred->getLocationContext()->getCFG()->isBlkExpr(S)) { Dst.Add(Pred); return; } @@ -494,7 +494,7 @@ void GRExprEngine::VisitLValue(Expr* Ex, ExplodedNode* Pred, Ex = Ex->IgnoreParens(); - if (Ex != CurrentStmt && getCFG().isBlkExpr(Ex)) { + if (Ex != CurrentStmt && Pred->getLocationContext()->getCFG()->isBlkExpr(Ex)) { Dst.Add(Pred); return; } @@ -807,7 +807,7 @@ void GRExprEngine::ProcessIndirectGoto(GRIndirectGotoNodeBuilder& builder) { void GRExprEngine::VisitGuardedExpr(Expr* Ex, Expr* L, Expr* R, ExplodedNode* Pred, ExplodedNodeSet& Dst) { - assert (Ex == CurrentStmt && getCFG().isBlkExpr(Ex)); + assert (Ex == CurrentStmt && Pred->getLocationContext()->getCFG()->isBlkExpr(Ex)); const GRState* state = GetState(Pred); SVal X = state->getBlkExprSVal(Ex); @@ -917,7 +917,7 @@ void GRExprEngine::VisitLogicalExpr(BinaryOperator* B, ExplodedNode* Pred, assert(B->getOpcode() == BinaryOperator::LAnd || B->getOpcode() == BinaryOperator::LOr); - assert(B == CurrentStmt && getCFG().isBlkExpr(B)); + assert(B == CurrentStmt && Pred->getLocationContext()->getCFG()->isBlkExpr(B)); const GRState* state = GetState(Pred); SVal X = state->getBlkExprSVal(B); |