Przeglądaj źródła

Added hidden option to print after all passes (#3051)

Adam Yang 5 lat temu
rodzic
commit
9db52a7f01

+ 2 - 0
include/dxc/Support/HLSLOptions.h

@@ -195,6 +195,8 @@ public:
   std::map<std::string, bool> DxcOptimizationToggles; // OPT_opt_enable & OPT_opt_disable
   std::map<std::string, std::string> DxcOptimizationSelects; // OPT_opt_select
 
+  bool PrintAfterAll; // OPT_print_after_all
+
   // Rewriter Options
   RewriterOpts RWOpt;
 

+ 2 - 0
include/dxc/Support/HLSLOptions.td

@@ -271,6 +271,8 @@ def encoding : Separate<["-", "/"], "encoding">, Group<hlslcomp_Group>, Flags<[C
   HelpText<"Set default encoding for text outputs (utf8|utf16) default=utf8">;
 def validator_version : Separate<["-", "/"], "validator-version">, Group<hlslcomp_Group>, Flags<[CoreOption, HelpHidden]>,
   HelpText<"Override validator version for module.  Format: <major.minor> ; Default: DXIL.dll version or current internal version.">;
+def print_after_all : Flag<["-", "/"], "print-after-all">, Group<hlslcomp_Group>, Flags<[CoreOption, HelpHidden]>,
+  HelpText<"Print LLVM IR after each pass.">;
 
 // Used with API only
 def skip_serialization : Flag<["-", "/"], "skip-serialization">, Group<hlslcore_Group>, Flags<[CoreOption, HelpHidden]>,

+ 2 - 0
include/llvm/IR/LegacyPassManager.h

@@ -35,6 +35,8 @@ class FunctionPassManagerImpl;
 /// it is.
 class PassManagerBase {
 public:
+  bool HLSLPrintAfterAll = false; // HLSL Change
+
   virtual ~PassManagerBase();
 
   /// Add a pass to the queue of passes to run.  This passes ownership of

+ 2 - 0
include/llvm/IR/LegacyPassManagers.h

@@ -179,6 +179,8 @@ private:
   virtual PassManagerType getTopLevelPassManagerType() = 0;
 
 public:
+  bool HLSLPrintAfterAll = false; // HLSL Change
+
   /// Schedule pass P for execution. Make sure that passes required by
   /// P are run before P is run. Update analysis info maintained by
   /// the manager. Remove dead passes. This is a recursive function.

+ 1 - 0
lib/DxcSupport/HLSLOptions.cpp

@@ -639,6 +639,7 @@ int ReadDxcOpts(const OptTable *optionTable, unsigned flagsToInclude,
   opts.LegacyMacroExpansion = Args.hasFlag(OPT_flegacy_macro_expansion, OPT_INVALID, false);
   opts.LegacyResourceReservation = Args.hasFlag(OPT_flegacy_resource_reservation, OPT_INVALID, false);
   opts.ExportShadersOnly = Args.hasFlag(OPT_export_shaders_only, OPT_INVALID, false);
+  opts.PrintAfterAll = Args.hasFlag(OPT_print_after_all, OPT_INVALID, false);
   opts.ResMayAlias = Args.hasFlag(OPT_res_may_alias, OPT_INVALID, false);
   opts.ResMayAlias = Args.hasFlag(OPT_res_may_alias_, OPT_INVALID, opts.ResMayAlias);
 

+ 10 - 0
lib/IR/LegacyPassManager.cpp

@@ -693,6 +693,14 @@ void PMTopLevelManager::schedulePass(Pass *P) {
       dbgs(), std::string("*** IR Dump After ") + P->getPassName() + " ***");
     PP->assignPassManager(activeStack, getTopLevelPassManagerType());
   }
+
+  // HLSL Change - begin
+  if (PI && !PI->isAnalysis() && this->HLSLPrintAfterAll) {
+    Pass *PP = P->createPrinterPass(
+      errs(), std::string("*** IR Dump After ") + P->getPassName() + " (" + PI->getPassArgument() + ") ***");
+    PP->assignPassManager(activeStack, getTopLevelPassManagerType());
+  }
+  // HLSL Change - end
 }
 
 /// Find the pass that implements Analysis AID. Search immutable
@@ -1401,6 +1409,7 @@ FunctionPassManager::~FunctionPassManager() {
 
 void FunctionPassManager::add(Pass *P) {
   // HLSL Change Starts
+  FPM->HLSLPrintAfterAll = this->HLSLPrintAfterAll;
   std::unique_ptr<Pass> PPtr(P); // take ownership of P, even on failure paths
   if (TrackPassOS) {
     P->dumpConfig(*TrackPassOS);
@@ -1749,6 +1758,7 @@ PassManager::~PassManager() {
 
 void PassManager::add(Pass *P) {
   // HLSL Change Starts
+  PM->HLSLPrintAfterAll = this->HLSLPrintAfterAll;
   std::unique_ptr<Pass> PPtr(P); // take ownership of P, even on failure paths
   if (TrackPassOS) {
     P->dumpConfig(*TrackPassOS);

+ 2 - 0
tools/clang/include/clang/Frontend/CodeGenOptions.h

@@ -226,6 +226,8 @@ public:
   // Optimization pass enables, disables and selects
   std::map<std::string, bool> HLSLOptimizationToggles;
   std::map<std::string, std::string> HLSLOptimizationSelects;
+  /// Debug option to print IR after every pass
+  bool HLSLPrintAfterAll = false;
   // HLSL Change Ends
 
   // SPIRV Change Starts

+ 2 - 0
tools/clang/lib/CodeGen/BackendUtil.cpp

@@ -91,6 +91,7 @@ private:
   legacy::PassManager *getPerModulePasses() const {
     if (!PerModulePasses) {
       PerModulePasses = new legacy::PassManager();
+      PerModulePasses->HLSLPrintAfterAll = this->CodeGenOpts.HLSLPrintAfterAll;
       PerModulePasses->TrackPassOS = &PerModulePassesConfigOS;
       PerModulePasses->add(
           createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));
@@ -101,6 +102,7 @@ private:
   legacy::FunctionPassManager *getPerFunctionPasses() const {
     if (!PerFunctionPasses) {
       PerFunctionPasses = new legacy::FunctionPassManager(TheModule);
+      PerFunctionPasses->HLSLPrintAfterAll = this->CodeGenOpts.HLSLPrintAfterAll;
       PerFunctionPasses->TrackPassOS = &PerFunctionPassesConfigOS;
       PerFunctionPasses->add(
           createTargetTransformInfoWrapperPass(getTargetIRAnalysis()));

+ 1 - 0
tools/clang/tools/dxcompiler/dxcompilerobj.cpp

@@ -1132,6 +1132,7 @@ public:
     compiler.getCodeGenOpts().HLSLDefines = defines;
     compiler.getCodeGenOpts().HLSLPreciseOutputs = Opts.PreciseOutputs;
     compiler.getCodeGenOpts().MainFileName = pMainFile;
+    compiler.getCodeGenOpts().HLSLPrintAfterAll = Opts.PrintAfterAll;
 
     // Translate signature packing options
     if (Opts.PackPrefixStable)