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/ADT/StringRef.h"
22 #include "llvm/CodeGen/Passes.h"
23 #include "llvm/Support/CommandLine.h"
27 //===----------------------------------------------------------------------===//
29 /// MachinePassRegistryListener - Listener to adds and removals of nodes in
30 /// registration list.
32 //===----------------------------------------------------------------------===//
33 template <class PassCtorTy> class MachinePassRegistryListener {
34 virtual void anchor() {}
37 MachinePassRegistryListener() = default;
38 virtual ~MachinePassRegistryListener() = default;
40 virtual void NotifyAdd(StringRef N, PassCtorTy C, StringRef D) = 0;
41 virtual void NotifyRemove(StringRef N) = 0;
44 //===----------------------------------------------------------------------===//
46 /// MachinePassRegistryNode - Machine pass node stored in registration list.
48 //===----------------------------------------------------------------------===//
49 template <typename PassCtorTy> class MachinePassRegistryNode {
51 MachinePassRegistryNode *Next = nullptr; // Next function pass in list.
52 StringRef Name; // Name of function pass.
53 StringRef Description; // Description string.
54 PassCtorTy Ctor; // Pass creator.
57 MachinePassRegistryNode(const char *N, const char *D, PassCtorTy C)
58 : Name(N), Description(D), Ctor(C) {}
61 MachinePassRegistryNode *getNext() const { return Next; }
62 MachinePassRegistryNode **getNextAddress() { return &Next; }
63 StringRef getName() const { return Name; }
64 StringRef getDescription() const { return Description; }
65 PassCtorTy getCtor() const { return Ctor; }
66 void setNext(MachinePassRegistryNode *N) { Next = N; }
69 //===----------------------------------------------------------------------===//
71 /// MachinePassRegistry - Track the registration of machine passes.
73 //===----------------------------------------------------------------------===//
74 template <typename PassCtorTy> class MachinePassRegistry {
76 MachinePassRegistryNode<PassCtorTy> *List; // List of registry nodes.
77 PassCtorTy Default; // Default function pass creator.
78 MachinePassRegistryListener<PassCtorTy>
79 *Listener; // Listener for list adds are removes.
82 // NO CONSTRUCTOR - we don't want static constructor ordering to mess
87 MachinePassRegistryNode<PassCtorTy> *getList() { return List; }
88 PassCtorTy getDefault() { return Default; }
89 void setDefault(PassCtorTy C) { Default = C; }
90 /// setDefault - Set the default constructor by name.
91 void setDefault(StringRef Name) {
92 PassCtorTy Ctor = nullptr;
93 for (MachinePassRegistryNode<PassCtorTy> *R = getList(); R;
95 if (R->getName() == Name) {
100 assert(Ctor && "Unregistered pass name");
103 void setListener(MachinePassRegistryListener<PassCtorTy> *L) { Listener = L; }
105 /// Add - Adds a function pass to the registration list.
107 void Add(MachinePassRegistryNode<PassCtorTy> *Node) {
111 Listener->NotifyAdd(Node->getName(), Node->getCtor(),
112 Node->getDescription());
115 /// Remove - Removes a function pass from the registration list.
117 void Remove(MachinePassRegistryNode<PassCtorTy> *Node) {
118 for (MachinePassRegistryNode<PassCtorTy> **I = &List; *I;
119 I = (*I)->getNextAddress()) {
122 Listener->NotifyRemove(Node->getName());
123 *I = (*I)->getNext();
130 //===----------------------------------------------------------------------===//
132 /// RegisterPassParser class - Handle the addition of new machine passes.
134 //===----------------------------------------------------------------------===//
135 template <class RegistryClass>
136 class RegisterPassParser
137 : public MachinePassRegistryListener<
138 typename RegistryClass::FunctionPassCtor>,
139 public cl::parser<typename RegistryClass::FunctionPassCtor> {
141 RegisterPassParser(cl::Option &O)
142 : cl::parser<typename RegistryClass::FunctionPassCtor>(O) {}
143 ~RegisterPassParser() override { RegistryClass::setListener(nullptr); }
146 cl::parser<typename RegistryClass::FunctionPassCtor>::initialize();
148 // Add existing passes to option.
149 for (RegistryClass *Node = RegistryClass::getList();
150 Node; Node = Node->getNext()) {
151 this->addLiteralOption(Node->getName(),
152 (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
153 Node->getDescription());
156 // Make sure we listen for list changes.
157 RegistryClass::setListener(this);
160 // Implement the MachinePassRegistryListener callbacks.
161 void NotifyAdd(StringRef N, typename RegistryClass::FunctionPassCtor C,
162 StringRef D) override {
163 this->addLiteralOption(N, C, D);
165 void NotifyRemove(StringRef N) override {
166 this->removeLiteralOption(N);
170 } // end namespace llvm
172 #endif // LLVM_CODEGEN_MACHINEPASSREGISTRY_H