Index: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h =================================================================== --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h @@ -461,12 +461,15 @@ namespace llvm { - template<> struct GraphTraits { + template <> struct GraphTraits { + using GraphTy = clang::ento::ExplodedGraph *; using NodeRef = clang::ento::ExplodedNode *; using ChildIteratorType = clang::ento::ExplodedNode::succ_iterator; - using nodes_iterator = llvm::df_iterator; + using nodes_iterator = llvm::df_iterator; - static NodeRef getEntryNode(NodeRef N) { return N; } + static NodeRef getEntryNode(const GraphTy G) { + return *G->roots_begin(); + } static ChildIteratorType child_begin(NodeRef N) { if (N->succ_size() == 1 && (*N->succ_begin())->isTrivial()) { @@ -482,27 +485,14 @@ return N->succ_end(); } - static nodes_iterator nodes_begin(NodeRef N) { return df_begin(N); } - - static nodes_iterator nodes_end(NodeRef N) { return df_end(N); } - }; - - template<> struct GraphTraits { - using NodeRef = const clang::ento::ExplodedNode *; - using ChildIteratorType = clang::ento::ExplodedNode::const_succ_iterator; - using nodes_iterator = llvm::df_iterator; - - static NodeRef getEntryNode(NodeRef N) { return N; } - - static ChildIteratorType child_begin(NodeRef N) { return N->succ_begin(); } - - static ChildIteratorType child_end(NodeRef N) { return N->succ_end(); } - - static nodes_iterator nodes_begin(NodeRef N) { return df_begin(N); } + static nodes_iterator nodes_begin(const GraphTy G) { + return df_begin(G); + } - static nodes_iterator nodes_end(NodeRef N) { return df_end(N); } + static nodes_iterator nodes_end(const GraphTy G) { + return df_end(G); + } }; - } // namespace llvm #endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_EXPLODEDGRAPH_H Index: cfe/trunk/lib/StaticAnalyzer/Core/Environment.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/Environment.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/Environment.cpp @@ -226,7 +226,7 @@ PrintingPolicy PP = Context.getPrintingPolicy(); - Out << NL << NL << "Expressions by stack frame:" << NL; + Out << NL << "Expressions by stack frame:" << NL; WithLC->dumpStack(Out, "", NL, Sep, [&](const LocationContext *LC) { for (auto I : ExprBindings) { if (I.first.getLocationContext() != LC) Index: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -2947,35 +2947,37 @@ //===----------------------------------------------------------------------===// #ifndef NDEBUG -static ExprEngine* GraphPrintCheckerState; -static SourceManager* GraphPrintSourceManager; - namespace llvm { template<> -struct DOTGraphTraits : public DefaultDOTGraphTraits { +struct DOTGraphTraits : public DefaultDOTGraphTraits { DOTGraphTraits (bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {} // FIXME: Since we do not cache error nodes in ExprEngine now, this does not // work. - static std::string getNodeAttributes(const ExplodedNode *N, void*) { + static std::string getNodeAttributes(const ExplodedNode *N, + ExplodedGraph *G) { return {}; } // De-duplicate some source location pretty-printing. - static void printLocation(raw_ostream &Out, SourceLocation SLoc) { + static void printLocation(raw_ostream &Out, + SourceLocation SLoc, + const SourceManager &SM, + StringRef Postfix="\\l") { if (SLoc.isFileID()) { Out << "\\lline=" - << GraphPrintSourceManager->getExpansionLineNumber(SLoc) + << SM.getExpansionLineNumber(SLoc) << " col=" - << GraphPrintSourceManager->getExpansionColumnNumber(SLoc) - << "\\l"; + << SM.getExpansionColumnNumber(SLoc) + << Postfix; } } static void dumpProgramPoint(ProgramPoint Loc, const ASTContext &Context, llvm::raw_string_ostream &Out) { + const SourceManager &SM = Context.getSourceManager(); switch (Loc.getKind()) { case ProgramPoint::BlockEntranceKind: Out << "Block Entrance: B" @@ -3020,7 +3022,7 @@ ImplicitCallPoint PC = Loc.castAs(); Out << "PreCall: "; PC.getDecl()->print(Out, Context.getLangOpts()); - printLocation(Out, PC.getLocation()); + printLocation(Out, PC.getLocation(), SM); break; } @@ -3028,7 +3030,7 @@ ImplicitCallPoint PC = Loc.castAs(); Out << "PostCall: "; PC.getDecl()->print(Out, Context.getLangOpts()); - printLocation(Out, PC.getLocation()); + printLocation(Out, PC.getLocation(), SM); break; } @@ -3056,13 +3058,7 @@ Out << "\\|Terminator: "; E.getSrc()->printTerminator(Out, Context.getLangOpts()); - - if (SLoc.isFileID()) { - Out << "\\lline=" - << GraphPrintSourceManager->getExpansionLineNumber(SLoc) - << " col=" - << GraphPrintSourceManager->getExpansionColumnNumber(SLoc); - } + printLocation(Out, SLoc, SM, /*Postfix=*/""); if (isa(T)) { const Stmt *Label = E.getDst()->getLabel(); @@ -3112,7 +3108,7 @@ << S->getID(Context) << " <" << (const void *)S << "> "; S->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(), /*Indentation=*/2, /*NewlineSymbol=*/"\\l"); - printLocation(Out, S->getBeginLoc()); + printLocation(Out, S->getBeginLoc(), SM, /*Postfix=*/""); if (Loc.getAs()) Out << "\\lPreStmt\\l"; @@ -3134,7 +3130,7 @@ return N->isTrivial(); } - static std::string getNodeLabel(const ExplodedNode *N, void*){ + static std::string getNodeLabel(const ExplodedNode *N, ExplodedGraph *G){ std::string sbuf; llvm::raw_string_ostream Out(sbuf); @@ -3167,11 +3163,7 @@ Out << "\\l\\|"; - ExplodedGraph &Graph = - static_cast(State->getStateManager().getOwningEngine()) - ->getGraph(); - - Out << "StateID: ST" << State->getID() << ", NodeID: N" << N->getID(&Graph) + Out << "StateID: ST" << State->getID() << ", NodeID: N" << N->getID(G) << " <" << (const void *)N << ">\\|"; bool SameAsAllPredecessors = @@ -3205,32 +3197,20 @@ } ViewGraph(Src); - } - else { - GraphPrintCheckerState = this; - GraphPrintSourceManager = &getContext().getSourceManager(); - - llvm::ViewGraph(*G.roots_begin(), "ExprEngine"); - - GraphPrintCheckerState = nullptr; - GraphPrintSourceManager = nullptr; + } else { + llvm::ViewGraph(&G, "ExprEngine"); } #endif } void ExprEngine::ViewGraph(ArrayRef Nodes) { #ifndef NDEBUG - GraphPrintCheckerState = this; - GraphPrintSourceManager = &getContext().getSourceManager(); - std::unique_ptr TrimmedG(G.trim(Nodes)); - if (!TrimmedG.get()) + if (!TrimmedG.get()) { llvm::errs() << "warning: Trimmed ExplodedGraph is empty.\n"; - else - llvm::ViewGraph(*TrimmedG->roots_begin(), "TrimmedExprEngine"); - - GraphPrintCheckerState = nullptr; - GraphPrintSourceManager = nullptr; + } else { + llvm::ViewGraph(TrimmedG.get(), "TrimmedExprEngine"); + } #endif }