[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
This commit is contained in:
Balazs Benics 2022-05-02 11:48:52 +02:00
parent 5ce7050f70
commit 29dff0d4fb
2 changed files with 53 additions and 10 deletions

View File

@ -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<const CFG*> : 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<const CFG*> : public DefaultDOTGraphTraits {
}
return OutStr;
#else
return {};
#endif
}
};

View File

@ -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;
}