@@ -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+
99103llvm::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+
452471bool 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
504528void SILPassManager::dumpPassInfo (const char *Title, SILTransform *Tr,
0 commit comments