aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2012-11-26 23:54:47 +0000
committerOwen Anderson <resistor@mac.com>2012-11-26 23:54:47 +0000
commit0d30d30d58253de6b8836a11effcfc38d7566841 (patch)
tree735048df468267d94355d52caf2c042ac4d575b2 /lib
parent8d20b5f9ff609e70fae5c865931ab0f29e639d9c (diff)
downloadexternal_llvm-0d30d30d58253de6b8836a11effcfc38d7566841.zip
external_llvm-0d30d30d58253de6b8836a11effcfc38d7566841.tar.gz
external_llvm-0d30d30d58253de6b8836a11effcfc38d7566841.tar.bz2
Step towards implementation of pass manager with doInitialization and doFinalization per module detangled from runOn?? calls, still has temporary code not to break ASAN to be removed when that pass conforms to the proposed model
Patch by Pedro Artigas, with feedback from by Chandler Carruth. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168635 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/VMCore/PassManager.cpp79
1 files changed, 24 insertions, 55 deletions
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
index 3a8a9e2..4e2d5fa 100644
--- a/lib/VMCore/PassManager.cpp
+++ b/lib/VMCore/PassManager.cpp
@@ -1528,11 +1528,13 @@ bool FPPassManager::runOnFunction(Function &F) {
}
bool FPPassManager::runOnModule(Module &M) {
- bool Changed = doInitialization(M);
+ bool Changed = false;
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;
}
@@ -1542,14 +1544,25 @@ bool FPPassManager::doInitialization(Module &M) {
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;
}
@@ -1572,6 +1585,10 @@ MPPassManager::runOnModule(Module &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) {
ModulePass *MP = getContainedPass(Index);
bool LocalChanged = false;
@@ -1600,6 +1617,10 @@ MPPassManager::runOnModule(Module &M) {
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();
@@ -1610,29 +1631,7 @@ MPPassManager::runOnModule(Module &M) {
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;
}
@@ -1692,24 +1691,6 @@ Pass* MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F){
//===----------------------------------------------------------------------===//
// 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.
@@ -1754,18 +1735,6 @@ 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