mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
Add doInitialization and doFinalization methods to ModulePass's, to allow them to be re-initialized and reused on multiple Module's.
Patch by Pedro Artigas. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168008 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3427f0aa7c
commit
40b6fdb81e
@ -227,10 +227,20 @@ public:
|
||||
/// 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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -420,10 +420,20 @@ public:
|
||||
/// cleanup - After running all passes, clean up pass manager cache.
|
||||
void cleanup();
|
||||
|
||||
/// doInitialization - Overrides ModulePass doInitialization for global
|
||||
/// initialization tasks
|
||||
///
|
||||
using ModulePass::doInitialization;
|
||||
|
||||
/// 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;
|
||||
|
||||
/// doFinalization - Run all of the finalizers for the function passes.
|
||||
///
|
||||
bool doFinalization(Module &M);
|
||||
|
@ -51,6 +51,9 @@ public:
|
||||
/// whether any of the passes modifies the module, and if so, return true.
|
||||
bool runOnModule(Module &M);
|
||||
|
||||
using ModulePass::doInitialization;
|
||||
using ModulePass::doFinalization;
|
||||
|
||||
bool doInitialization(CallGraph &CG);
|
||||
bool doFinalization(CallGraph &CG);
|
||||
|
||||
|
@ -309,6 +309,14 @@ public:
|
||||
/// whether any of the passes modifies the module, and if so, return true.
|
||||
bool runOnModule(Module &M);
|
||||
|
||||
/// doInitialization - Run all of the initializers for the module passes.
|
||||
///
|
||||
bool doInitialization(void);
|
||||
|
||||
/// doFinalization - Run all of the finalizers for the module passes.
|
||||
///
|
||||
bool doFinalization(void);
|
||||
|
||||
/// Pass Manager itself does not invalidate any analysis info.
|
||||
void getAnalysisUsage(AnalysisUsage &Info) const {
|
||||
Info.setPreservesAll();
|
||||
@ -394,6 +402,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(void);
|
||||
|
||||
/// doFinalization - Run all of the finalizers for the module passes.
|
||||
///
|
||||
bool doFinalization(void);
|
||||
|
||||
/// Pass Manager itself does not invalidate any analysis info.
|
||||
void getAnalysisUsage(AnalysisUsage &Info) const {
|
||||
Info.setPreservesAll();
|
||||
@ -1594,6 +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(void) {
|
||||
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(void) {
|
||||
bool Changed = false;
|
||||
|
||||
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
||||
Changed |= getContainedPass(Index)->doFinalization();
|
||||
|
||||
return Changed;
|
||||
}
|
||||
|
||||
@ -1640,6 +1679,25 @@ Pass* MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F){
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// PassManagerImpl implementation
|
||||
|
||||
bool PassManagerImpl::doInitialization(void) {
|
||||
bool Changed = false;
|
||||
|
||||
for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index)
|
||||
Changed |= getContainedManager(Index)->doInitialization();
|
||||
|
||||
return Changed;
|
||||
}
|
||||
|
||||
bool PassManagerImpl::doFinalization(void) {
|
||||
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.
|
||||
@ -1684,6 +1742,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
|
||||
|
@ -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)) {
|
||||
|
@ -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.
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user