From: Ted Kremenek Date: Wed, 2 Jul 2008 20:13:38 +0000 (+0000) Subject: GRExprEngine now expects the LiveVariables information to be provided by its creator. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8b23361a6a50be6dbd1056add570eb90598474b0;p=clang GRExprEngine now expects the LiveVariables information to be provided by its creator. This allows an optimization in AnalysisConsumer where the same LiveVariables information is used between multiple analyses. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53046 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/AnalysisConsumer.cpp b/Driver/AnalysisConsumer.cpp index 1e33ae168a..65a3dae507 100644 --- a/Driver/AnalysisConsumer.cpp +++ b/Driver/AnalysisConsumer.cpp @@ -154,6 +154,7 @@ namespace { if (!liveness) { liveness.reset(new LiveVariables(*getCFG())); liveness->runOnCFG(*getCFG()); + liveness->runOnAllBlocks(*getCFG(), 0, true); } return liveness.get(); } @@ -284,7 +285,8 @@ static void ActionGRExprEngine(AnalysisManager& mgr, GRTransferFuncs* tf) { mgr.DisplayFunction(); // Construct the analysis engine. - GRExprEngine Eng(*mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext()); + GRExprEngine Eng(*mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(), + *mgr.getLiveVariables()); Eng.setTransferFunctions(tf); // Execute the worklist algorithm. diff --git a/include/clang/Analysis/PathSensitive/GRExprEngine.h b/include/clang/Analysis/PathSensitive/GRExprEngine.h index c9d1676c2d..34118f4872 100644 --- a/include/clang/Analysis/PathSensitive/GRExprEngine.h +++ b/include/clang/Analysis/PathSensitive/GRExprEngine.h @@ -57,7 +57,7 @@ protected: /// Liveness - live-variables information the ValueDecl* and block-level /// Expr* in the CFG. Used to prune out dead state. - LiveVariables Liveness; + LiveVariables& Liveness; /// DeadSymbols - A scratch set used to record the set of symbols that /// were just marked dead by a call to ValueStateManager::RemoveDeadBindings. @@ -180,7 +180,7 @@ protected: UndefArgsTy MsgExprUndefArgs; public: - GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx); + GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx, LiveVariables& L); ~GRExprEngine(); void ExecuteWorkList(unsigned Steps = 150000) { diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 9abfe6f79f..c9ab8097ba 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -39,11 +39,12 @@ static inline Selector GetNullarySelector(const char* name, ASTContext& Ctx) { } -GRExprEngine::GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx) +GRExprEngine::GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx, + LiveVariables& L) : CoreEngine(cfg, CD, Ctx, *this), G(CoreEngine.getGraph()), Parents(0), - Liveness(G.getCFG()), + Liveness(L), Builder(NULL), StateMgr(G.getContext(), G.getAllocator()), BasicVals(StateMgr.getBasicValueFactory()), @@ -51,12 +52,7 @@ GRExprEngine::GRExprEngine(CFG& cfg, Decl& CD, ASTContext& Ctx) SymMgr(StateMgr.getSymbolManager()), CurrentStmt(NULL), NSExceptionII(NULL), NSExceptionInstanceRaiseSelectors(NULL), - RaiseSel(GetNullarySelector("raise", G.getContext())) { - - // Compute liveness information. - Liveness.runOnCFG(G.getCFG()); - Liveness.runOnAllBlocks(G.getCFG(), NULL, true); -} + RaiseSel(GetNullarySelector("raise", G.getContext())) {} GRExprEngine::~GRExprEngine() { for (BugTypeSet::iterator I = BugTypes.begin(), E = BugTypes.end(); I!=E; ++I)