From 29dff0d4fb46fe8f1e9774fd5e64d3e07937ff35 Mon Sep 17 00:00:00 2001 From: Balazs Benics Date: Mon, 2 May 2022 11:48:52 +0200 Subject: [PATCH] [analyzer] Allow CFG dumps in release builds This is a similar commit to D124442, but for CFG dumps. The binary size diff remained the same demonstrated in that patch. This time I'm adding tests for demonstrating that all the dump debug checkers work - even in regular builds without asserts. Reviewed By: martong Differential Revision: https://reviews.llvm.org/D124443 --- clang/lib/Analysis/CFG.cpp | 12 ++------ clang/test/Analysis/debug-checkers.cpp | 51 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 clang/test/Analysis/debug-checkers.cpp diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index c80e4bc..53d43bf 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -6127,17 +6127,13 @@ Stmt *CFGBlock::getTerminatorCondition(bool StripParens) { // 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 @@ template<> 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 @@ struct DOTGraphTraits : public DefaultDOTGraphTraits { } 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 index 0000000..234edd7 --- /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; +} -- 2.7.4