diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -6127,17 +6127,13 @@ // CFG Graphviz Visualization //===----------------------------------------------------------------------===// -#ifndef NDEBUG -static StmtPrinterHelper* GraphHelper; -#endif +static StmtPrinterHelper *GraphHelper; void CFG::viewCFG(const LangOptions &LO) const { -#ifndef NDEBUG StmtPrinterHelper H(this, LO); GraphHelper = &H; llvm::ViewGraph(this,"CFG"); GraphHelper = nullptr; -#endif } namespace llvm { @@ -6146,8 +6142,7 @@ struct DOTGraphTraits : public DefaultDOTGraphTraits { DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {} - static std::string getNodeLabel(const CFGBlock *Node, const CFG* Graph) { -#ifndef NDEBUG + static std::string getNodeLabel(const CFGBlock *Node, const CFG *Graph) { std::string OutSStr; llvm::raw_string_ostream Out(OutSStr); print_block(Out,Graph, *Node, *GraphHelper, false, false); @@ -6163,9 +6158,6 @@ } return OutStr; -#else - return {}; -#endif } }; diff --git a/clang/test/Analysis/debug-checkers.cpp b/clang/test/Analysis/debug-checkers.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Analysis/debug-checkers.cpp @@ -0,0 +1,51 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.DumpDominators %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=DOM-CHECK +// DOM-CHECK: Immediate dominance tree (Node#,IDom#) + +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.DumpPostDominators %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=POSTDOM-CHECK +// POSTDOM-CHECK: Immediate post dominance tree (Node#,IDom#) + +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.DumpControlDependencies %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=CTRLDEPS-CHECK +// CTRLDEPS-CHECK: Control dependencies (Node#,Dependency#) + +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.DumpLiveVars %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=LIVE-VARS-CHECK +// LIVE-VARS-CHECK: live variables at block exit + +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.DumpLiveExprs %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=LIVE-EXPRS-CHECK +// LIVE-EXPRS-CHECK: live expressions at block exit + +// Skip testing CFGViewer. + +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.DumpCFG %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=CFG-CHECK +// CFG-CHECK: ENTRY + +// Skip testing CallGraphViewer. + +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.DumpCallGraph %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=CALL-GRAPH-CHECK +// CALL-GRAPH-CHECK: --- Call graph Dump --- + +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ConfigDumper %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=CONFIG-CHECK +// CONFIG-CHECK: [config] + +// Skip testing ExplodedGraphViewer. + +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ReportStmts %s > %t 2>&1 +// RUN: FileCheck --input-file=%t %s -check-prefix=REPORT-STMTS-CHECK +// REPORT-STMTS-CHECK: warning: Statement + +void foo(int *p) { + *p = 3; +} + +int bar() { + int x; + foo(&x); + return x; +}