Skip to content

Commit 361d9e6

Browse files
authored
Merge pull request #3242 from swiftix/debug-output-improvements
Small debug output improvements
2 parents bd3bc93 + 6e1a8de commit 361d9e6

File tree

3 files changed

+77
-6
lines changed

3 files changed

+77
-6
lines changed

include/swift/SILOptimizer/PassManager/PrettyStackTrace.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,23 @@ class SILModuleTransform;
2323
class PrettyStackTraceSILFunctionTransform
2424
: public llvm::PrettyStackTraceEntry {
2525
SILFunctionTransform *SFT;
26+
unsigned PassNumber;
2627

2728
public:
28-
PrettyStackTraceSILFunctionTransform(SILFunctionTransform *SFT) : SFT(SFT) {}
29+
PrettyStackTraceSILFunctionTransform(SILFunctionTransform *SFT,
30+
unsigned PassNumber)
31+
: SFT(SFT), PassNumber(PassNumber) {}
2932
virtual void print(llvm::raw_ostream &OS) const;
3033
};
3134

3235
class PrettyStackTraceSILModuleTransform : public llvm::PrettyStackTraceEntry {
3336
SILModuleTransform *SMT;
37+
unsigned PassNumber;
3438

3539
public:
36-
PrettyStackTraceSILModuleTransform(SILModuleTransform *SMT) : SMT(SMT) {}
40+
PrettyStackTraceSILModuleTransform(SILModuleTransform *SMT,
41+
unsigned PassNumber)
42+
: SMT(SMT), PassNumber(PassNumber) {}
3743
virtual void print(llvm::raw_ostream &OS) const;
3844
};
3945

lib/SILOptimizer/PassManager/PassManager.cpp

Lines changed: 65 additions & 2 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

@@ -216,7 +276,9 @@ void SILPassManager::runPassesOnFunction(PassList FuncTransforms,
216276
assert(analysesUnlocked() && "Expected all analyses to be unlocked!");
217277

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

@@ -409,7 +471,8 @@ void SILPassManager::runModulePass(SILModuleTransform *SMT) {
409471

410472
const SILOptions &Options = getOptions();
411473

412-
PrettyStackTraceSILModuleTransform X(SMT);
474+
PrettyStackTraceSILModuleTransform X(SMT, NumPassesRun);
475+
DebugPrintEnabler DebugPrint(NumPassesRun);
413476

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

lib/SILOptimizer/PassManager/PrettyStackTrace.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
using namespace swift;
1919

2020
void PrettyStackTraceSILFunctionTransform::print(llvm::raw_ostream &out) const {
21-
out << "While running SILFunctionTransform \"" << SFT->getName()
21+
out << "While running pass #" << PassNumber
22+
<< " SILFunctionTransform \"" << SFT->getName()
2223
<< "\" on SILFunction ";
2324
if (!SFT->getFunction()) {
2425
out << " <<null>>";
@@ -30,5 +31,6 @@ void PrettyStackTraceSILFunctionTransform::print(llvm::raw_ostream &out) const {
3031
}
3132

3233
void PrettyStackTraceSILModuleTransform::print(llvm::raw_ostream &out) const {
33-
out << "While running SILModuleTransform \"" << SMT->getName() << "\".\n";
34+
out << "While running pass #" << PassNumber
35+
<< " SILModuleTransform \"" << SMT->getName() << "\".\n";
3436
}

0 commit comments

Comments
 (0)