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.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168635 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2012-11-26 23:54:47 +00:00
parent 8d20b5f9ff
commit 0d30d30d58
12 changed files with 33 additions and 81 deletions

View File

@ -180,7 +180,10 @@ public:
const MCObjectFileInfo *MOFI);
~MachineModuleInfo();
using ModulePass::doInitialization;
bool doInitialization();
using ModulePass::doFinalization;
bool doFinalization();
/// EndFunction - Discard function meta information.

View File

@ -230,7 +230,7 @@ public:
/// doInitialization - Virtual method overridden by subclasses to do
/// any necessary initialization.
///
virtual bool doInitialization() { return false; }
virtual bool doInitialization(Module &) { return false; }
/// runOnModule - Virtual method overriden by subclasses to process the module
/// being operated on.
@ -239,7 +239,7 @@ public:
/// doFinalization - Virtual method overriden by subclasses to do any post
/// processing needed after all passes have run.
///
virtual bool doFinalization() { return false; }
virtual bool doFinalization(Module &) { return false; }
virtual void assignPassManager(PMStack &PMS,
PassManagerType T);

View File

@ -58,14 +58,6 @@ public:
/// whether any of the passes modifies the module, and if so, return true.
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:
/// PassManagerImpl_New is the actual class. PassManager is just the
/// wraper to publish simple pass manager interface

View File

@ -462,6 +462,10 @@ public:
virtual PassManagerType getPassManagerType() const {
return PMT_FunctionPassManager;
}
protected:
// FIXME: due to limitation in AddressSanitizer
bool RunFinalization;
};
Timer *getPassTimer(Pass *);

View File

@ -1528,11 +1528,13 @@ bool FPPassManager::runOnFunction(Function &F) {
}
bool FPPassManager::runOnModule(Module &M) {
bool Changed = doInitialization(M);
bool Changed = false;
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
Changed |= runOnFunction(*I);
// FIXME: doFinalization still needed here due to assumption in
// AddressSanitizer
return doFinalization(M) || Changed;
}
@ -1542,14 +1544,25 @@ bool FPPassManager::doInitialization(Module &M) {
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
Changed |= getContainedPass(Index)->doInitialization(M);
// FIXME: mark Finalization as needed here due to assumption in
// AddressSanitizer
RunFinalization = true;
return Changed;
}
bool FPPassManager::doFinalization(Module &M) {
bool Changed = false;
// FIXME: due to limitation in AddressSanitizer
if (!RunFinalization)
return Changed;
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
Changed |= getContainedPass(Index)->doFinalization(M);
// FIXME: due to limitation in AddressSanitizer
RunFinalization = false;
return Changed;
}
@ -1572,6 +1585,10 @@ MPPassManager::runOnModule(Module &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) {
ModulePass *MP = getContainedPass(Index);
bool LocalChanged = false;
@ -1600,6 +1617,10 @@ MPPassManager::runOnModule(Module &M) {
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
for (std::map<Pass *, FunctionPassManagerImpl *>::iterator
I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end();
@ -1610,29 +1631,7 @@ MPPassManager::runOnModule(Module &M) {
FPP->releaseMemoryOnTheFly();
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;
}
@ -1692,24 +1691,6 @@ Pass* MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F){
//===----------------------------------------------------------------------===//
// 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
/// 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);
}
/// 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
// amount of time each pass takes to execute. This only happens with

View File

@ -412,9 +412,7 @@ bool ReduceCrashingInstructions::TestInsts(std::vector<const Instruction*>
// Verify that this is still valid.
PassManager Passes;
Passes.add(createVerifierPass());
Passes.doInitialization();
Passes.run(*M);
Passes.doFinalization();
// Try running on the hacked up program...
if (TestFn(BD, M)) {

View File

@ -359,9 +359,7 @@ int main(int argc, char **argv) {
// Before executing passes, print the final values of the LLVM options.
cl::PrintOptionValues();
PM.doInitialization();
PM.run(*mod);
PM.doFinalization();
}
// Declare success.

View File

@ -276,9 +276,7 @@ int main(int argc, char **argv) {
else if (Force || !CheckBitcodeOutputToConsole(Out.os(), true))
Passes.add(createBitcodeWriterPass(Out.os()));
Passes.doInitialization();
Passes.run(*M.get());
Passes.doFinalization();
// Declare success.
Out.keep();

View File

@ -287,9 +287,7 @@ int main(int argc, char **argv) {
PassManager PassMgr;
PassMgr.add(createProfileLoaderPass(ProfileDataFile));
PassMgr.add(new ProfileInfoPrinterPass(PIL));
PassMgr.doInitialization();
PassMgr.run(*M);
PassMgr.doFinalization();
return 0;
}

View File

@ -713,9 +713,7 @@ int main(int argc, char **argv) {
PassManager Passes;
Passes.add(createVerifierPass());
Passes.add(createPrintModulePass(&Out->os()));
Passes.doInitialization();
Passes.run(*M.get());
Passes.doFinalization();
Out->keep();
return 0;

View File

@ -342,9 +342,7 @@ void LTOCodeGenerator::applyScopeRestrictions() {
passes.add(createInternalizePass(mustPreserveList));
// apply scope restrictions
passes.doInitialization();
passes.run(*mergedModule);
passes.doFinalization();
_scopeRestrictionsDone = true;
}
@ -399,9 +397,7 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out,
}
// Run our queue of passes all at once now, efficiently.
passes.doInitialization();
passes.run(*mergedModule);
passes.doFinalization();
// Run the code generator, and write assembly file
codeGenPasses->doInitialization();

View File

@ -820,9 +820,7 @@ int main(int argc, char **argv) {
cl::PrintOptionValues();
// Now that we have all of the passes ready, run them.
Passes.doInitialization();
Passes.run(*M.get());
Passes.doFinalization();
// Declare success.
if (!NoOutput || PrintBreakpoints)