aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-01-31 00:40:44 +0000
committerChris Lattner <sabre@nondot.org>2002-01-31 00:40:44 +0000
commita4e4b23b6d778e546aa0dcd0ee95088ce7a96022 (patch)
treee3ba913c0c67ad052afb153c17c635168033195b /lib/VMCore
parentbafff3380e2ea490979f3f349bbb086da9fc2e91 (diff)
downloadexternal_llvm-a4e4b23b6d778e546aa0dcd0ee95088ce7a96022.zip
external_llvm-a4e4b23b6d778e546aa0dcd0ee95088ce7a96022.tar.gz
external_llvm-a4e4b23b6d778e546aa0dcd0ee95088ce7a96022.tar.bz2
Fix bug where we didn't initialize and finalize basic block passes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1599 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r--lib/VMCore/PassManagerT.h28
1 files changed, 22 insertions, 6 deletions
diff --git a/lib/VMCore/PassManagerT.h b/lib/VMCore/PassManagerT.h
index 07bf738..70f2cde 100644
--- a/lib/VMCore/PassManagerT.h
+++ b/lib/VMCore/PassManagerT.h
@@ -150,7 +150,7 @@ public:
for (std::vector<AnalysisID>::iterator I = Required.begin(),
E = Required.end(); I != E; ++I) {
if (getAnalysisOrNullDown(*I) == 0)
- add(I->createPass());
+ add((PassClass*)I->createPass());
}
// Tell the pass to add itself to this PassManager... the way it does so
@@ -282,14 +282,19 @@ template<> struct PassManagerTraits<BasicBlock> : public BasicBlockPass {
// ParentClass - The type of the parent PassManager...
typedef PassManagerT<Method> ParentClass;
+ // PMType - The type of the passmanager that subclasses this class
+ typedef PassManagerT<BasicBlock> PMType;
+
// runPass - Specify how the pass should be run on the UnitType
static bool runPass(PassClass *P, BasicBlock *M) {
// todo, init and finalize
return P->runOnBasicBlock(M);
}
- // run - Implement the Pass interface...
+ // Implement the BasicBlockPass interface...
+ virtual bool doInitialization(Module *M);
virtual bool runOnBasicBlock(BasicBlock *BB);
+ virtual bool doFinalization(Module *M);
};
@@ -364,8 +369,22 @@ template<> struct PassManagerTraits<Module> : public Pass {
// PassManagerTraits<BasicBlock> Implementations
//
+inline bool PassManagerTraits<BasicBlock>::doInitialization(Module *M) {
+ bool Changed = false;
+ for (unsigned i = 0, e = ((PMType*)this)->Passes.size(); i != e; ++i)
+ ((PMType*)this)->Passes[i]->doInitialization(M);
+ return Changed;
+}
+
inline bool PassManagerTraits<BasicBlock>::runOnBasicBlock(BasicBlock *BB) {
- return ((PassManagerT<BasicBlock>*)this)->runOnUnit(BB);
+ return ((PMType*)this)->runOnUnit(BB);
+}
+
+inline bool PassManagerTraits<BasicBlock>::doFinalization(Module *M) {
+ bool Changed = false;
+ for (unsigned i = 0, e = ((PMType*)this)->Passes.size(); i != e; ++i)
+ ((PMType*)this)->Passes[i]->doFinalization(M);
+ return Changed;
}
@@ -382,9 +401,6 @@ inline bool PassManagerTraits<Method>::runOnMethod(Method *M) {
return ((PMType*)this)->runOnUnit(M);
}
-
-// PassManagerTraits<Module> Implementations
-//
inline bool PassManagerTraits<Method>::doFinalization(Module *M) {
bool Changed = false;
for (unsigned i = 0, e = ((PMType*)this)->Passes.size(); i != e; ++i)