Step towards implementation of pass manager with doInitialization and doFinalization per module detangled from runOn?? calls, still has temporary code not to break ASAN to be removed when that pass conforms to the proposed model
Patch by Pedro Artigas, with feedback from by Chandler Carruth. llvm-svn: 168635
This commit is contained in:
parent
8559a35508
commit
336368c4fd
|
@ -180,7 +180,10 @@ public:
|
||||||
const MCObjectFileInfo *MOFI);
|
const MCObjectFileInfo *MOFI);
|
||||||
~MachineModuleInfo();
|
~MachineModuleInfo();
|
||||||
|
|
||||||
|
using ModulePass::doInitialization;
|
||||||
bool doInitialization();
|
bool doInitialization();
|
||||||
|
|
||||||
|
using ModulePass::doFinalization;
|
||||||
bool doFinalization();
|
bool doFinalization();
|
||||||
|
|
||||||
/// EndFunction - Discard function meta information.
|
/// EndFunction - Discard function meta information.
|
||||||
|
|
|
@ -230,7 +230,7 @@ public:
|
||||||
/// doInitialization - Virtual method overridden by subclasses to do
|
/// doInitialization - Virtual method overridden by subclasses to do
|
||||||
/// any necessary initialization.
|
/// any necessary initialization.
|
||||||
///
|
///
|
||||||
virtual bool doInitialization() { return false; }
|
virtual bool doInitialization(Module &) { return false; }
|
||||||
|
|
||||||
/// runOnModule - Virtual method overriden by subclasses to process the module
|
/// runOnModule - Virtual method overriden by subclasses to process the module
|
||||||
/// being operated on.
|
/// being operated on.
|
||||||
|
@ -239,7 +239,7 @@ public:
|
||||||
/// doFinalization - Virtual method overriden by subclasses to do any post
|
/// doFinalization - Virtual method overriden by subclasses to do any post
|
||||||
/// processing needed after all passes have run.
|
/// processing needed after all passes have run.
|
||||||
///
|
///
|
||||||
virtual bool doFinalization() { return false; }
|
virtual bool doFinalization(Module &) { return false; }
|
||||||
|
|
||||||
virtual void assignPassManager(PMStack &PMS,
|
virtual void assignPassManager(PMStack &PMS,
|
||||||
PassManagerType T);
|
PassManagerType T);
|
||||||
|
|
|
@ -58,14 +58,6 @@ public:
|
||||||
/// whether any of the passes modifies the module, and if so, return true.
|
/// whether any of the passes modifies the module, and if so, return true.
|
||||||
bool run(Module &M);
|
bool run(Module &M);
|
||||||
|
|
||||||
/// doInitialization - Run all of the initializers for the module passes.
|
|
||||||
///
|
|
||||||
bool doInitialization();
|
|
||||||
|
|
||||||
/// doFinalization - Run all of the finalizers for the module passes.
|
|
||||||
///
|
|
||||||
bool doFinalization();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// PassManagerImpl_New is the actual class. PassManager is just the
|
/// PassManagerImpl_New is the actual class. PassManager is just the
|
||||||
/// wraper to publish simple pass manager interface
|
/// wraper to publish simple pass manager interface
|
||||||
|
|
|
@ -462,6 +462,10 @@ public:
|
||||||
virtual PassManagerType getPassManagerType() const {
|
virtual PassManagerType getPassManagerType() const {
|
||||||
return PMT_FunctionPassManager;
|
return PMT_FunctionPassManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// FIXME: due to limitation in AddressSanitizer
|
||||||
|
bool RunFinalization;
|
||||||
};
|
};
|
||||||
|
|
||||||
Timer *getPassTimer(Pass *);
|
Timer *getPassTimer(Pass *);
|
||||||
|
|
|
@ -1528,11 +1528,13 @@ bool FPPassManager::runOnFunction(Function &F) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FPPassManager::runOnModule(Module &M) {
|
bool FPPassManager::runOnModule(Module &M) {
|
||||||
bool Changed = doInitialization(M);
|
bool Changed = false;
|
||||||
|
|
||||||
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
|
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
|
||||||
Changed |= runOnFunction(*I);
|
Changed |= runOnFunction(*I);
|
||||||
|
|
||||||
|
// FIXME: doFinalization still needed here due to assumption in
|
||||||
|
// AddressSanitizer
|
||||||
return doFinalization(M) || Changed;
|
return doFinalization(M) || Changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1542,14 +1544,25 @@ bool FPPassManager::doInitialization(Module &M) {
|
||||||
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
||||||
Changed |= getContainedPass(Index)->doInitialization(M);
|
Changed |= getContainedPass(Index)->doInitialization(M);
|
||||||
|
|
||||||
|
// FIXME: mark Finalization as needed here due to assumption in
|
||||||
|
// AddressSanitizer
|
||||||
|
RunFinalization = true;
|
||||||
|
|
||||||
return Changed;
|
return Changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FPPassManager::doFinalization(Module &M) {
|
bool FPPassManager::doFinalization(Module &M) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
|
||||||
|
// FIXME: due to limitation in AddressSanitizer
|
||||||
|
if (!RunFinalization)
|
||||||
|
return Changed;
|
||||||
|
|
||||||
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
||||||
Changed |= getContainedPass(Index)->doFinalization(M);
|
Changed |= getContainedPass(Index)->doFinalization(M);
|
||||||
|
|
||||||
|
// FIXME: due to limitation in AddressSanitizer
|
||||||
|
RunFinalization = false;
|
||||||
|
|
||||||
return Changed;
|
return Changed;
|
||||||
}
|
}
|
||||||
|
@ -1572,6 +1585,10 @@ MPPassManager::runOnModule(Module &M) {
|
||||||
Changed |= FPP->doInitialization(M);
|
Changed |= FPP->doInitialization(M);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Initialize module passes
|
||||||
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
||||||
|
Changed |= getContainedPass(Index)->doInitialization(M);
|
||||||
|
|
||||||
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
|
||||||
ModulePass *MP = getContainedPass(Index);
|
ModulePass *MP = getContainedPass(Index);
|
||||||
bool LocalChanged = false;
|
bool LocalChanged = false;
|
||||||
|
@ -1600,6 +1617,10 @@ MPPassManager::runOnModule(Module &M) {
|
||||||
removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
|
removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finalize module passes
|
||||||
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
||||||
|
Changed |= getContainedPass(Index)->doFinalization(M);
|
||||||
|
|
||||||
// Finalize on-the-fly passes
|
// Finalize on-the-fly passes
|
||||||
for (std::map<Pass *, FunctionPassManagerImpl *>::iterator
|
for (std::map<Pass *, FunctionPassManagerImpl *>::iterator
|
||||||
I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end();
|
I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end();
|
||||||
|
@ -1610,29 +1631,7 @@ MPPassManager::runOnModule(Module &M) {
|
||||||
FPP->releaseMemoryOnTheFly();
|
FPP->releaseMemoryOnTheFly();
|
||||||
Changed |= FPP->doFinalization(M);
|
Changed |= FPP->doFinalization(M);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Run all of the initializers for the module passes.
|
|
||||||
///
|
|
||||||
bool MPPassManager::doInitialization() {
|
|
||||||
bool Changed = false;
|
|
||||||
|
|
||||||
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
|
||||||
Changed |= getContainedPass(Index)->doInitialization();
|
|
||||||
|
|
||||||
return Changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Run all of the finalizers for the module passes.
|
|
||||||
///
|
|
||||||
bool MPPassManager::doFinalization() {
|
|
||||||
bool Changed = false;
|
|
||||||
|
|
||||||
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
|
||||||
Changed |= getContainedPass(Index)->doFinalization();
|
|
||||||
|
|
||||||
return Changed;
|
return Changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1692,24 +1691,6 @@ Pass* MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F){
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// PassManagerImpl implementation
|
// PassManagerImpl implementation
|
||||||
|
|
||||||
bool PassManagerImpl::doInitialization() {
|
|
||||||
bool Changed = false;
|
|
||||||
|
|
||||||
for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
|
|
||||||
Changed |= getContainedManager(Index)->doInitialization();
|
|
||||||
|
|
||||||
return Changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PassManagerImpl::doFinalization() {
|
|
||||||
bool Changed = false;
|
|
||||||
|
|
||||||
for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
|
|
||||||
Changed |= getContainedManager(Index)->doFinalization();
|
|
||||||
|
|
||||||
return Changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
/// run - Execute all of the passes scheduled for execution. Keep track of
|
/// run - Execute all of the passes scheduled for execution. Keep track of
|
||||||
/// whether any of the passes modifies the module, and if so, return true.
|
/// whether any of the passes modifies the module, and if so, return true.
|
||||||
|
@ -1754,18 +1735,6 @@ bool PassManager::run(Module &M) {
|
||||||
return PM->run(M);
|
return PM->run(M);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// doInitialization - Run all of the initializers for the module passes.
|
|
||||||
///
|
|
||||||
bool PassManager::doInitialization() {
|
|
||||||
return PM->doInitialization();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// doFinalization - Run all of the finalizers for the module passes.
|
|
||||||
///
|
|
||||||
bool PassManager::doFinalization() {
|
|
||||||
return PM->doFinalization();
|
|
||||||
}
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// TimingInfo Class - This class is used to calculate information about the
|
// TimingInfo Class - This class is used to calculate information about the
|
||||||
// amount of time each pass takes to execute. This only happens with
|
// amount of time each pass takes to execute. This only happens with
|
||||||
|
|
|
@ -412,9 +412,7 @@ bool ReduceCrashingInstructions::TestInsts(std::vector<const Instruction*>
|
||||||
// Verify that this is still valid.
|
// Verify that this is still valid.
|
||||||
PassManager Passes;
|
PassManager Passes;
|
||||||
Passes.add(createVerifierPass());
|
Passes.add(createVerifierPass());
|
||||||
Passes.doInitialization();
|
|
||||||
Passes.run(*M);
|
Passes.run(*M);
|
||||||
Passes.doFinalization();
|
|
||||||
|
|
||||||
// Try running on the hacked up program...
|
// Try running on the hacked up program...
|
||||||
if (TestFn(BD, M)) {
|
if (TestFn(BD, M)) {
|
||||||
|
|
|
@ -359,9 +359,7 @@ int main(int argc, char **argv) {
|
||||||
// Before executing passes, print the final values of the LLVM options.
|
// Before executing passes, print the final values of the LLVM options.
|
||||||
cl::PrintOptionValues();
|
cl::PrintOptionValues();
|
||||||
|
|
||||||
PM.doInitialization();
|
|
||||||
PM.run(*mod);
|
PM.run(*mod);
|
||||||
PM.doFinalization();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Declare success.
|
// Declare success.
|
||||||
|
|
|
@ -276,9 +276,7 @@ int main(int argc, char **argv) {
|
||||||
else if (Force || !CheckBitcodeOutputToConsole(Out.os(), true))
|
else if (Force || !CheckBitcodeOutputToConsole(Out.os(), true))
|
||||||
Passes.add(createBitcodeWriterPass(Out.os()));
|
Passes.add(createBitcodeWriterPass(Out.os()));
|
||||||
|
|
||||||
Passes.doInitialization();
|
|
||||||
Passes.run(*M.get());
|
Passes.run(*M.get());
|
||||||
Passes.doFinalization();
|
|
||||||
|
|
||||||
// Declare success.
|
// Declare success.
|
||||||
Out.keep();
|
Out.keep();
|
||||||
|
|
|
@ -287,9 +287,7 @@ int main(int argc, char **argv) {
|
||||||
PassManager PassMgr;
|
PassManager PassMgr;
|
||||||
PassMgr.add(createProfileLoaderPass(ProfileDataFile));
|
PassMgr.add(createProfileLoaderPass(ProfileDataFile));
|
||||||
PassMgr.add(new ProfileInfoPrinterPass(PIL));
|
PassMgr.add(new ProfileInfoPrinterPass(PIL));
|
||||||
PassMgr.doInitialization();
|
|
||||||
PassMgr.run(*M);
|
PassMgr.run(*M);
|
||||||
PassMgr.doFinalization();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -713,9 +713,7 @@ int main(int argc, char **argv) {
|
||||||
PassManager Passes;
|
PassManager Passes;
|
||||||
Passes.add(createVerifierPass());
|
Passes.add(createVerifierPass());
|
||||||
Passes.add(createPrintModulePass(&Out->os()));
|
Passes.add(createPrintModulePass(&Out->os()));
|
||||||
Passes.doInitialization();
|
|
||||||
Passes.run(*M.get());
|
Passes.run(*M.get());
|
||||||
Passes.doFinalization();
|
|
||||||
Out->keep();
|
Out->keep();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -342,9 +342,7 @@ void LTOCodeGenerator::applyScopeRestrictions() {
|
||||||
passes.add(createInternalizePass(mustPreserveList));
|
passes.add(createInternalizePass(mustPreserveList));
|
||||||
|
|
||||||
// apply scope restrictions
|
// apply scope restrictions
|
||||||
passes.doInitialization();
|
|
||||||
passes.run(*mergedModule);
|
passes.run(*mergedModule);
|
||||||
passes.doFinalization();
|
|
||||||
|
|
||||||
_scopeRestrictionsDone = true;
|
_scopeRestrictionsDone = true;
|
||||||
}
|
}
|
||||||
|
@ -399,9 +397,7 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run our queue of passes all at once now, efficiently.
|
// Run our queue of passes all at once now, efficiently.
|
||||||
passes.doInitialization();
|
|
||||||
passes.run(*mergedModule);
|
passes.run(*mergedModule);
|
||||||
passes.doFinalization();
|
|
||||||
|
|
||||||
// Run the code generator, and write assembly file
|
// Run the code generator, and write assembly file
|
||||||
codeGenPasses->doInitialization();
|
codeGenPasses->doInitialization();
|
||||||
|
|
|
@ -820,9 +820,7 @@ int main(int argc, char **argv) {
|
||||||
cl::PrintOptionValues();
|
cl::PrintOptionValues();
|
||||||
|
|
||||||
// Now that we have all of the passes ready, run them.
|
// Now that we have all of the passes ready, run them.
|
||||||
Passes.doInitialization();
|
|
||||||
Passes.run(*M.get());
|
Passes.run(*M.get());
|
||||||
Passes.doFinalization();
|
|
||||||
|
|
||||||
// Declare success.
|
// Declare success.
|
||||||
if (!NoOutput || PrintBreakpoints)
|
if (!NoOutput || PrintBreakpoints)
|
||||||
|
|
Loading…
Reference in New Issue