From 30b015dbe9cca62e58333bdf84d947af6aca509f Mon Sep 17 00:00:00 2001 From: Djordje Todorovic Date: Tue, 21 Jul 2020 12:12:19 +0200 Subject: [PATCH] [NFC][Debugify] Rename OptCustomPassManager into DebugifyCustomPassManager In addition, move the definition of the class into the Debugify.h, so we can use it from different levels. The motivation for this is D82547. Differential Revision: https://reviews.llvm.org/D83391 --- llvm/include/llvm/Transforms/Utils/Debugify.h | 56 ++++++++++++++++++++++++++- llvm/tools/opt/opt.cpp | 52 +++---------------------- 2 files changed, 61 insertions(+), 47 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/Debugify.h b/llvm/include/llvm/Transforms/Utils/Debugify.h index 6f11d0a..1b9d43b 100644 --- a/llvm/include/llvm/Transforms/Utils/Debugify.h +++ b/llvm/include/llvm/Transforms/Utils/Debugify.h @@ -13,8 +13,11 @@ #ifndef LLVM_TRANSFORM_UTILS_DEBUGIFY_H #define LLVM_TRANSFORM_UTILS_DEBUGIFY_H -#include "llvm/ADT/StringRef.h" #include "llvm/ADT/MapVector.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/Bitcode/BitcodeWriterPass.h" +#include "llvm/IR/IRPrintingPasses.h" +#include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/PassManager.h" namespace llvm { @@ -89,4 +92,55 @@ struct NewPMCheckDebugifyPass llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); }; +namespace llvm { +/// DebugifyCustomPassManager wraps each pass with the debugify passes if +/// needed. +/// NOTE: We support legacy custom pass manager only. +/// TODO: Add New PM support for custom pass manager. +class DebugifyCustomPassManager : public legacy::PassManager { + DebugifyStatsMap DIStatsMap; + bool EnableDebugifyEach = false; + +public: + using super = legacy::PassManager; + + void add(Pass *P) override { + // Wrap each pass with (-check)-debugify passes if requested, making + // exceptions for passes which shouldn't see -debugify instrumentation. + bool WrapWithDebugify = EnableDebugifyEach && !P->getAsImmutablePass() && + !isIRPrintingPass(P) && !isBitcodeWriterPass(P); + if (!WrapWithDebugify) { + super::add(P); + return; + } + + // Apply -debugify/-check-debugify before/after each pass and collect + // debug info loss statistics. + PassKind Kind = P->getPassKind(); + StringRef Name = P->getPassName(); + + // TODO: Implement Debugify for LoopPass. + switch (Kind) { + case PT_Function: + super::add(createDebugifyFunctionPass()); + super::add(P); + super::add(createCheckDebugifyFunctionPass(true, Name, &DIStatsMap)); + break; + case PT_Module: + super::add(createDebugifyModulePass()); + super::add(P); + super::add(createCheckDebugifyModulePass(true, Name, &DIStatsMap)); + break; + default: + super::add(P); + break; + } + } + + void enableDebugifyEach() { EnableDebugifyEach = true; } + + const DebugifyStatsMap &getDebugifyStatsMap() const { return DIStatsMap; } +}; +} // namespace llvm + #endif // LLVM_TRANSFORM_UTILS_DEBUGIFY_H diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp index c250eef..ed3e506 100644 --- a/llvm/tools/opt/opt.cpp +++ b/llvm/tools/opt/opt.cpp @@ -22,13 +22,11 @@ #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/AsmParser/Parser.h" -#include "llvm/Bitcode/BitcodeWriterPass.h" #include "llvm/CodeGen/CommandFlags.h" #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/Config/llvm-config.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DebugInfo.h" -#include "llvm/IR/IRPrintingPasses.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/LLVMRemarkStreamer.h" #include "llvm/IR/LegacyPassManager.h" @@ -325,48 +323,6 @@ cl::opt CSProfileGenFile( cl::desc("Path to the instrumented context sensitive profile."), cl::Hidden); -class OptCustomPassManager : public legacy::PassManager { - DebugifyStatsMap DIStatsMap; - -public: - using super = legacy::PassManager; - - void add(Pass *P) override { - // Wrap each pass with (-check)-debugify passes if requested, making - // exceptions for passes which shouldn't see -debugify instrumentation. - bool WrapWithDebugify = DebugifyEach && !P->getAsImmutablePass() && - !isIRPrintingPass(P) && !isBitcodeWriterPass(P); - if (!WrapWithDebugify) { - super::add(P); - return; - } - - // Apply -debugify/-check-debugify before/after each pass and collect - // debug info loss statistics. - PassKind Kind = P->getPassKind(); - StringRef Name = P->getPassName(); - - // TODO: Implement Debugify for LoopPass. - switch (Kind) { - case PT_Function: - super::add(createDebugifyFunctionPass()); - super::add(P); - super::add(createCheckDebugifyFunctionPass(true, Name, &DIStatsMap)); - break; - case PT_Module: - super::add(createDebugifyModulePass()); - super::add(P); - super::add(createCheckDebugifyModulePass(true, Name, &DIStatsMap)); - break; - default: - super::add(P); - break; - } - } - - const DebugifyStatsMap &getDebugifyStatsMap() const { return DIStatsMap; } -}; - static inline void addPass(legacy::PassManagerBase &PM, Pass *P) { // Add the pass to the pass manager... PM.add(P); @@ -776,8 +732,12 @@ int main(int argc, char **argv) { } // Create a PassManager to hold and optimize the collection of passes we are - // about to build. - OptCustomPassManager Passes; + // about to build. If the -debugify-each option is set, wrap each pass with + // the (-check)-debugify passes. + DebugifyCustomPassManager Passes; + if (DebugifyEach) + Passes.enableDebugifyEach(); + bool AddOneTimeDebugifyPasses = EnableDebugify && !DebugifyEach; // Add an appropriate TargetLibraryInfo pass for the module's triple. -- 2.7.4