PassManager.cpp revision 92c45eebf77de5d6ee84a3f18f560b83cb68e720
1//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the LLVM Pass Manager infrastructure.
11//
12//===----------------------------------------------------------------------===//
13
14
15#include "llvm/PassManager.h"
16#include "llvm/Function.h"
17#include "llvm/Module.h"
18
19using namespace llvm;
20
21/// BasicBlockPassManager implementation
22
23/// Add pass P into PassVector and return TRUE. If this pass is not
24/// manageable by this manager then return FALSE.
25bool
26BasicBlockPassManager_New::addPass (Pass *P) {
27
28  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
29  if (!BP)
30    return false;
31
32  // TODO: Check if it suitable to manage P using this BasicBlockPassManager
33  // or we need another instance of BasicBlockPassManager
34
35  // Add pass
36  PassVector.push_back(BP);
37  return true;
38}
39
40/// Execute all of the passes scheduled for execution by invoking
41/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
42/// the function, and if so, return true.
43bool
44BasicBlockPassManager_New::runOnFunction(Function &F) {
45
46  bool Changed = false;
47  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
48    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
49           e = PassVector.end(); itr != e; ++itr) {
50      Pass *P = *itr;
51      BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
52      Changed |= BP->runOnBasicBlock(*I);
53    }
54  return Changed;
55}
56
57// FunctionPassManager_New implementation
58
59///////////////////////////////////////////////////////////////////////////////
60// FunctionPassManager
61
62/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
63/// either use it into active basic block pass manager or create new basic
64/// block pass manager to handle pass P.
65bool
66FunctionPassManager_New::addPass (Pass *P) {
67
68  // If P is a BasicBlockPass then use BasicBlockPassManager_New.
69  if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
70
71    if (!activeBBPassManager
72        || !activeBBPassManager->addPass(BP)) {
73
74      activeBBPassManager = new BasicBlockPassManager_New();
75
76      PassVector.push_back(activeBBPassManager);
77      assert (!activeBBPassManager->addPass(BP) &&
78              "Unable to add Pass");
79    }
80    return true;
81  }
82
83  FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
84  if (!FP)
85    return false;
86
87  // TODO: Check if it suitable to manage P using this FunctionPassManager
88  // or we need another instance of FunctionPassManager
89
90  PassVector.push_back(FP);
91  activeBBPassManager = NULL;
92  return true;
93}
94
95/// Execute all of the passes scheduled for execution by invoking
96/// runOnFunction method.  Keep track of whether any of the passes modifies
97/// the function, and if so, return true.
98bool
99FunctionPassManager_New::runOnModule(Module &M) {
100
101  bool Changed = false;
102  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
103    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
104           e = PassVector.end(); itr != e; ++itr) {
105      Pass *P = *itr;
106      FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
107      Changed |= FP->runOnFunction(*I);
108    }
109  return Changed;
110}
111
112
113// ModulePassManager implementation
114
115/// Add P into pass vector if it is manageble. If P is a FunctionPass
116/// then use FunctionPassManager_New to manage it. Return FALSE if P
117/// is not manageable by this manager.
118bool
119ModulePassManager_New::addPass (Pass *P) {
120
121  // If P is FunctionPass then use function pass maanager.
122  if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
123
124    activeFunctionPassManager = NULL;
125
126    if (!activeFunctionPassManager
127        || !activeFunctionPassManager->addPass(P)) {
128
129      activeFunctionPassManager = new FunctionPassManager_New();
130
131      PassVector.push_back(activeFunctionPassManager);
132      assert (!activeFunctionPassManager->addPass(FP) &&
133              "Unable to add Pass");
134    }
135    return true;
136  }
137
138  ModulePass *MP = dynamic_cast<ModulePass *>(P);
139  if (!MP)
140    return false;
141
142  // TODO: Check if it suitable to manage P using this ModulePassManager
143  // or we need another instance of ModulePassManager
144
145  PassVector.push_back(MP);
146  activeFunctionPassManager = NULL;
147  return true;
148}
149
150
151/// Execute all of the passes scheduled for execution by invoking
152/// runOnModule method.  Keep track of whether any of the passes modifies
153/// the module, and if so, return true.
154bool
155ModulePassManager_New::runOnModule(Module &M) {
156  bool Changed = false;
157  for (std::vector<Pass *>::iterator itr = PassVector.begin(),
158         e = PassVector.end(); itr != e; ++itr) {
159    Pass *P = *itr;
160    ModulePass *MP = dynamic_cast<ModulePass*>(P);
161    Changed |= MP->runOnModule(M);
162  }
163  return Changed;
164}
165
166