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/CodeGen/ScheduleDAG.h"
23 #include "llvm/Support/CommandLine.h"
27 typedef void *(*MachinePassCtor)();
30 //===----------------------------------------------------------------------===//
32 /// MachinePassRegistryListener - Listener to adds and removals of nodes in
33 /// registration list.
35 //===----------------------------------------------------------------------===//
36 class MachinePassRegistryListener {
38 MachinePassRegistryListener() {}
39 virtual ~MachinePassRegistryListener() {}
40 virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0;
41 virtual void NotifyRemove(const char *N) = 0;
45 //===----------------------------------------------------------------------===//
47 /// MachinePassRegistryNode - Machine pass node stored in registration list.
49 //===----------------------------------------------------------------------===//
50 class MachinePassRegistryNode {
54 MachinePassRegistryNode *Next; // Next function pass in list.
55 const char *Name; // Name of function pass.
56 const char *Description; // Description string.
57 MachinePassCtor Ctor; // Function pass creator.
61 MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
69 MachinePassRegistryNode *getNext() const { return Next; }
70 MachinePassRegistryNode **getNextAddress() { return &Next; }
71 const char *getName() const { return Name; }
72 const char *getDescription() const { return Description; }
73 MachinePassCtor getCtor() const { return Ctor; }
74 void setNext(MachinePassRegistryNode *N) { Next = N; }
79 //===----------------------------------------------------------------------===//
81 /// MachinePassRegistry - Track the registration of machine passes.
83 //===----------------------------------------------------------------------===//
84 class MachinePassRegistry {
88 MachinePassRegistryNode *List; // List of registry nodes.
89 MachinePassCtor Default; // Default function pass creator.
90 MachinePassRegistryListener* Listener;// Listener for list adds are removes.
94 // NO CONSTRUCTOR - we don't want static constructor ordering to mess
99 MachinePassRegistryNode *getList() { return List; }
100 MachinePassCtor getDefault() { return Default; }
101 void setDefault(MachinePassCtor C) { Default = C; }
102 void setListener(MachinePassRegistryListener *L) { Listener = L; }
104 /// Add - Adds a function pass to the registration list.
106 void Add(MachinePassRegistryNode *Node);
108 /// Remove - Removes a function pass from the registration list.
110 void Remove(MachinePassRegistryNode *Node);
115 //===----------------------------------------------------------------------===//
117 /// RegisterPassParser class - Handle the addition of new machine passes.
119 //===----------------------------------------------------------------------===//
120 template<class RegistryClass>
121 class RegisterPassParser : public MachinePassRegistryListener,
122 public cl::parser<typename RegistryClass::FunctionPassCtor> {
124 RegisterPassParser() {}
125 ~RegisterPassParser() { RegistryClass::setListener(NULL); }
127 void initialize(cl::Option &O) {
128 cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O);
130 // Add existing passes to option.
131 for (RegistryClass *Node = RegistryClass::getList();
132 Node; Node = Node->getNext()) {
133 addLiteralOption(Node->getName(),
134 (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
135 Node->getDescription());
138 // Make sure we listen for list changes.
139 RegistryClass::setListener(this);
142 // Implement the MachinePassRegistryListener callbacks.
144 virtual void NotifyAdd(const char *N,
147 this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
149 virtual void NotifyRemove(const char *N) {
150 this->removeLiteralOption(N);
155 } // end namespace llvm