Skip to content

Commit 6e1a8de

Browse files
committed
Add a new -debug-only-pass-number option for debugging the compiler
The option is supposed to be used as follows and takes a comma-seprataed list of SIL pass numbers as input: -Xllvm -debug-only-pass-number=passnumber1[,passnumber2,..,passnumberN] It enables the debug printing (i.e. prints inside DEBUG statements ) when one of the mentioned passes is being run.
1 parent 8f85b3d commit 6e1a8de

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

lib/SILOptimizer/PassManager/PassManager.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "llvm/ADT/DenseMap.h"
2626
#include "llvm/Support/CommandLine.h"
2727
#include "llvm/Support/Debug.h"
28+
#include "llvm/Support/ManagedStatic.h"
2829
#include "llvm/Support/TimeValue.h"
2930
#include "llvm/Support/GraphWriter.h"
3031

@@ -94,6 +95,40 @@ llvm::cl::opt<bool> SILVerifyWithoutInvalidation(
9495
"sil-verify-without-invalidation", llvm::cl::init(false),
9596
llvm::cl::desc("Verify after passes even if the pass has not invalidated"));
9697

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+
97132
static bool doPrintBefore(SILTransform *T, SILFunction *F) {
98133
if (!SILPrintOnlyFun.empty() && F && F->getName() != SILPrintOnlyFun)
99134
return false;
@@ -163,6 +198,31 @@ static void printModule(SILModule *Mod, bool EmitVerboseSIL) {
163198
}
164199
}
165200

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+
166226
SILPassManager::SILPassManager(SILModule *M, llvm::StringRef Stage) :
167227
Mod(M), StageName(Stage) {
168228

@@ -217,6 +277,8 @@ void SILPassManager::runPassesOnFunction(PassList FuncTransforms,
217277

218278
for (auto SFT : FuncTransforms) {
219279
PrettyStackTraceSILFunctionTransform X(SFT, NumPassesRun);
280+
DebugPrintEnabler DebugPrint(NumPassesRun);
281+
220282
SFT->injectPassManager(this);
221283
SFT->injectFunction(F);
222284

@@ -410,6 +472,7 @@ void SILPassManager::runModulePass(SILModuleTransform *SMT) {
410472
const SILOptions &Options = getOptions();
411473

412474
PrettyStackTraceSILModuleTransform X(SMT, NumPassesRun);
475+
DebugPrintEnabler DebugPrint(NumPassesRun);
413476

414477
SMT->injectPassManager(this);
415478
SMT->injectModule(Mod);

0 commit comments

Comments
 (0)