Index: include/llvm/Analysis/FindUsedTypes.h =================================================================== --- include/llvm/Analysis/FindUsedTypes.h (revision 167748) +++ include/llvm/Analysis/FindUsedTypes.h (working copy) @@ -52,8 +52,10 @@ void IncorporateValue(const Value *V); public: + bool doInitialization(void) { return false; } /// run - This incorporates all types used by the specified module bool runOnModule(Module &M); + bool doFinalization(void) { return false; } /// getAnalysisUsage - We do not modify anything. virtual void getAnalysisUsage(AnalysisUsage &AU) const { Index: include/llvm/Pass.h =================================================================== --- include/llvm/Pass.h (revision 167748) +++ include/llvm/Pass.h (working copy) @@ -227,10 +227,20 @@ /// createPrinterPass - Get a module printer pass. Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const; + /// doInitialization - Virtual method overridden by subclasses to do + /// any necessary initialization. + /// + virtual bool doInitialization(void) { return false; } + /// runOnModule - Virtual method overriden by subclasses to process the module /// being operated on. virtual bool runOnModule(Module &M) = 0; + /// doFinalization - Virtual method overriden by subclasses to do any post + /// processing needed after all passes have run. + /// + virtual bool doFinalization(void) { return false; } + virtual void assignPassManager(PMStack &PMS, PassManagerType T); @@ -262,7 +272,9 @@ /// ImmutablePasses are never run. /// + bool doInitialization(void) { return false; } bool runOnModule(Module &) { return false; } + bool doFinalization(void) { return false; } explicit ImmutablePass(char &pid) : ModulePass(pid) {} Index: include/llvm/PassManagers.h =================================================================== --- include/llvm/PassManagers.h (revision 167748) +++ include/llvm/PassManagers.h (working copy) @@ -420,10 +420,22 @@ /// cleanup - After running all passes, clean up pass manager cache. void cleanup(); + /// doInitialization - Overrides ModulePass doInitialization for global + /// initialization tasks + /// + using ModulePass::doInitialization; + bool doInitialization(void) { return false; } + /// doInitialization - Run all of the initializers for the function passes. /// bool doInitialization(Module &M); + /// doFinalization - Overrides ModulePass doFinalization for global + /// finalization tasks + /// + using ModulePass::doFinalization; + bool doFinalization(void) { return false; } + /// doFinalization - Run all of the finalizers for the function passes. /// bool doFinalization(Module &M); Index: tools/opt/opt.cpp =================================================================== --- tools/opt/opt.cpp (revision 167748) +++ tools/opt/opt.cpp (working copy) @@ -207,6 +207,7 @@ PassName = "ModulePass Printer: " + PassToPrintName; } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { if (!Quiet) Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; @@ -215,6 +216,7 @@ getAnalysisID(PassToPrint->getTypeInfo()).print(Out, &M); return false; } + virtual bool doFinalization(void) { return false; } virtual const char *getPassName() const { return PassName.c_str(); } @@ -382,6 +384,7 @@ } } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { StringSet<> Processed; if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp")) @@ -397,6 +400,7 @@ } return false; } + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); Index: tools/opt/PrintSCC.cpp =================================================================== --- tools/opt/PrintSCC.cpp (revision 167748) +++ tools/opt/PrintSCC.cpp (working copy) @@ -50,8 +50,10 @@ static char ID; // Pass identification, replacement for typeid CallGraphSCC() : ModulePass(ID) {} + bool doInitialization(void) { return false; } // run - Print out SCCs in the call graph for the specified module. bool runOnModule(Module &M); + bool doFinalization(void) { return false; } void print(raw_ostream &O, const Module* = 0) const { } Index: tools/opt/AnalysisWrappers.cpp =================================================================== --- tools/opt/AnalysisWrappers.cpp (revision 167748) +++ tools/opt/AnalysisWrappers.cpp (working copy) @@ -32,6 +32,7 @@ struct ExternalFunctionsPassedConstants : public ModulePass { static char ID; // Pass ID, replacement for typeid ExternalFunctionsPassedConstants() : ModulePass(ID) {} + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) { if (!I->isDeclaration()) continue; @@ -61,6 +62,7 @@ return false; } + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); @@ -82,10 +84,12 @@ AU.setPreservesAll(); AU.addRequiredTransitive(); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { getAnalysis().print(errs(), &M); return false; } + virtual bool doFinalization(void) { return false; } }; } Index: tools/opt/GraphPrinters.cpp =================================================================== --- tools/opt/GraphPrinters.cpp (revision 167748) +++ tools/opt/GraphPrinters.cpp (working copy) @@ -72,10 +72,12 @@ static char ID; // Pass ID, replacement for typeid CallGraphPrinter() : ModulePass(ID) {} + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { WriteGraphToFile(llvm::errs(), "callgraph", &getAnalysis()); return false; } + virtual bool doFinalization(void) { return false; } void print(raw_ostream &OS, const llvm::Module*) const {} Index: tools/llvm-prof/llvm-prof.cpp =================================================================== --- tools/llvm-prof/llvm-prof.cpp (revision 167748) +++ tools/llvm-prof/llvm-prof.cpp (working copy) @@ -139,7 +139,9 @@ AU.addRequired(); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } }; } Index: unittests/VMCore/PassManagerTest.cpp =================================================================== --- unittests/VMCore/PassManagerTest.cpp (revision 167748) +++ unittests/VMCore/PassManagerTest.cpp (working copy) @@ -49,10 +49,12 @@ static char run; static char ID; ModuleNDNM() : ModulePass(ID) { } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { run++; return false; } + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } @@ -65,10 +67,12 @@ static char run; static char ID; ModuleNDM() : ModulePass(ID) {} + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { run++; return true; } + virtual bool doFinalization(void) { return false; } }; char ModuleNDM::ID=0; char ModuleNDM::run=0; @@ -78,10 +82,12 @@ static char run; static char ID; ModuleNDM2() : ModulePass(ID) {} + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { run++; return true; } + virtual bool doFinalization(void) { return false; } }; char ModuleNDM2::ID=0; char ModuleNDM2::run=0; @@ -93,11 +99,13 @@ ModuleDNM() : ModulePass(ID) { initializeModuleNDMPass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { EXPECT_TRUE(getAnalysisIfAvailable()); run++; return false; } + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesAll(); @@ -265,6 +273,7 @@ OnTheFlyTest() : ModulePass(ID) { initializeFPassPass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M) { EXPECT_TRUE(getAnalysisIfAvailable()); for (Module::iterator I=M.begin(),E=M.end(); I != E; ++I) { @@ -276,6 +285,7 @@ } return false; } + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); } Index: lib/Analysis/ProfileDataLoaderPass.cpp =================================================================== --- lib/Analysis/ProfileDataLoaderPass.cpp (revision 167748) +++ lib/Analysis/ProfileDataLoaderPass.cpp (working copy) @@ -67,7 +67,9 @@ virtual unsigned matchEdges(Module&, ProfileData&, ArrayRef); virtual void setBranchWeightMetadata(Module&, ProfileData&); + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } }; } // End of anonymous namespace Index: lib/Analysis/IPA/GlobalsModRef.cpp =================================================================== --- lib/Analysis/IPA/GlobalsModRef.cpp (revision 167748) +++ lib/Analysis/IPA/GlobalsModRef.cpp (working copy) @@ -94,12 +94,14 @@ initializeGlobalsModRefPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M) { InitializeAliasAnalysis(this); // set up super class AnalyzeGlobals(M); // find non-addr taken globals AnalyzeCallGraph(getAnalysis(), M); // Propagate on CG return false; } + bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AliasAnalysis::getAnalysisUsage(AU); Index: lib/Analysis/IPA/CallGraph.cpp =================================================================== --- lib/Analysis/IPA/CallGraph.cpp (revision 167748) +++ lib/Analysis/IPA/CallGraph.cpp (working copy) @@ -47,6 +47,7 @@ initializeBasicCallGraphPass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } // runOnModule - Compute the call graph for the specified module. virtual bool runOnModule(Module &M) { CallGraph::initialize(M); @@ -64,6 +65,7 @@ return false; } + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); Index: lib/Analysis/IPA/CallGraphSCCPass.cpp =================================================================== --- lib/Analysis/IPA/CallGraphSCCPass.cpp (revision 167748) +++ lib/Analysis/IPA/CallGraphSCCPass.cpp (working copy) @@ -47,9 +47,11 @@ explicit CGPassManager() : ModulePass(ID), PMDataManager() { } + bool doInitialization(void) { return false; } /// 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. bool runOnModule(Module &M); + bool doFinalization(void) { return false; } bool doInitialization(CallGraph &CG); bool doFinalization(CallGraph &CG); Index: lib/Analysis/PathProfileVerifier.cpp =================================================================== --- lib/Analysis/PathProfileVerifier.cpp (revision 167748) +++ lib/Analysis/PathProfileVerifier.cpp (working copy) @@ -29,7 +29,9 @@ namespace { class PathProfileVerifier : public ModulePass { private: + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } public: static char ID; // Pass identification, replacement for typeid Index: lib/Analysis/PathProfileInfo.cpp =================================================================== --- lib/Analysis/PathProfileInfo.cpp (revision 167748) +++ lib/Analysis/PathProfileInfo.cpp (working copy) @@ -55,8 +55,10 @@ return this; } + bool doInitialization(void) { return false; } // entry point to run the pass bool runOnModule(Module &M); + bool doFinalization(void) { return false; } // pass identification static char ID; Index: lib/Analysis/AliasAnalysisCounter.cpp =================================================================== --- lib/Analysis/AliasAnalysisCounter.cpp (revision 167748) +++ lib/Analysis/AliasAnalysisCounter.cpp (working copy) @@ -75,11 +75,13 @@ } } + bool doInitialization(void) { return false; } bool runOnModule(Module &M) { this->M = &M; InitializeAliasAnalysis(this); return false; } + bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AliasAnalysis::getAnalysisUsage(AU); Index: lib/Analysis/AliasDebugger.cpp =================================================================== --- lib/Analysis/AliasDebugger.cpp (revision 167748) +++ lib/Analysis/AliasDebugger.cpp (working copy) @@ -43,6 +43,7 @@ initializeAliasDebuggerPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M) { InitializeAliasAnalysis(this); // set up super class @@ -75,6 +76,7 @@ } return false; } + bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AliasAnalysis::getAnalysisUsage(AU); Index: lib/Analysis/ModuleDebugInfoPrinter.cpp =================================================================== --- lib/Analysis/ModuleDebugInfoPrinter.cpp (revision 167748) +++ lib/Analysis/ModuleDebugInfoPrinter.cpp (working copy) @@ -34,7 +34,9 @@ initializeModuleDebugInfoPrinterPass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); Index: lib/Analysis/ProfileInfoLoaderPass.cpp =================================================================== --- lib/Analysis/ProfileInfoLoaderPass.cpp (revision 167748) +++ lib/Analysis/ProfileInfoLoaderPass.cpp (working copy) @@ -74,8 +74,10 @@ return this; } + virtual bool doInitialization(void) { return false; } /// run - Load the profile information from the specified file. virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } }; } // End of anonymous namespace Index: lib/Target/CppBackend/CPPBackend.cpp =================================================================== --- lib/Target/CppBackend/CPPBackend.cpp (revision 167748) +++ lib/Target/CppBackend/CPPBackend.cpp (working copy) @@ -109,7 +109,9 @@ virtual const char *getPassName() const { return "C++ backend"; } + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } void printProgram(const std::string& fname, const std::string& modName ); void printModule(const std::string& fname, const std::string& modName ); Index: lib/VMCore/PassManager.cpp =================================================================== --- lib/VMCore/PassManager.cpp (revision 167748) +++ lib/VMCore/PassManager.cpp (working copy) @@ -1548,6 +1548,12 @@ MPPassManager::runOnModule(Module &M) { bool Changed = false; + // Initialize module passes + for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { + ModulePass *MP = getContainedPass(Index); + Changed |= MP->doInitialization(); + } + // Initialize on-the-fly passes for (std::map::iterator I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end(); @@ -1594,6 +1600,13 @@ FPP->releaseMemoryOnTheFly(); Changed |= FPP->doFinalization(M); } + + // Finalize module passes + for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { + ModulePass *MP = getContainedPass(Index); + Changed |= MP->doFinalization(); + } + return Changed; } Index: lib/VMCore/PrintModulePass.cpp =================================================================== --- lib/VMCore/PrintModulePass.cpp (revision 167748) +++ lib/VMCore/PrintModulePass.cpp (working copy) @@ -36,11 +36,13 @@ ~PrintModulePass() { if (DeleteStream) delete Out; } - + + bool doInitialization(void) { return false; } bool runOnModule(Module &M) { (*Out) << Banner << M; return false; } + bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); Index: lib/Transforms/Utils/MetaRenamer.cpp =================================================================== --- lib/Transforms/Utils/MetaRenamer.cpp (revision 167748) +++ lib/Transforms/Utils/MetaRenamer.cpp (working copy) @@ -53,6 +53,7 @@ AU.setPreservesAll(); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M) { static const char *metaNames[] = { // See http://en.wikipedia.org/wiki/Metasyntactic_variable @@ -101,6 +102,7 @@ } return true; } + bool doFinalization(void) { return false; } bool runOnFunction(Function &F) { for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end(); Index: lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp =================================================================== --- lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp (revision 167748) +++ lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp (working copy) @@ -33,7 +33,9 @@ namespace { class OptimalEdgeProfiler : public ModulePass { + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } public: static char ID; // Pass identification, replacement for typeid OptimalEdgeProfiler() : ModulePass(ID) { Index: lib/Transforms/Instrumentation/PathProfiling.cpp =================================================================== --- lib/Transforms/Instrumentation/PathProfiling.cpp (revision 167748) +++ lib/Transforms/Instrumentation/PathProfiling.cpp (working copy) @@ -273,9 +273,11 @@ Constant* llvmIncrementHashFunction; Constant* llvmDecrementHashFunction; + bool doInitialization(void) { return false; } // Instruments each function with path profiling. 'main' is instrumented // with code to save the profile to disk. bool runOnModule(Module &M); + bool doFinalization(void) { return false; } // Analyzes the function for Ball-Larus path profiling, and inserts code. void runOnFunction(std::vector &ftInit, Function &F, Module &M); Index: lib/Transforms/Instrumentation/GCOVProfiling.cpp =================================================================== --- lib/Transforms/Instrumentation/GCOVProfiling.cpp (revision 167748) +++ lib/Transforms/Instrumentation/GCOVProfiling.cpp (working copy) @@ -59,7 +59,9 @@ return "GCOV Profiler"; } private: + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } // Create the GCNO files for the Module based on DebugInfo. void emitGCNO(); Index: lib/Transforms/Instrumentation/EdgeProfiling.cpp =================================================================== --- lib/Transforms/Instrumentation/EdgeProfiling.cpp (revision 167748) +++ lib/Transforms/Instrumentation/EdgeProfiling.cpp (working copy) @@ -32,7 +32,9 @@ namespace { class EdgeProfiler : public ModulePass { + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } public: static char ID; // Pass identification, replacement for typeid EdgeProfiler() : ModulePass(ID) { Index: lib/Transforms/Scalar/ObjCARC.cpp =================================================================== --- lib/Transforms/Scalar/ObjCARC.cpp (revision 167748) +++ lib/Transforms/Scalar/ObjCARC.cpp (working copy) @@ -919,7 +919,9 @@ /// ObjCARCAPElim - Autorelease pool elimination. class ObjCARCAPElim : public ModulePass { virtual void getAnalysisUsage(AnalysisUsage &AU) const; + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } static bool MayAutorelease(ImmutableCallSite CS, unsigned Depth = 0); static bool OptimizeBB(BasicBlock *BB); Index: lib/Transforms/Scalar/SCCP.cpp =================================================================== --- lib/Transforms/Scalar/SCCP.cpp (revision 167748) +++ lib/Transforms/Scalar/SCCP.cpp (working copy) @@ -1645,7 +1645,9 @@ IPSCCP() : ModulePass(ID) { initializeIPSCCPPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } }; } // end anonymous namespace Index: lib/Transforms/IPO/LoopExtractor.cpp =================================================================== --- lib/Transforms/IPO/LoopExtractor.cpp (revision 167748) +++ lib/Transforms/IPO/LoopExtractor.cpp (working copy) @@ -177,7 +177,9 @@ LoadFile(BlockFile.c_str()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } }; } Index: lib/Transforms/IPO/ExtractGV.cpp =================================================================== --- lib/Transforms/IPO/ExtractGV.cpp (revision 167748) +++ lib/Transforms/IPO/ExtractGV.cpp (working copy) @@ -36,6 +36,7 @@ explicit GVExtractorPass(std::vector& GVs, bool deleteS = true) : ModulePass(ID), Named(GVs.begin(), GVs.end()), deleteStuff(deleteS) {} + bool doInitialization(void) { return false; } bool runOnModule(Module &M) { // Visit the global inline asm. if (!deleteStuff) @@ -124,6 +125,7 @@ return true; } + bool doFinalization(void) { return false; } }; char GVExtractorPass::ID = 0; Index: lib/Transforms/IPO/ConstantMerge.cpp =================================================================== --- lib/Transforms/IPO/ConstantMerge.cpp (revision 167748) +++ lib/Transforms/IPO/ConstantMerge.cpp (working copy) @@ -39,9 +39,11 @@ initializeConstantMergePass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } // For this pass, process all of the globals in the module, eliminating // duplicate constants. bool runOnModule(Module &M); + bool doFinalization(void) { return false; } // Return true iff we can determine the alignment of this global variable. bool hasKnownAlignment(GlobalVariable *GV) const; Index: lib/Transforms/IPO/BarrierNoopPass.cpp =================================================================== --- lib/Transforms/IPO/BarrierNoopPass.cpp (revision 167748) +++ lib/Transforms/IPO/BarrierNoopPass.cpp (working copy) @@ -36,7 +36,9 @@ initializeBarrierNoopPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M) { return false; } + bool doFinalization(void) { return false; } }; } Index: lib/Transforms/IPO/StripSymbols.cpp =================================================================== --- lib/Transforms/IPO/StripSymbols.cpp (revision 167748) +++ lib/Transforms/IPO/StripSymbols.cpp (working copy) @@ -44,7 +44,9 @@ initializeStripSymbolsPass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); @@ -59,7 +61,9 @@ initializeStripNonDebugSymbolsPass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); @@ -74,7 +78,9 @@ initializeStripDebugDeclarePass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); @@ -89,7 +95,9 @@ initializeStripDeadDebugInfoPass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); Index: lib/Transforms/IPO/GlobalDCE.cpp =================================================================== --- lib/Transforms/IPO/GlobalDCE.cpp (revision 167748) +++ lib/Transforms/IPO/GlobalDCE.cpp (working copy) @@ -35,10 +35,12 @@ initializeGlobalDCEPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } // run - Do the GlobalDCE pass on the specified module, optionally updating // the specified callgraph to reflect the changes. // bool runOnModule(Module &M); + bool doFinalization(void) { return false; } private: SmallPtrSet AliveGlobals; Index: lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- lib/Transforms/IPO/GlobalOpt.cpp (revision 167748) +++ lib/Transforms/IPO/GlobalOpt.cpp (working copy) @@ -69,7 +69,9 @@ initializeGlobalOptPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } private: GlobalVariable *FindGlobalCtors(Module &M); Index: lib/Transforms/IPO/Internalize.cpp =================================================================== --- lib/Transforms/IPO/Internalize.cpp (revision 167748) +++ lib/Transforms/IPO/Internalize.cpp (working copy) @@ -50,7 +50,9 @@ explicit InternalizePass(); explicit InternalizePass(const std::vector & exportList); void LoadFile(const char *Filename); + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesCFG(); Index: lib/Transforms/IPO/PartialInlining.cpp =================================================================== --- lib/Transforms/IPO/PartialInlining.cpp (revision 167748) +++ lib/Transforms/IPO/PartialInlining.cpp (working copy) @@ -33,8 +33,10 @@ PartialInliner() : ModulePass(ID) { initializePartialInlinerPass(*PassRegistry::getPassRegistry()); } - + + bool doInitialization(void) { return false; } bool runOnModule(Module& M); + bool doFinalization(void) { return false; } private: Function* unswitchFunction(Function* F); Index: lib/Transforms/IPO/IPConstantPropagation.cpp =================================================================== --- lib/Transforms/IPO/IPConstantPropagation.cpp (revision 167748) +++ lib/Transforms/IPO/IPConstantPropagation.cpp (working copy) @@ -39,7 +39,9 @@ initializeIPCPPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } private: bool PropagateConstantsIntoArguments(Function &F); bool PropagateConstantReturn(Function &F); Index: lib/Transforms/IPO/MergeFunctions.cpp =================================================================== --- lib/Transforms/IPO/MergeFunctions.cpp (revision 167748) +++ lib/Transforms/IPO/MergeFunctions.cpp (working copy) @@ -547,7 +547,9 @@ initializeMergeFunctionsPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } private: typedef DenseSet FnSetType; Index: lib/Transforms/IPO/StripDeadPrototypes.cpp =================================================================== --- lib/Transforms/IPO/StripDeadPrototypes.cpp (revision 167748) +++ lib/Transforms/IPO/StripDeadPrototypes.cpp (working copy) @@ -32,7 +32,9 @@ StripDeadPrototypesPass() : ModulePass(ID) { initializeStripDeadPrototypesPassPass(*PassRegistry::getPassRegistry()); } + virtual bool doInitialization(void) { return false; } virtual bool runOnModule(Module &M); + virtual bool doFinalization(void) { return false; } }; } // end anonymous namespace Index: lib/Transforms/IPO/DeadArgumentElimination.cpp =================================================================== --- lib/Transforms/IPO/DeadArgumentElimination.cpp (revision 167748) +++ lib/Transforms/IPO/DeadArgumentElimination.cpp (working copy) @@ -143,7 +143,9 @@ initializeDAEPass(*PassRegistry::getPassRegistry()); } + bool doInitialization(void) { return false; } bool runOnModule(Module &M); + bool doFinalization(void) { return false; } virtual bool ShouldHackArguments() const { return false; } Index: lib/Bitcode/Writer/BitcodeWriterPass.cpp =================================================================== --- lib/Bitcode/Writer/BitcodeWriterPass.cpp (revision 167748) +++ lib/Bitcode/Writer/BitcodeWriterPass.cpp (working copy) @@ -24,11 +24,13 @@ : ModulePass(ID), OS(o) {} const char *getPassName() const { return "Bitcode Writer"; } - + + bool doInitialization(void) { return false; } bool runOnModule(Module &M) { WriteBitcodeToFile(&M, OS); return false; } + bool doFinalization(void) { return false; } }; }