From fe18056462cc339c84ae9feb17df0528d7cea833 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Tue, 23 Jan 2018 20:43:50 +0000 Subject: [PATCH] [Debugify] Add a mode to opt to enable faster testing Opt's "-enable-debugify" mode adds an instance of Debugify at the beginning of the pass pipeline, and an instance of CheckDebugify at the end. You can enable this mode with lit using: -Dopt="opt -enable-debugify". Note that running test suites in this mode will result in many failures due to strict FileCheck commands, etc. It can be more useful to look for assertion failures which arise only when Debugify is enabled, e.g to prove that we have (or do not have) test coverage for some code path with debug info present. Differential Revision: https://reviews.llvm.org/D41793 llvm-svn: 323256 --- test/DebugInfo/debugify.ll | 3 +++ tools/opt/Debugify.cpp | 4 ++++ tools/opt/opt.cpp | 14 ++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/test/DebugInfo/debugify.ll b/test/DebugInfo/debugify.ll index fce0664c0dc..87358cffccd 100644 --- a/test/DebugInfo/debugify.ll +++ b/test/DebugInfo/debugify.ll @@ -9,6 +9,9 @@ ; RUN: opt -debugify -strip -check-debugify -S -o - < %s | \ ; RUN: FileCheck %s -check-prefix=CHECK-FAIL +; RUN: opt -enable-debugify -strip -S -o - < %s | \ +; RUN: FileCheck %s -check-prefix=CHECK-FAIL + ; CHECK-LABEL: define void @foo define void @foo() { ; CHECK: ret void, !dbg ![[RET1:.*]] diff --git a/tools/opt/Debugify.cpp b/tools/opt/Debugify.cpp index 89e572474bd..ec546e56d44 100644 --- a/tools/opt/Debugify.cpp +++ b/tools/opt/Debugify.cpp @@ -204,6 +204,10 @@ struct CheckDebugifyPass : public ModulePass { } // end anonymous namespace +ModulePass *createDebugifyPass() { return new DebugifyPass(); } + +ModulePass *createCheckDebugifyPass() { return new CheckDebugifyPass(); } + char DebugifyPass::ID = 0; static RegisterPass X("debugify", "Attach debug info to everything"); diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index c471e0f2e3e..c1c84844a4a 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -203,6 +203,11 @@ QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet)); static cl::opt AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization")); +static cl::opt EnableDebugify( + "enable-debugify", + cl::desc( + "Start the pipeline with debugify and end it with check-debugify")); + static cl::opt PrintBreakpoints("print-breakpoints-for-testing", cl::desc("Print select breakpoints location for testing")); @@ -252,6 +257,9 @@ static cl::opt cl::desc("YAML output filename for pass remarks"), cl::value_desc("filename")); +extern ModulePass *createDebugifyPass(); +extern ModulePass *createCheckDebugifyPass(); + static inline void addPass(legacy::PassManagerBase &PM, Pass *P) { // Add the pass to the pass manager... PM.add(P); @@ -570,6 +578,9 @@ int main(int argc, char **argv) { Passes.add(createTargetTransformInfoWrapperPass(TM ? TM->getTargetIRAnalysis() : TargetIRAnalysis())); + if (EnableDebugify) + Passes.add(createDebugifyPass()); + std::unique_ptr FPasses; if (OptLevelO0 || OptLevelO1 || OptLevelO2 || OptLevelOs || OptLevelOz || OptLevelO3) { @@ -715,6 +726,9 @@ int main(int argc, char **argv) { if (!NoVerify && !VerifyEach) Passes.add(createVerifierPass()); + if (EnableDebugify) + Passes.add(createCheckDebugifyPass()); + // In run twice mode, we want to make sure the output is bit-by-bit // equivalent if we run the pass manager again, so setup two buffers and // a stream to write to them. Note that llc does something similar and it