|
@@ -1528,13 +1528,11 @@ bool FPPassManager::runOnFunction(Function &F) {
|
|
}
|
|
}
|
|
|
|
|
|
bool FPPassManager::runOnModule(Module &M) {
|
|
bool FPPassManager::runOnModule(Module &M) {
|
|
- bool Changed = false;
|
|
|
|
|
|
+ bool Changed = doInitialization(M);
|
|
|
|
|
|
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
|
|
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
|
|
Changed |= runOnFunction(*I);
|
|
Changed |= runOnFunction(*I);
|
|
|
|
|
|
- // FIXME: doFinalization still needed here due to assumption in
|
|
|
|
- // AddressSanitizer
|
|
|
|
return doFinalization(M) || Changed;
|
|
return doFinalization(M) || Changed;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1544,25 +1542,14 @@ bool FPPassManager::doInitialization(Module &M) {
|
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
|
Changed |= getContainedPass(Index)->doInitialization(M);
|
|
Changed |= getContainedPass(Index)->doInitialization(M);
|
|
|
|
|
|
- // FIXME: mark Finalization as needed here due to assumption in
|
|
|
|
- // AddressSanitizer
|
|
|
|
- RunFinalization = true;
|
|
|
|
-
|
|
|
|
return Changed;
|
|
return Changed;
|
|
}
|
|
}
|
|
|
|
|
|
bool FPPassManager::doFinalization(Module &M) {
|
|
bool FPPassManager::doFinalization(Module &M) {
|
|
bool Changed = false;
|
|
bool Changed = false;
|
|
-
|
|
|
|
- // FIXME: due to limitation in AddressSanitizer
|
|
|
|
- if (!RunFinalization)
|
|
|
|
- return Changed;
|
|
|
|
-
|
|
|
|
|
|
+
|
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index)
|
|
Changed |= getContainedPass(Index)->doFinalization(M);
|
|
Changed |= getContainedPass(Index)->doFinalization(M);
|
|
-
|
|
|
|
- // FIXME: due to limitation in AddressSanitizer
|
|
|
|
- RunFinalization = false;
|
|
|
|
|
|
|
|
return Changed;
|
|
return Changed;
|
|
}
|
|
}
|
|
@@ -1585,10 +1572,6 @@ MPPassManager::runOnModule(Module &M) {
|
|
Changed |= FPP->doInitialization(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) {
|
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
|
|
ModulePass *MP = getContainedPass(Index);
|
|
ModulePass *MP = getContainedPass(Index);
|
|
bool LocalChanged = false;
|
|
bool LocalChanged = false;
|
|
@@ -1617,10 +1600,6 @@ MPPassManager::runOnModule(Module &M) {
|
|
removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG);
|
|
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
|
|
// Finalize on-the-fly passes
|
|
for (std::map<Pass *, FunctionPassManagerImpl *>::iterator
|
|
for (std::map<Pass *, FunctionPassManagerImpl *>::iterator
|
|
I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end();
|
|
I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end();
|
|
@@ -1631,7 +1610,29 @@ MPPassManager::runOnModule(Module &M) {
|
|
FPP->releaseMemoryOnTheFly();
|
|
FPP->releaseMemoryOnTheFly();
|
|
Changed |= FPP->doFinalization(M);
|
|
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;
|
|
return Changed;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1691,6 +1692,24 @@ Pass* MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F){
|
|
//===----------------------------------------------------------------------===//
|
|
//===----------------------------------------------------------------------===//
|
|
// PassManagerImpl implementation
|
|
// 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
|
|
/// 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.
|
|
/// 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);
|
|
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
|
|
// TimingInfo Class - This class is used to calculate information about the
|
|
// amount of time each pass takes to execute. This only happens with
|
|
// amount of time each pass takes to execute. This only happens with
|