diff options
-rw-r--r-- | include/llvm/CodeGen/MachineModuleInfo.h | 3 | ||||
-rw-r--r-- | include/llvm/Pass.h | 4 | ||||
-rw-r--r-- | include/llvm/PassManager.h | 8 | ||||
-rw-r--r-- | include/llvm/PassManagers.h | 4 | ||||
-rw-r--r-- | lib/VMCore/PassManager.cpp | 79 | ||||
-rw-r--r-- | tools/bugpoint/CrashDebugger.cpp | 2 | ||||
-rw-r--r-- | tools/llc/llc.cpp | 2 | ||||
-rw-r--r-- | tools/llvm-extract/llvm-extract.cpp | 2 | ||||
-rw-r--r-- | tools/llvm-prof/llvm-prof.cpp | 2 | ||||
-rw-r--r-- | tools/llvm-stress/llvm-stress.cpp | 2 | ||||
-rw-r--r-- | tools/lto/LTOCodeGenerator.cpp | 4 | ||||
-rw-r--r-- | tools/opt/opt.cpp | 2 |
12 files changed, 81 insertions, 33 deletions
diff --git a/include/llvm/CodeGen/MachineModuleInfo.h b/include/llvm/CodeGen/MachineModuleInfo.h index 4660cad5d8..fc73a3d609 100644 --- a/include/llvm/CodeGen/MachineModuleInfo.h +++ b/include/llvm/CodeGen/MachineModuleInfo.h @@ -180,10 +180,7 @@ public: const MCObjectFileInfo *MOFI); ~MachineModuleInfo(); - using ModulePass::doInitialization; bool doInitialization(); - - using ModulePass::doFinalization; bool doFinalization(); /// EndFunction - Discard function meta information. diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index acfc6a251e..7b6f169666 100644 --- a/include/llvm/Pass.h +++ b/include/llvm/Pass.h @@ -230,7 +230,7 @@ public: /// doInitialization - Virtual method overridden by subclasses to do /// any necessary initialization. /// - virtual bool doInitialization(Module &) { return false; } + virtual bool doInitialization() { 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(Module &) { return false; } + virtual bool doFinalization() { return false; } virtual void assignPassManager(PMStack &PMS, PassManagerType T); diff --git a/include/llvm/PassManager.h b/include/llvm/PassManager.h index ce5fda79f9..1d5e800b4d 100644 --- a/include/llvm/PassManager.h +++ b/include/llvm/PassManager.h @@ -58,6 +58,14 @@ 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/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 385d6e1b55..b0450f3e00 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -462,10 +462,6 @@ public: virtual PassManagerType getPassManagerType() const { return PMT_FunctionPassManager; } - -protected: - // FIXME: due to limitation in AddressSanitizer - bool RunFinalization; }; Timer *getPassTimer(Pass *); diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 4e2d5fad2b..3a8a9e25e3 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -1528,13 +1528,11 @@ bool FPPassManager::runOnFunction(Function &F) { } bool FPPassManager::runOnModule(Module &M) { - bool Changed = false; + bool Changed = doInitialization(M); 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; } @@ -1544,25 +1542,14 @@ 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; } @@ -1585,10 +1572,6 @@ 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; @@ -1617,10 +1600,6 @@ 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(); @@ -1631,7 +1610,29 @@ 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; } @@ -1691,6 +1692,24 @@ 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. @@ -1735,6 +1754,18 @@ 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/tools/bugpoint/CrashDebugger.cpp b/tools/bugpoint/CrashDebugger.cpp index aed16f47e0..8836eedb47 100644 --- a/tools/bugpoint/CrashDebugger.cpp +++ b/tools/bugpoint/CrashDebugger.cpp @@ -412,7 +412,9 @@ 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)) { diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index 4d4a74c009..f3e5c20567 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -359,7 +359,9 @@ 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/tools/llvm-extract/llvm-extract.cpp b/tools/llvm-extract/llvm-extract.cpp index ac82d98b3b..d2caabdd2b 100644 --- a/tools/llvm-extract/llvm-extract.cpp +++ b/tools/llvm-extract/llvm-extract.cpp @@ -276,7 +276,9 @@ 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/tools/llvm-prof/llvm-prof.cpp b/tools/llvm-prof/llvm-prof.cpp index 81e9503abe..940ac340e7 100644 --- a/tools/llvm-prof/llvm-prof.cpp +++ b/tools/llvm-prof/llvm-prof.cpp @@ -287,7 +287,9 @@ 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/tools/llvm-stress/llvm-stress.cpp b/tools/llvm-stress/llvm-stress.cpp index 8473d94731..72fdac87b4 100644 --- a/tools/llvm-stress/llvm-stress.cpp +++ b/tools/llvm-stress/llvm-stress.cpp @@ -713,7 +713,9 @@ 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/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index b1c4f437ff..d9fa218b92 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -342,7 +342,9 @@ void LTOCodeGenerator::applyScopeRestrictions() { passes.add(createInternalizePass(mustPreserveList)); // apply scope restrictions + passes.doInitialization(); passes.run(*mergedModule); + passes.doFinalization(); _scopeRestrictionsDone = true; } @@ -397,7 +399,9 @@ 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/tools/opt/opt.cpp b/tools/opt/opt.cpp index bac0d46947..7cced98dcc 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -820,7 +820,9 @@ 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) |