diff options
author | Chris Lattner <sabre@nondot.org> | 2002-01-31 00:40:44 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-01-31 00:40:44 +0000 |
commit | a4e4b23b6d778e546aa0dcd0ee95088ce7a96022 (patch) | |
tree | e3ba913c0c67ad052afb153c17c635168033195b /lib/VMCore | |
parent | bafff3380e2ea490979f3f349bbb086da9fc2e91 (diff) | |
download | external_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.h | 28 |
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) |