From 336368c4fd8943aa3d967655d74dc208f5179d6b Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Mon, 26 Nov 2012 23:54:47 +0000 Subject: [PATCH] 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 --- llvm/include/llvm/CodeGen/MachineModuleInfo.h | 3 + llvm/include/llvm/Pass.h | 4 +- llvm/include/llvm/PassManager.h | 8 -- llvm/include/llvm/PassManagers.h | 4 + llvm/lib/VMCore/PassManager.cpp | 79 ++++++------------- llvm/tools/bugpoint/CrashDebugger.cpp | 2 - llvm/tools/llc/llc.cpp | 2 - llvm/tools/llvm-extract/llvm-extract.cpp | 2 - llvm/tools/llvm-prof/llvm-prof.cpp | 2 - llvm/tools/llvm-stress/llvm-stress.cpp | 2 - llvm/tools/lto/LTOCodeGenerator.cpp | 4 - llvm/tools/opt/opt.cpp | 2 - 12 files changed, 33 insertions(+), 81 deletions(-) diff --git a/llvm/include/llvm/CodeGen/MachineModuleInfo.h b/llvm/include/llvm/CodeGen/MachineModuleInfo.h index fc73a3d6095d..4660cad5d8fb 100644 --- a/llvm/include/llvm/CodeGen/MachineModuleInfo.h +++ b/llvm/include/llvm/CodeGen/MachineModuleInfo.h @@ -180,7 +180,10 @@ public: const MCObjectFileInfo *MOFI); ~MachineModuleInfo(); + using ModulePass::doInitialization; bool doInitialization(); + + using ModulePass::doFinalization; bool doFinalization(); /// EndFunction - Discard function meta information. diff --git a/llvm/include/llvm/Pass.h b/llvm/include/llvm/Pass.h index 7b6f169666a7..acfc6a251e64 100644 --- a/llvm/include/llvm/Pass.h +++ b/llvm/include/llvm/Pass.h @@ -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); diff --git a/llvm/include/llvm/PassManager.h b/llvm/include/llvm/PassManager.h index 1d5e800b4daa..ce5fda79f9c7 100644 --- a/llvm/include/llvm/PassManager.h +++ b/llvm/include/llvm/PassManager.h @@ -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 diff --git a/llvm/include/llvm/PassManagers.h b/llvm/include/llvm/PassManagers.h index b0450f3e00f4..385d6e1b55a1 100644 --- a/llvm/include/llvm/PassManagers.h +++ b/llvm/include/llvm/PassManagers.h @@ -462,6 +462,10 @@ public: virtual PassManagerType getPassManagerType() const { return PMT_FunctionPassManager; } + +protected: + // FIXME: due to limitation in AddressSanitizer + bool RunFinalization; }; Timer *getPassTimer(Pass *); diff --git a/llvm/lib/VMCore/PassManager.cpp b/llvm/lib/VMCore/PassManager.cpp index 3a8a9e25e3cc..4e2d5fad2b9d 100644 --- a/llvm/lib/VMCore/PassManager.cpp +++ b/llvm/lib/VMCore/PassManager.cpp @@ -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::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 diff --git a/llvm/tools/bugpoint/CrashDebugger.cpp b/llvm/tools/bugpoint/CrashDebugger.cpp index 8836eedb4768..aed16f47e012 100644 --- a/llvm/tools/bugpoint/CrashDebugger.cpp +++ b/llvm/tools/bugpoint/CrashDebugger.cpp @@ -412,9 +412,7 @@ bool ReduceCrashingInstructions::TestInsts(std::vector // 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)) { diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp index f3e5c20567f5..4d4a74c009e0 100644 --- a/llvm/tools/llc/llc.cpp +++ b/llvm/tools/llc/llc.cpp @@ -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. diff --git a/llvm/tools/llvm-extract/llvm-extract.cpp b/llvm/tools/llvm-extract/llvm-extract.cpp index d2caabdd2b7b..ac82d98b3b77 100644 --- a/llvm/tools/llvm-extract/llvm-extract.cpp +++ b/llvm/tools/llvm-extract/llvm-extract.cpp @@ -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(); diff --git a/llvm/tools/llvm-prof/llvm-prof.cpp b/llvm/tools/llvm-prof/llvm-prof.cpp index 940ac340e7c9..81e9503abe25 100644 --- a/llvm/tools/llvm-prof/llvm-prof.cpp +++ b/llvm/tools/llvm-prof/llvm-prof.cpp @@ -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; } diff --git a/llvm/tools/llvm-stress/llvm-stress.cpp b/llvm/tools/llvm-stress/llvm-stress.cpp index 72fdac87b4d5..8473d94731a5 100644 --- a/llvm/tools/llvm-stress/llvm-stress.cpp +++ b/llvm/tools/llvm-stress/llvm-stress.cpp @@ -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; diff --git a/llvm/tools/lto/LTOCodeGenerator.cpp b/llvm/tools/lto/LTOCodeGenerator.cpp index d9fa218b92f0..b1c4f437ffbb 100644 --- a/llvm/tools/lto/LTOCodeGenerator.cpp +++ b/llvm/tools/lto/LTOCodeGenerator.cpp @@ -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(); diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp index 7cced98dcc57..bac0d4694799 100644 --- a/llvm/tools/opt/opt.cpp +++ b/llvm/tools/opt/opt.cpp @@ -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)