Skip to content

Commit

Permalink
Add doInitialization and doFinalization methods to ModulePass's, to a…
Browse files Browse the repository at this point in the history
…llow 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
  • Loading branch information
resistor committed Nov 15, 2012
1 parent 3427f0a commit 40b6fdb
Show file tree
Hide file tree
Showing 12 changed files with 117 additions and 0 deletions.
10 changes: 10 additions & 0 deletions include/llvm/Pass.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,10 +227,20 @@ class ModulePass : public Pass {
/// 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);

Expand Down
8 changes: 8 additions & 0 deletions include/llvm/PassManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ class PassManager : public PassManagerBase {
/// 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
Expand Down
10 changes: 10 additions & 0 deletions include/llvm/PassManagers.h
Original file line number Diff line number Diff line change
Expand Up @@ -420,10 +420,20 @@ class FPPassManager : public ModulePass, public PMDataManager {
/// 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);
Expand Down
3 changes: 3 additions & 0 deletions lib/Analysis/IPA/CallGraphSCCPass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ class CGPassManager : public ModulePass, public PMDataManager {
/// 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);

Expand Down
70 changes: 70 additions & 0 deletions lib/VMCore/PassManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,14 @@ class MPPassManager : public Pass, public PMDataManager {
/// 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();
Expand Down Expand Up @@ -394,6 +402,14 @@ class PassManagerImpl : public Pass,
/// 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();
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions tools/bugpoint/CrashDebugger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
2 changes: 2 additions & 0 deletions tools/llc/llc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions tools/llvm-extract/llvm-extract.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions tools/llvm-prof/llvm-prof.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
2 changes: 2 additions & 0 deletions tools/llvm-stress/llvm-stress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions tools/lto/LTOCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,9 @@ void LTOCodeGenerator::applyScopeRestrictions() {
passes.add(createInternalizePass(mustPreserveList));

// apply scope restrictions
passes.doInitialization();
passes.run(*mergedModule);
passes.doFinalization();

_scopeRestrictionsDone = true;
}
Expand Down Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions tools/opt/opt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 40b6fdb

Please sign in to comment.