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 doInitialization(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(BasicBlockPass *BBP) {
64 if (BBPBatcher == 0) {
65 BBPBatcher = new BasicBlockPassBatcher();
66 SubPasses.push_back(BBPBatcher);
71 void add(MethodPass *P) {
72 if (BasicBlockPass *BBP = dynamic_cast<BasicBlockPass*>(P)) {
75 BBPBatcher = 0; // Ensure that passes don't get accidentally reordered
76 SubPasses.push_back(P);
80 virtual bool run(Module *M) {
82 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
84 Changed |= (*I)->doInitialization(M);
86 for (Module::iterator MI = M->begin(), ME = M->end(); MI != ME; ++MI)
87 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
89 Changed |= (*I)->runOnMethod(*MI);
91 for (SubPassesType::iterator I = SubPasses.begin(), E = SubPasses.end();
93 Changed |= (*I)->doFinalization(M);
99 // add(BasicBlockPass*) - If we know it's a BasicBlockPass, we don't have to do
102 void PassManager::add(BasicBlockPass *BBP) {
103 if (Batcher == 0) // If we don't have a batcher yet, make one now.
104 add((MethodPass*)BBP);
110 // add(MethodPass*) - MethodPass's must be batched together... make sure this
113 void PassManager::add(MethodPass *MP) {
114 if (Batcher == 0) { // If we don't have a batcher yet, make one now.
115 Batcher = new MethodPassBatcher();
116 Passes.push_back(Batcher);
118 Batcher->add(MP); // The Batcher will queue them passes up
121 // add - Add a pass to the PassManager, batching it up as appropriate...
122 void PassManager::add(Pass *P) {
123 if (MethodPass *MP = dynamic_cast<MethodPass*>(P)) {
124 add(MP); // Use the methodpass specific code to do the addition
126 Batcher = 0; // Ensure that passes don't get accidentally reordered