1 //===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the James M. Laskey and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the mechanics for machine function pass registries. A
11 // function pass registry (MachinePassRegistry) is auto filled by the static
12 // constructors of MachinePassRegistryNode. Further there is a command line
13 // parser (RegisterPassParser) which listens to each registry for additions
14 // and deletions, so that the appropriate command option is updated.
16 //===----------------------------------------------------------------------===//
18 #ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
19 #define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
21 #include "llvm/CodeGen/Passes.h"
22 #include "llvm/Support/CommandLine.h"
26 typedef void *(*MachinePassCtor)();
29 //===----------------------------------------------------------------------===//
31 /// MachinePassRegistryListener - Listener to adds and removals of nodes in
32 /// registration list.
34 //===----------------------------------------------------------------------===//
35 class MachinePassRegistryListener {
37 MachinePassRegistryListener() {}
38 virtual ~MachinePassRegistryListener() {}
39 virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0;
40 virtual void NotifyRemove(const char *N) = 0;
44 //===----------------------------------------------------------------------===//
46 /// MachinePassRegistryNode - Machine pass node stored in registration list.
48 //===----------------------------------------------------------------------===//
49 class MachinePassRegistryNode {
53 MachinePassRegistryNode *Next; // Next function pass in list.
54 const char *Name; // Name of function pass.
55 const char *Description; // Description string.
56 MachinePassCtor Ctor; // Function pass creator.
60 MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
68 MachinePassRegistryNode *getNext() const { return Next; }
69 MachinePassRegistryNode **getNextAddress() { return &Next; }
70 const char *getName() const { return Name; }
71 const char *getDescription() const { return Description; }
72 MachinePassCtor getCtor() const { return Ctor; }
73 void setNext(MachinePassRegistryNode *N) { Next = N; }
78 //===----------------------------------------------------------------------===//
80 /// MachinePassRegistry - Track the registration of machine passes.
82 //===----------------------------------------------------------------------===//
83 class MachinePassRegistry {
87 MachinePassRegistryNode *List; // List of registry nodes.
88 MachinePassCtor Default; // Default function pass creator.
89 MachinePassRegistryListener* Listener;// Listener for list adds are removes.
93 // NO CONSTRUCTOR - we don't want static constructor ordering to mess
98 MachinePassRegistryNode *getList() { return List; }
99 MachinePassCtor getDefault() { return Default; }
100 void setDefault(MachinePassCtor C) { Default = C; }
101 void setListener(MachinePassRegistryListener *L) { Listener = L; }
103 /// Add - Adds a function pass to the registration list.
105 void Add(MachinePassRegistryNode *Node);
107 /// Remove - Removes a function pass from the registration list.
109 void Remove(MachinePassRegistryNode *Node);
114 //===----------------------------------------------------------------------===//
116 /// RegisterPassParser class - Handle the addition of new machine passes.
118 //===----------------------------------------------------------------------===//
119 template<class RegistryClass>
120 class RegisterPassParser : public MachinePassRegistryListener,
121 public cl::parser<typename RegistryClass::FunctionPassCtor> {
123 RegisterPassParser() {}
124 ~RegisterPassParser() { RegistryClass::setListener(NULL); }
126 void initialize(cl::Option &O) {
127 cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O);
129 // Add existing passes to option.
130 for (RegistryClass *Node = RegistryClass::getList();
131 Node; Node = Node->getNext()) {
132 addLiteralOption(Node->getName(),
133 (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
134 Node->getDescription());
137 // Make sure we listen for list changes.
138 RegistryClass::setListener(this);
141 // Implement the MachinePassRegistryListener callbacks.
143 virtual void NotifyAdd(const char *N,
146 this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
148 virtual void NotifyRemove(const char *N) {
149 this->removeLiteralOption(N);
154 } // end namespace llvm