}
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;
}
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;
}
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;
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();
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;
}
//===----------------------------------------------------------------------===//
// 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.
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