|
25 | 25 | #include "llvm/ADT/DenseMap.h"
|
26 | 26 | #include "llvm/Support/CommandLine.h"
|
27 | 27 | #include "llvm/Support/Debug.h"
|
| 28 | +#include "llvm/Support/ManagedStatic.h" |
28 | 29 | #include "llvm/Support/TimeValue.h"
|
29 | 30 | #include "llvm/Support/GraphWriter.h"
|
30 | 31 |
|
@@ -94,6 +95,40 @@ llvm::cl::opt<bool> SILVerifyWithoutInvalidation(
|
94 | 95 | "sil-verify-without-invalidation", llvm::cl::init(false),
|
95 | 96 | llvm::cl::desc("Verify after passes even if the pass has not invalidated"));
|
96 | 97 |
|
| 98 | + |
| 99 | +static llvm::ManagedStatic<std::vector<unsigned>> DebugPassNumbers; |
| 100 | + |
| 101 | +namespace { |
| 102 | + |
| 103 | +struct DebugOnlyPassNumberOpt { |
| 104 | + void operator=(const std::string &Val) const { |
| 105 | + if (Val.empty()) |
| 106 | + return; |
| 107 | + SmallVector<StringRef, 8> dbgPassNumbers; |
| 108 | + StringRef(Val).split(dbgPassNumbers, ',', -1, false); |
| 109 | + for (auto dbgPassNumber : dbgPassNumbers) { |
| 110 | + int PassNumber; |
| 111 | + if (dbgPassNumber.getAsInteger(10, PassNumber) || PassNumber < 0) |
| 112 | + llvm_unreachable("The pass number should be an integer number >= 0"); |
| 113 | + DebugPassNumbers->push_back(static_cast<unsigned>(PassNumber)); |
| 114 | + } |
| 115 | + } |
| 116 | +}; |
| 117 | + |
| 118 | +} |
| 119 | + |
| 120 | +static DebugOnlyPassNumberOpt DebugOnlyPassNumberOptLoc; |
| 121 | + |
| 122 | +static llvm::cl::opt<DebugOnlyPassNumberOpt, true, |
| 123 | + llvm::cl::parser<std::string>> |
| 124 | + DebugOnly("debug-only-pass-number", |
| 125 | + llvm::cl::desc("Enable a specific type of debug output (comma " |
| 126 | + "separated list pass numbers)"), |
| 127 | + llvm::cl::Hidden, llvm::cl::ZeroOrMore, |
| 128 | + llvm::cl::value_desc("pass number"), |
| 129 | + llvm::cl::location(DebugOnlyPassNumberOptLoc), |
| 130 | + llvm::cl::ValueRequired); |
| 131 | + |
97 | 132 | static bool doPrintBefore(SILTransform *T, SILFunction *F) {
|
98 | 133 | if (!SILPrintOnlyFun.empty() && F && F->getName() != SILPrintOnlyFun)
|
99 | 134 | return false;
|
@@ -163,6 +198,31 @@ static void printModule(SILModule *Mod, bool EmitVerboseSIL) {
|
163 | 198 | }
|
164 | 199 | }
|
165 | 200 |
|
| 201 | +class DebugPrintEnabler { |
| 202 | + bool OldDebugFlag; |
| 203 | +public: |
| 204 | + DebugPrintEnabler(unsigned PassNumber) { |
| 205 | + OldDebugFlag = llvm::DebugFlag; |
| 206 | + if (llvm::DebugFlag) |
| 207 | + return; |
| 208 | + if (DebugPassNumbers->empty()) |
| 209 | + return; |
| 210 | + // Enable debug printing if the pass number matches |
| 211 | + // one of the pass numbers provided as a command line option. |
| 212 | + for (auto DebugPassNumber : *DebugPassNumbers) { |
| 213 | + if (DebugPassNumber == PassNumber) { |
| 214 | + llvm::DebugFlag = true; |
| 215 | + return; |
| 216 | + } |
| 217 | + } |
| 218 | + } |
| 219 | + |
| 220 | + ~DebugPrintEnabler() { |
| 221 | + llvm::DebugFlag = OldDebugFlag; |
| 222 | + } |
| 223 | +}; |
| 224 | + |
| 225 | + |
166 | 226 | SILPassManager::SILPassManager(SILModule *M, llvm::StringRef Stage) :
|
167 | 227 | Mod(M), StageName(Stage) {
|
168 | 228 |
|
@@ -217,6 +277,8 @@ void SILPassManager::runPassesOnFunction(PassList FuncTransforms,
|
217 | 277 |
|
218 | 278 | for (auto SFT : FuncTransforms) {
|
219 | 279 | PrettyStackTraceSILFunctionTransform X(SFT, NumPassesRun);
|
| 280 | + DebugPrintEnabler DebugPrint(NumPassesRun); |
| 281 | + |
220 | 282 | SFT->injectPassManager(this);
|
221 | 283 | SFT->injectFunction(F);
|
222 | 284 |
|
@@ -410,6 +472,7 @@ void SILPassManager::runModulePass(SILModuleTransform *SMT) {
|
410 | 472 | const SILOptions &Options = getOptions();
|
411 | 473 |
|
412 | 474 | PrettyStackTraceSILModuleTransform X(SMT, NumPassesRun);
|
| 475 | + DebugPrintEnabler DebugPrint(NumPassesRun); |
413 | 476 |
|
414 | 477 | SMT->injectPassManager(this);
|
415 | 478 | SMT->injectModule(Mod);
|
|
0 commit comments