1 //===- Pass.cpp - LLVM Pass Infrastructure Impementation ------------------===//
3 // This file implements the LLVM Pass infrastructure. It is primarily
4 // responsible with ensuring that passes are executed and batched together
7 //===----------------------------------------------------------------------===//
10 #include "Support/STLExtras.h"
12 PassManager::~PassManager() {
13 for_each(Passes.begin(), Passes.end(), deleter<Pass>);
16 class BasicBlockPassBatcher : public MethodPass {
17 typedef std::vector<BasicBlockPass*> SubPassesType;
18 SubPassesType SubPasses;
20 ~BasicBlockPassBatcher() {
21 for_each(SubPasses.begin(), SubPasses.end(), deleter<BasicBlockPass>);
24 void add(BasicBlockPass *P) { SubPasses.push_back(P); }
26 virtual bool doPassInitialization(Module *M) {
28 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
30 Changed |= (*I)->doInitialization(M);
34 virtual bool runOnMethod(Method *M) {
37 for (Method::iterator MI = M->begin(), ME = M->end(); MI != ME; ++MI)
38 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
40 Changed |= (*I)->runOnBasicBlock(*MI);
44 virtual bool doFinalization(Module *M) {
46 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
48 Changed |= (*I)->doFinalization(M);
54 class MethodPassBatcher : public Pass {
55 typedef std::vector<MethodPass*> SubPassesType;
56 SubPassesType SubPasses;
57 BasicBlockPassBatcher *BBPBatcher;
59 ~MethodPassBatcher() {
60 for_each(SubPasses.begin(), SubPasses.end(), deleter<MethodPass>);
63 void add(MethodPass *P) {
64 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P)) {
65 if (BBPBatcher == 0) {
66 BBPBatcher = new BasicBlockPassBatcher();
67 SubPasses.push_back(BBPBatcher);
71 BBPBatcher = 0; // Ensure that passes don't get accidentally reordered
72 SubPasses.push_back(P);
76 virtual bool run(Module *M) {
78 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
80 Changed |= (*I)->doInitialization(M);
82 for (Module::iterator MI = M->begin(), ME = M->end(); MI != ME; ++MI)
83 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
85 Changed |= (*I)->runOnMethod(*MI);
87 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
89 Changed |= (*I)->doFinalization(M);
98 // add(MethodPass*) - MethodPass's must be batched together... make sure this
101 void PassManager::add(MethodPass *MP) {
102 if (Batcher == 0) { // If we don't have a batcher yet, make one now.
103 Batcher = new MethodPassBatcher();
104 Passes.push_back(Batcher);
106 Batcher->add(MP); // The Batcher will queue them passes up
109 // add - Add a pass to the PassManager, batching it up as appropriate...
110 void PassManager::add(Pass *P) {
111 if (MethodPass *MP = dynamic_cast<MethodPass*>(P)) {
112 add(MP); // Use the methodpass specific code to do the addition
114 Batcher = 0; // Ensure that passes don't get accidentally reordered