1 //===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // 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 {
36 virtual void anchor();
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 setDefault(StringRef Name);
103 void setListener(MachinePassRegistryListener *L) { Listener = L; }
105 /// Add - Adds a function pass to the registration list.
107 void Add(MachinePassRegistryNode *Node);
109 /// Remove - Removes a function pass from the registration list.
111 void Remove(MachinePassRegistryNode *Node);
116 //===----------------------------------------------------------------------===//
118 /// RegisterPassParser class - Handle the addition of new machine passes.
120 //===----------------------------------------------------------------------===//
121 template<class RegistryClass>
122 class RegisterPassParser : public MachinePassRegistryListener,
123 public cl::parser<typename RegistryClass::FunctionPassCtor> {
125 RegisterPassParser() {}
126 ~RegisterPassParser() { RegistryClass::setListener(NULL); }
128 void initialize(cl::Option &O) {
129 cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O);
131 // Add existing passes to option.
132 for (RegistryClass *Node = RegistryClass::getList();
133 Node; Node = Node->getNext()) {
134 this->addLiteralOption(Node->getName(),
135 (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
136 Node->getDescription());
139 // Make sure we listen for list changes.
140 RegistryClass::setListener(this);
143 // Implement the MachinePassRegistryListener callbacks.
145 virtual void NotifyAdd(const char *N,
148 this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
150 virtual void NotifyRemove(const char *N) {
151 this->removeLiteralOption(N);
156 } // end namespace llvm