Skip to content

Commit a312225

Browse files
authored
Merge pull request #72274 from meg-gupta/debugbreak
Add an option -sil-break-before-pass-count
2 parents 82332ca + dacf5b4 commit a312225

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

include/swift/SILOptimizer/PassManager/PassManager.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ class SILPassManager {
215215

216216
unsigned maxNumPassesToRun = UINT_MAX;
217217
unsigned maxNumSubpassesToRun = UINT_MAX;
218+
unsigned breakBeforePassCount = UINT_MAX;
218219

219220
/// For invoking Swift passes.
220221
SwiftPassInvocation swiftPassInvocation;
@@ -428,7 +429,8 @@ class SILPassManager {
428429
void runSwiftModuleVerification();
429430

430431
private:
431-
void parsePassCount(StringRef countsStr);
432+
void parsePassesToRunCount(StringRef countsStr);
433+
void parseBreakBeforePassCount(StringRef countsStr);
432434

433435
bool doPrintBefore(SILTransform *T, SILFunction *F);
434436

@@ -461,6 +463,9 @@ class SILPassManager {
461463
/// options) whether we should continue running passes.
462464
bool continueTransforming();
463465

466+
/// Break before running a pass.
467+
bool breakBeforeRunning(StringRef fnName, SILFunctionTransform *SFT);
468+
464469
/// Return true if all analyses are unlocked.
465470
bool analysesUnlocked();
466471

lib/SILOptimizer/PassManager/PassManager.cpp

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ llvm::cl::opt<std::string> SILBreakOnPass(
9696
"sil-break-on-pass", llvm::cl::init(""),
9797
llvm::cl::desc("Break before running a particular function pass"));
9898

99+
llvm::cl::opt<std::string>
100+
SILBreakBeforePassCount("sil-break-before-pass-count", llvm::cl::init(""),
101+
llvm::cl::desc("Break before running pass number"));
102+
99103
llvm::cl::list<std::string>
100104
SILPrintFunction("sil-print-function", llvm::cl::CommaSeparated,
101105
llvm::cl::desc("Only print out the sil for this function"));
@@ -403,7 +407,7 @@ SILPassManager::SILPassManager(SILModule *M, bool isMandatory,
403407
#include "swift/SILOptimizer/Analysis/Analysis.def"
404408

405409
if (!SILNumOptPassesToRun.empty()) {
406-
parsePassCount(SILNumOptPassesToRun);
410+
parsePassesToRunCount(SILNumOptPassesToRun);
407411
} else if (!SILPassCountConfigFile.empty()) {
408412
StringRef moduleName = M->getSwiftModule()->getName().str();
409413
std::fstream fs(SILPassCountConfigFile);
@@ -417,13 +421,17 @@ SILPassManager::SILPassManager(SILModule *M, bool isMandatory,
417421
StringRef modName = pair.first;
418422
StringRef countsStr = pair.second;
419423
if (modName == moduleName) {
420-
parsePassCount(countsStr);
424+
parsePassesToRunCount(countsStr);
421425
break;
422426
}
423427
}
424428
fs.close();
425429
}
426430

431+
if (!SILBreakBeforePassCount.empty()) {
432+
parseBreakBeforePassCount(SILBreakBeforePassCount);
433+
}
434+
427435
for (SILAnalysis *A : Analyses) {
428436
A->initialize(this);
429437
}
@@ -434,7 +442,7 @@ SILPassManager::SILPassManager(SILModule *M, bool isMandatory,
434442
M->registerDeserializationNotificationHandler(std::move(handler));
435443
}
436444

437-
void SILPassManager::parsePassCount(StringRef countsStr) {
445+
void SILPassManager::parsePassesToRunCount(StringRef countsStr) {
438446
bool validFormat = true;
439447
if (countsStr.consumeInteger(10, maxNumPassesToRun))
440448
validFormat = false;
@@ -449,6 +457,17 @@ void SILPassManager::parsePassCount(StringRef countsStr) {
449457
}
450458
}
451459

460+
void SILPassManager::parseBreakBeforePassCount(StringRef countsStr) {
461+
bool validFormat = true;
462+
if (countsStr.consumeInteger(10, breakBeforePassCount))
463+
validFormat = false;
464+
if (!validFormat || !countsStr.empty()) {
465+
llvm::errs()
466+
<< "error: wrong format of -sil-break-before-pass-count option\n";
467+
exit(1);
468+
}
469+
}
470+
452471
bool SILPassManager::continueTransforming() {
453472
if (isMandatory)
454473
return true;
@@ -486,19 +505,24 @@ bool SILPassManager::analysesUnlocked() {
486505
// Test the function and pass names we're given against the debug
487506
// options that force us to break prior to a given pass and/or on a
488507
// given function.
489-
static bool breakBeforeRunning(StringRef fnName, SILFunctionTransform *SFT) {
490-
if (SILBreakOnFun.empty() && SILBreakOnPass.empty())
508+
bool SILPassManager::breakBeforeRunning(StringRef fnName,
509+
SILFunctionTransform *SFT) {
510+
if (SILBreakOnFun.empty() && SILBreakOnPass.empty() &&
511+
SILBreakBeforePassCount.empty())
491512
return false;
492513

493-
if (SILBreakOnFun.empty()
494-
&& (SFT->getID() == SILBreakOnPass || SFT->getTag() == SILBreakOnPass))
514+
if (!SILBreakOnPass.empty() &&
515+
(SFT->getID() == SILBreakOnPass || SFT->getTag() == SILBreakOnPass))
495516
return true;
496517

497-
if (SILBreakOnPass.empty() && fnName == SILBreakOnFun)
518+
if (!SILBreakOnFun.empty() && fnName == SILBreakOnFun)
498519
return true;
499520

500-
return fnName == SILBreakOnFun
501-
&& (SFT->getID() == SILBreakOnPass || SFT->getTag() == SILBreakOnPass);
521+
if (!SILBreakBeforePassCount.empty() &&
522+
breakBeforePassCount == NumPassesRun) {
523+
return true;
524+
}
525+
return false;
502526
}
503527

504528
void SILPassManager::dumpPassInfo(const char *Title, SILTransform *Tr,

0 commit comments

Comments
 (0)