-sil-print-all (et al.) should print specialized functions when they are created.

This commit is contained in:
Andrew Trick
2018-02-08 11:27:46 -08:00
parent af67204b51
commit 3a15cee084
3 changed files with 25 additions and 0 deletions

View File

@@ -155,6 +155,9 @@ public:
CompletedPassesMap.clear();
}
/// \brief Notify the pass manager of a newly create function for tracing.
void notifyOfNewFunction(SILFunction *F, SILTransform *T);
/// \brief Add the function \p F to the function pass worklist.
/// If not null, the function \p DerivedFrom is the function from which \p F
/// is derived. This is used to avoid an infinite amount of functions pushed
@@ -291,6 +294,9 @@ private:
/// Return true if all analyses are unlocked.
bool analysesUnlocked();
/// Dumps information about the pass with index \p TransIdx to llvm::dbgs().
void dumpPassInfo(const char *Title, SILTransform *Tr, SILFunction *F);
/// Dumps information about the pass with index \p TransIdx to llvm::dbgs().
void dumpPassInfo(const char *Title, unsigned TransIdx,
SILFunction *F = nullptr);

View File

@@ -114,6 +114,7 @@ namespace swift {
/// The number should be small anyway, but bugs in optimizations could cause
/// an infinite loop in the passmanager.
void notifyAddFunction(SILFunction *F, SILFunction *DerivedFrom) {
PM->notifyOfNewFunction(F, this);
PM->addFunctionToWorklist(F, DerivedFrom);
PM->notifyAnalysisOfFunction(F);
}
@@ -171,6 +172,7 @@ namespace swift {
/// Inform the pass manager of an added function.
void notifyAddFunction(SILFunction *F) {
PM->notifyOfNewFunction(F, this);
PM->notifyAnalysisOfFunction(F);
}
};

View File

@@ -283,6 +283,16 @@ static bool breakBeforeRunning(StringRef fnName, SILFunctionTransform *SFT) {
&& (SFT->getID() == SILBreakOnPass || SFT->getTag() == SILBreakOnPass);
}
void SILPassManager::dumpPassInfo(const char *Title, SILTransform *Tr,
SILFunction *F) {
llvm::dbgs() << " " << Title << " #" << NumPassesRun << ", stage "
<< StageName << ", pass : " << Tr->getID()
<< " (" << Tr->getTag() << ")";
if (F)
llvm::dbgs() << ", Function: " << F->getName();
llvm::dbgs() << '\n';
}
void SILPassManager::dumpPassInfo(const char *Title, unsigned TransIdx,
SILFunction *F) {
SILTransform *Tr = Transformations[TransIdx];
@@ -541,6 +551,13 @@ SILPassManager::~SILPassManager() {
}
}
void SILPassManager::notifyOfNewFunction(SILFunction *F, SILTransform *T) {
if (doPrintAfter(T, F, SILPrintAll)) {
dumpPassInfo("*** New SIL function in ", T, F);
F->dump(getOptions().EmitVerboseSIL);
}
}
void SILPassManager::addFunctionToWorklist(SILFunction *F,
SILFunction *DerivedFrom) {
assert(F && F->isDefinition() && (isMandatoryPipeline || F->shouldOptimize())