diff --git a/clang/Driver/AnalysisConsumer.cpp b/clang/Driver/AnalysisConsumer.cpp index c557b80c7ee8..1dc2fac4f848 100644 --- a/clang/Driver/AnalysisConsumer.cpp +++ b/clang/Driver/AnalysisConsumer.cpp @@ -123,9 +123,9 @@ namespace { Decl* getCodeDecl() const { return D; } Stmt* getBody() const { return Body; } - virtual CFG& getCFG() { + virtual CFG* getCFG() { if (!cfg) cfg.reset(CFG::buildCFG(getBody())); - return *cfg.get(); + return cfg.get(); } virtual ParentMap& getParentMap() { @@ -157,14 +157,17 @@ namespace { return C.PD.get(); } - virtual LiveVariables& getLiveVariables() { + virtual LiveVariables* getLiveVariables() { if (!liveness) { - liveness.reset(new LiveVariables(getCFG())); - liveness->runOnCFG(getCFG()); - liveness->runOnAllBlocks(getCFG(), 0, true); + CFG* c = getCFG(); + if (!c) return 0; + + liveness.reset(new LiveVariables(*c)); + liveness->runOnCFG(*c); + liveness->runOnAllBlocks(*c, 0, true); } - return *liveness.get(); + return liveness.get(); } bool shouldVisualize() const { @@ -285,27 +288,32 @@ void AnalysisConsumer::HandleCode(Decl* D, Stmt* Body, Actions actions) { //===----------------------------------------------------------------------===// static void ActionDeadStores(AnalysisManager& mgr) { - BugReporter BR(mgr); - CheckDeadStores(mgr.getLiveVariables(), BR); + if (LiveVariables* L = mgr.getLiveVariables()) { + BugReporter BR(mgr); + CheckDeadStores(*L, BR); + } } static void ActionUninitVals(AnalysisManager& mgr) { - CheckUninitializedValues(mgr.getCFG(), mgr.getContext(), - mgr.getDiagnostic()); + if (CFG* c = mgr.getCFG()) + CheckUninitializedValues(*c, mgr.getContext(), mgr.getDiagnostic()); } static void ActionGRExprEngine(AnalysisManager& mgr, GRTransferFuncs* tf) { + llvm::OwningPtr TF(tf); + + // Construct the analysis engine. + LiveVariables* L = mgr.getLiveVariables(); + if (!L) return; // Display progress. if (!mgr.shouldVisualize()) mgr.DisplayFunction(); - // Construct the analysis engine. - GRExprEngine Eng(mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(), - mgr.getLiveVariables()); + GRExprEngine Eng(*mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(), *L); Eng.setTransferFunctions(tf); // Execute the worklist algorithm. @@ -355,18 +363,24 @@ static void ActionSimpleChecks(AnalysisManager& mgr) { } static void ActionLiveness(AnalysisManager& mgr) { - mgr.DisplayFunction(); - mgr.getLiveVariables().dumpBlockLiveness(mgr.getSourceManager()); + if (LiveVariables* L = mgr.getLiveVariables()) { + mgr.DisplayFunction(); + L->dumpBlockLiveness(mgr.getSourceManager()); + } } static void ActionCFGDump(AnalysisManager& mgr) { - mgr.DisplayFunction(); - mgr.getCFG().dump(); + if (CFG* c = mgr.getCFG()) { + mgr.DisplayFunction(); + c->dump(); + } } static void ActionCFGView(AnalysisManager& mgr) { - mgr.DisplayFunction(); - mgr.getCFG().viewCFG(); + if (CFG* c = mgr.getCFG()) { + mgr.DisplayFunction(); + c->viewCFG(); + } } static void ActionCheckObjCDealloc(AnalysisManager& mgr) { diff --git a/clang/include/clang/Analysis/PathSensitive/BugReporter.h b/clang/include/clang/Analysis/PathSensitive/BugReporter.h index f608da0c2e5c..d1c430fc961d 100644 --- a/clang/include/clang/Analysis/PathSensitive/BugReporter.h +++ b/clang/include/clang/Analysis/PathSensitive/BugReporter.h @@ -136,9 +136,9 @@ public: virtual PathDiagnosticClient* getPathDiagnosticClient() = 0; virtual ASTContext& getContext() = 0; virtual SourceManager& getSourceManager() = 0; - virtual CFG& getCFG() = 0; + virtual CFG* getCFG() = 0; virtual ParentMap& getParentMap() = 0; - virtual LiveVariables& getLiveVariables() = 0; + virtual LiveVariables* getLiveVariables() = 0; }; class BugReporter { @@ -173,7 +173,7 @@ public: return D.getSourceManager(); } - CFG& getCFG() { + CFG* getCFG() { return D.getCFG(); } @@ -181,7 +181,7 @@ public: return D.getParentMap(); } - LiveVariables& getLiveVariables() { + LiveVariables* getLiveVariables() { return D.getLiveVariables(); } diff --git a/clang/lib/Analysis/BugReporter.cpp b/clang/lib/Analysis/BugReporter.cpp index 1741e7dc9b55..fba31f81af3a 100644 --- a/clang/lib/Analysis/BugReporter.cpp +++ b/clang/lib/Analysis/BugReporter.cpp @@ -118,7 +118,7 @@ Stmt* BugReport::getStmt(BugReporter& BR) const { Stmt *S = NULL; if (BlockEntrance* BE = dyn_cast(&ProgP)) - if (BE->getBlock() == &BR.getCFG().getExit()) + if (BE->getBlock() == &BR.getCFG()->getExit()) S = GetLastStmt(EndNode); if (!S) S = GetStmt(ProgP); diff --git a/clang/lib/Analysis/DeadStores.cpp b/clang/lib/Analysis/DeadStores.cpp index 02198b290667..ded0ed0d89ff 100644 --- a/clang/lib/Analysis/DeadStores.cpp +++ b/clang/lib/Analysis/DeadStores.cpp @@ -153,7 +153,7 @@ void clang::CheckDeadStores(LiveVariables& L, BugReporter& BR) { DiagCollector C(BT); DeadStoreObs A(BR.getContext(), BR.getDiagnostic(), C, BR.getParentMap()); - L.runOnAllBlocks(BR.getCFG(), &A); + L.runOnAllBlocks(*BR.getCFG(), &A); // Emit the bug reports.