diff --git a/include/llvm/PassManager.h b/include/llvm/PassManager.h index f67d9da1a32a..5a313d5a6f1c 100644 --- a/include/llvm/PassManager.h +++ b/include/llvm/PassManager.h @@ -28,9 +28,33 @@ class PassManager { void add(Pass *P); /// run - Execute all of the passes scheduled for execution. Keep track of - /// whether any of the functions modifies the program, and if so, return true. + /// whether any of the passes modifies the module, and if so, return true. /// bool run(Module &M); }; +class FunctionPass; +class Function; + +class FunctionPassManager { + PassManagerT *PM; // This is a straightforward Pimpl class +public: + FunctionPassManager(); + ~FunctionPassManager(); + + /// add - Add a pass to the queue of passes to run. This passes + /// ownership of the FunctionPass to the PassManager. When the + /// PassManager is destroyed, the pass will be destroyed as well, so + /// there is no need to delete the pass. This implies that all + /// passes MUST be allocated with 'new'. + /// + void add(FunctionPass *P); + + /// run - Execute all of the passes scheduled for execution. Keep + /// track of whether any of the passes modifies the function, and if + /// so, return true. + /// + bool run(Function &M); +}; + #endif diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index ec193debfa42..6535d104677b 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -70,6 +70,16 @@ PassManager::~PassManager() { delete PM; } void PassManager::add(Pass *P) { PM->add(P); } bool PassManager::run(Module &M) { return PM->run(M); } +//===----------------------------------------------------------------------===// +// FunctionPassManager implementation - The FunctionPassManager class +// is a simple Pimpl class that wraps the PassManagerT template. It +// is like PassManager, but only deals in FunctionPasses. +// +FunctionPassManager::FunctionPassManager() : PM(new PassManagerT()) {} +FunctionPassManager::~FunctionPassManager() { delete PM; } +void FunctionPassManager::add(FunctionPass *P) { PM->add(P); } +bool FunctionPassManager::run(Function &F) { return PM->run(F); } + //===----------------------------------------------------------------------===// // TimingInfo Class - This class is used to calculate information about the