1 //===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
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.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
11 #define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
13 #include "llvm/CodeGen/Passes.h"
14 #include "llvm/CodeGen/ScheduleDAG.h"
15 #include "llvm/Support/CommandLine.h"
22 //===----------------------------------------------------------------------===//
24 /// MachinePassRegistryListener - Listener to adds and removals of nodes in
25 /// registration list.
27 //===----------------------------------------------------------------------===//
28 class MachinePassRegistryListener {
30 MachinePassRegistryListener() {}
31 virtual ~MachinePassRegistryListener() {}
32 virtual void NotifyAdd(const char *N, const char *D) = 0;
33 virtual void NotifyRemove(const char *N, const char *D) = 0;
37 //===----------------------------------------------------------------------===//
39 /// MachinePassRegistryNode - Machine pass node stored in registration list.
41 //===----------------------------------------------------------------------===//
42 template<typename FunctionPassCtor>
43 class MachinePassRegistryNode {
47 MachinePassRegistryNode<FunctionPassCtor> *Next;// Next function pass in list.
48 const char *Name; // Name of function pass.
49 const char *Description; // Description string.
50 FunctionPassCtor Ctor; // Function pass creator.
54 MachinePassRegistryNode(const char *N, const char *D, FunctionPassCtor C)
62 MachinePassRegistryNode<FunctionPassCtor> *getNext()
63 const { return Next; }
64 MachinePassRegistryNode<FunctionPassCtor> **getNextAddress()
66 const char *getName() const { return Name; }
67 const char *getDescription() const { return Description; }
68 FunctionPassCtor getCtor() const { return Ctor; }
69 void setNext(MachinePassRegistryNode<FunctionPassCtor> *N) { Next = N; }
74 //===----------------------------------------------------------------------===//
76 /// MachinePassRegistry - Track the registration of machine passes.
78 //===----------------------------------------------------------------------===//
79 template<typename FunctionPassCtor>
80 class MachinePassRegistry {
84 MachinePassRegistryNode<FunctionPassCtor> *List;
85 // List of registry nodes.
86 FunctionPassCtor Cache; // Cached function pass creator.
87 MachinePassRegistryListener* Listener;// Listener for list adds are removes.
91 // NO CONSTRUCTOR - we don't want static constructor ordering to mess
96 MachinePassRegistryNode<FunctionPassCtor> *getList() { return List; }
97 FunctionPassCtor getCache() { return Cache; }
98 void setCache(FunctionPassCtor C) { Cache = C; }
99 void setListener(MachinePassRegistryListener *L) { Listener = L; }
101 /// Add - Adds a function pass to the registration list.
103 void Add(MachinePassRegistryNode<FunctionPassCtor> *Node) {
106 if (Listener) Listener->NotifyAdd(Node->getName(), Node->getDescription());
110 /// Remove - Removes a function pass from the registration list.
112 void Remove(MachinePassRegistryNode<FunctionPassCtor> *Node) {
113 for (MachinePassRegistryNode<FunctionPassCtor> **I = &List;
114 *I; I = (*I)->getNextAddress()) {
116 #if 0 // FIXME: Command opt needs to call a termination routine.
117 if (Listener) Listener->NotifyRemove(Node->getName(),
118 Node->getDescription());
120 *I = (*I)->getNext();
127 /// FInd - Finds and returns a function pass in registration list, otherwise
129 MachinePassRegistryNode<FunctionPassCtor> *Find(const char *Name) {
130 for (MachinePassRegistryNode<FunctionPassCtor> *I = List;
131 I; I = I->getNext()) {
132 if (std::string(Name) == std::string(I->getName())) return I;
141 //===----------------------------------------------------------------------===//
143 /// RegisterRegAlloc class - Track the registration of register allocators.
145 //===----------------------------------------------------------------------===//
146 class RegisterRegAlloc : public MachinePassRegistryNode<FunctionPass *(*)()> {
150 typedef FunctionPass *(*FunctionPassCtor)();
152 static MachinePassRegistry<FunctionPassCtor> Registry;
154 RegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C)
155 : MachinePassRegistryNode<FunctionPassCtor>(N, D, C)
156 { Registry.Add(this); }
157 ~RegisterRegAlloc() { Registry.Remove(this); }
162 RegisterRegAlloc *getNext() const {
163 return (RegisterRegAlloc *)
164 MachinePassRegistryNode<FunctionPassCtor>::getNext();
166 static RegisterRegAlloc *getList() {
167 return (RegisterRegAlloc *)Registry.getList();
169 static FunctionPassCtor getCache() {
170 return Registry.getCache();
172 static void setCache(FunctionPassCtor C) {
173 Registry.setCache(C);
175 static void setListener(MachinePassRegistryListener *L) {
176 Registry.setListener(L);
180 /// FirstCtor - Finds the first register allocator in registration
181 /// list and returns its creator function, otherwise return NULL.
182 static FunctionPassCtor FirstCtor() {
183 MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.getList();
184 return Node ? Node->getCtor() : NULL;
187 /// FindCtor - Finds a register allocator in registration list and returns
188 /// its creator function, otherwise return NULL.
189 static FunctionPassCtor FindCtor(const char *N) {
190 MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.Find(N);
191 return Node ? Node->getCtor() : NULL;
197 //===----------------------------------------------------------------------===//
199 /// RegisterScheduler class - Track the registration of instruction schedulers.
201 //===----------------------------------------------------------------------===//
205 class MachineBasicBlock;
207 class RegisterScheduler : public
208 MachinePassRegistryNode<ScheduleDAG *(*)(SelectionDAG*, MachineBasicBlock*)> {
212 typedef ScheduleDAG *(*FunctionPassCtor)(SelectionDAG*, MachineBasicBlock*);
214 static MachinePassRegistry<FunctionPassCtor> Registry;
216 RegisterScheduler(const char *N, const char *D, FunctionPassCtor C)
217 : MachinePassRegistryNode<FunctionPassCtor>(N, D, C)
218 { Registry.Add(this); }
219 ~RegisterScheduler() { Registry.Remove(this); }
224 RegisterScheduler *getNext() const {
225 return (RegisterScheduler *)
226 MachinePassRegistryNode<FunctionPassCtor>::getNext();
228 static RegisterScheduler *getList() {
229 return (RegisterScheduler *)Registry.getList();
231 static FunctionPassCtor getCache() {
232 return Registry.getCache();
234 static void setCache(FunctionPassCtor C) {
235 Registry.setCache(C);
237 static void setListener(MachinePassRegistryListener *L) {
238 Registry.setListener(L);
242 /// FirstCtor - Finds the first instruction scheduler in registration
243 /// list and returns its creator function, otherwise return NULL.
244 static FunctionPassCtor FirstCtor() {
245 MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.getList();
246 return Node ? Node->getCtor() : NULL;
250 /// FindCtor - Finds a instruction scheduler in registration list and returns
251 /// its creator function, otherwise return NULL.
252 static FunctionPassCtor FindCtor(const char *N) {
253 MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.Find(N);
254 return Node ? Node->getCtor() : NULL;
260 //===----------------------------------------------------------------------===//
262 /// RegisterPassParser class - Handle the addition of new machine passes.
264 //===----------------------------------------------------------------------===//
265 template<class RegistryClass>
266 class RegisterPassParser : public MachinePassRegistryListener,
267 public cl::parser<const char *> {
269 RegisterPassParser() {}
271 void initialize(cl::Option &O) {
272 cl::parser<const char *>::initialize(O);
274 // Add existing passes to option.
275 for (RegistryClass *Node = RegistryClass::getList();
276 Node; Node = Node->getNext()) {
277 addLiteralOption(Node->getName(), Node->getName(),
278 Node->getDescription());
281 // Make sure we listen for list changes.
282 RegistryClass::setListener(this);
285 // Implement the MachinePassRegistryListener callbacks.
287 virtual void NotifyAdd(const char *N, const char *D) {
288 addLiteralOption(N, N, D);
290 virtual void NotifyRemove(const char *N, const char *D) {
291 removeLiteralOption(N);
294 // ValLessThan - Provide a sorting comparator for Values elements...
295 typedef std::pair<const char*, std::pair<const char*, const char*> > ValType;
296 static bool ValLessThan(const ValType &VT1, const ValType &VT2) {
297 return std::string(VT1.first) < std::string(VT2.first);
300 // printOptionInfo - Print out information about this option. Override the
301 // default implementation to sort the table before we print...
302 virtual void printOptionInfo(const cl::Option &O, unsigned GlobalWidth) const{
303 RegisterPassParser *PNP = const_cast<RegisterPassParser*>(this);
304 std::sort(PNP->Values.begin(), PNP->Values.end(), ValLessThan);
305 cl::parser<const char *>::printOptionInfo(O, GlobalWidth);
310 } // end namespace llvm