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(nullptr); }
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 void NotifyAdd(const char *N
, MachinePassCtor C
, const char *D
) override
{
146 this->addLiteralOption(N
, (typename
RegistryClass::FunctionPassCtor
)C
, D
);
148 void NotifyRemove(const char *N
) override
{
149 this->removeLiteralOption(N
);
154 } // end namespace llvm