2323
2424namespace llvm {
2525
26- typedef void *(*MachinePassCtor)();
27-
28-
2926// ===----------------------------------------------------------------------===//
3027// /
3128// / MachinePassRegistryListener - Listener to adds and removals of nodes in
3229// / registration list.
3330// /
3431// ===----------------------------------------------------------------------===//
35- class MachinePassRegistryListener {
36- virtual void anchor ();
32+ template <class PassCtorTy > class MachinePassRegistryListener {
33+ virtual void anchor () {}
34+
3735public:
3836 MachinePassRegistryListener () {}
3937 virtual ~MachinePassRegistryListener () {}
40- virtual void NotifyAdd (const char *N, MachinePassCtor C, const char *D) = 0;
38+ virtual void NotifyAdd (const char *N, PassCtorTy C, const char *D) = 0;
4139 virtual void NotifyRemove (const char *N) = 0;
4240};
4341
@@ -47,18 +45,17 @@ class MachinePassRegistryListener {
4745// / MachinePassRegistryNode - Machine pass node stored in registration list.
4846// /
4947// ===----------------------------------------------------------------------===//
50- class MachinePassRegistryNode {
51-
48+ template <typename PassCtorTy> class MachinePassRegistryNode {
5249private:
5350
5451 MachinePassRegistryNode *Next; // Next function pass in list.
5552 const char *Name; // Name of function pass.
5653 const char *Description; // Description string.
57- MachinePassCtor Ctor; // Function pass creator.
54+ PassCtorTy Ctor; // Pass creator.
5855
5956public:
6057
61- MachinePassRegistryNode (const char *N, const char *D, MachinePassCtor C)
58+ MachinePassRegistryNode (const char *N, const char *D, PassCtorTy C)
6259 : Next(nullptr )
6360 , Name(N)
6461 , Description(D)
@@ -70,7 +67,7 @@ class MachinePassRegistryNode {
7067 MachinePassRegistryNode **getNextAddress () { return &Next; }
7168 const char *getName () const { return Name; }
7269 const char *getDescription () const { return Description; }
73- MachinePassCtor getCtor () const { return Ctor; }
70+ PassCtorTy getCtor () const { return Ctor; }
7471 void setNext (MachinePassRegistryNode *N) { Next = N; }
7572
7673};
@@ -81,13 +78,12 @@ class MachinePassRegistryNode {
8178// / MachinePassRegistry - Track the registration of machine passes.
8279// /
8380// ===----------------------------------------------------------------------===//
84- class MachinePassRegistry {
85-
81+ template <typename PassCtorTy> class MachinePassRegistry {
8682private:
87-
88- MachinePassRegistryNode *List ; // List of registry nodes .
89- MachinePassCtor Default; // Default function pass creator.
90- MachinePassRegistryListener* Listener;// Listener for list adds are removes.
83+ MachinePassRegistryNode<PassCtorTy> *List; // List of registry nodes.
84+ PassCtorTy Default ; // Default function pass creator .
85+ MachinePassRegistryListener<PassCtorTy>
86+ * Listener; // Listener for list adds are removes.
9187
9288public:
9389
@@ -96,32 +92,60 @@ class MachinePassRegistry {
9692
9793 // Accessors.
9894 //
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; }
95+ MachinePassRegistryNode<PassCtorTy> *getList () { return List; }
96+ PassCtorTy getDefault () { return Default; }
97+ void setDefault (PassCtorTy C) { Default = C; }
98+ // / setDefault - Set the default constructor by name.
99+ void setDefault (StringRef Name) {
100+ PassCtorTy Ctor = nullptr ;
101+ for (MachinePassRegistryNode<PassCtorTy> *R = getList (); R;
102+ R = R->getNext ()) {
103+ if (R->getName () == Name) {
104+ Ctor = R->getCtor ();
105+ break ;
106+ }
107+ }
108+ assert (Ctor && " Unregistered pass name" );
109+ setDefault (Ctor);
110+ }
111+ void setListener (MachinePassRegistryListener<PassCtorTy> *L) { Listener = L; }
104112
105113 // / Add - Adds a function pass to the registration list.
106114 // /
107- void Add (MachinePassRegistryNode *Node);
115+ void Add (MachinePassRegistryNode<PassCtorTy> *Node) {
116+ Node->setNext (List);
117+ List = Node;
118+ if (Listener)
119+ Listener->NotifyAdd (Node->getName (), Node->getCtor (),
120+ Node->getDescription ());
121+ }
108122
109123 // / Remove - Removes a function pass from the registration list.
110124 // /
111- void Remove (MachinePassRegistryNode *Node);
112-
125+ void Remove (MachinePassRegistryNode<PassCtorTy> *Node) {
126+ for (MachinePassRegistryNode<PassCtorTy> **I = &List; *I;
127+ I = (*I)->getNextAddress ()) {
128+ if (*I == Node) {
129+ if (Listener)
130+ Listener->NotifyRemove (Node->getName ());
131+ *I = (*I)->getNext ();
132+ break ;
133+ }
134+ }
135+ }
113136};
114137
115138
116139// ===----------------------------------------------------------------------===//
117140// /
118141// / RegisterPassParser class - Handle the addition of new machine passes.
119142// /
120- // //
121- // /////////////////////////////////////////////////////////////////////////////
122- template <class RegistryClass >
123- class RegisterPassParser : public MachinePassRegistryListener ,
124- public cl::parser<typename RegistryClass::FunctionPassCtor> {
143+ // ===----------------------------------------------------------------------===//
144+ template <class RegistryClass >
145+ class RegisterPassParser
146+ : public MachinePassRegistryListener<
147+ typename RegistryClass::FunctionPassCtor>,
148+ public cl::parser<typename RegistryClass::FunctionPassCtor> {
125149public:
126150 RegisterPassParser (cl::Option &O)
127151 : cl::parser<typename RegistryClass::FunctionPassCtor>(O) {}
@@ -144,8 +168,9 @@ class RegisterPassParser : public MachinePassRegistryListener,
144168
145169 // Implement the MachinePassRegistryListener callbacks.
146170 //
147- void NotifyAdd (const char *N, MachinePassCtor C, const char *D) override {
148- this ->addLiteralOption (N, (typename RegistryClass::FunctionPassCtor)C, D);
171+ void NotifyAdd (const char *N, typename RegistryClass::FunctionPassCtor C,
172+ const char *D) override {
173+ this ->addLiteralOption (N, C, D);
149174 }
150175 void NotifyRemove (const char *N) override {
151176 this ->removeLiteralOption (N);
0 commit comments