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
44-
4542// ===----------------------------------------------------------------------===//
4643// /
4744// / MachinePassRegistryNode - Machine pass node stored in registration list.
4845// /
4946// ===----------------------------------------------------------------------===//
50- class MachinePassRegistryNode {
51-
47+ template <typename PassCtorTy> class MachinePassRegistryNode {
5248private:
5349
5450 MachinePassRegistryNode *Next; // Next function pass in list.
5551 const char *Name; // Name of function pass.
5652 const char *Description; // Description string.
57- MachinePassCtor Ctor; // Function pass creator.
53+ PassCtorTy Ctor; // Pass creator.
5854
5955public:
60-
61- MachinePassRegistryNode (const char *N, const char *D, MachinePassCtor C)
62- : Next(nullptr )
63- , Name(N)
64- , Description(D)
65- , Ctor(C)
66- {}
56+ MachinePassRegistryNode (const char *N, const char *D, PassCtorTy C)
57+ : Next(nullptr ), Name(N), Description(D), Ctor(C) {}
6758
6859 // Accessors
6960 MachinePassRegistryNode *getNext () const { return Next; }
7061 MachinePassRegistryNode **getNextAddress () { return &Next; }
7162 const char *getName () const { return Name; }
7263 const char *getDescription () const { return Description; }
73- MachinePassCtor getCtor () const { return Ctor; }
64+ PassCtorTy getCtor () const { return Ctor; }
7465 void setNext (MachinePassRegistryNode *N) { Next = N; }
75-
7666};
7767
78-
7968// ===----------------------------------------------------------------------===//
8069// /
8170// / MachinePassRegistry - Track the registration of machine passes.
8271// /
8372// ===----------------------------------------------------------------------===//
84- class MachinePassRegistry {
85-
73+ template <typename PassCtorTy> class MachinePassRegistry {
8674private:
87-
88- MachinePassRegistryNode *List ; // List of registry nodes .
89- MachinePassCtor Default; // Default function pass creator.
90- MachinePassRegistryListener* Listener;// Listener for list adds are removes.
75+ MachinePassRegistryNode<PassCtorTy> *List; // List of registry nodes.
76+ PassCtorTy Default ; // Default function pass creator .
77+ MachinePassRegistryListener<PassCtorTy>
78+ * Listener; // Listener for list adds are removes.
9179
9280public:
9381
@@ -96,32 +84,59 @@ class MachinePassRegistry {
9684
9785 // Accessors.
9886 //
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; }
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;
94+ R = R->getNext ()) {
95+ if (R->getName () == Name) {
96+ Ctor = R->getCtor ();
97+ break ;
98+ }
99+ }
100+ assert (Ctor && " Unregistered pass name" );
101+ setDefault (Ctor);
102+ }
103+ void setListener (MachinePassRegistryListener<PassCtorTy> *L) { Listener = L; }
104104
105105 // / Add - Adds a function pass to the registration list.
106106 // /
107- void Add (MachinePassRegistryNode *Node);
107+ void Add (MachinePassRegistryNode<PassCtorTy> *Node) {
108+ Node->setNext (List);
109+ List = Node;
110+ if (Listener)
111+ Listener->NotifyAdd (Node->getName (), Node->getCtor (),
112+ Node->getDescription ());
113+ }
108114
109115 // / Remove - Removes a function pass from the registration list.
110116 // /
111- void Remove (MachinePassRegistryNode *Node);
112-
117+ void Remove (MachinePassRegistryNode<PassCtorTy> *Node) {
118+ for (MachinePassRegistryNode<PassCtorTy> **I = &List; *I;
119+ I = (*I)->getNextAddress ()) {
120+ if (*I == Node) {
121+ if (Listener)
122+ Listener->NotifyRemove (Node->getName ());
123+ *I = (*I)->getNext ();
124+ break ;
125+ }
126+ }
127+ }
113128};
114129
115-
116130// ===----------------------------------------------------------------------===//
117131// /
118132// / RegisterPassParser class - Handle the addition of new machine passes.
119133// /
120- // //
121- // /////////////////////////////////////////////////////////////////////////////
122- template <class RegistryClass >
123- class RegisterPassParser : public MachinePassRegistryListener ,
124- public cl::parser<typename RegistryClass::FunctionPassCtor> {
134+ // ===----------------------------------------------------------------------===//
135+ template <class RegistryClass >
136+ class RegisterPassParser
137+ : public MachinePassRegistryListener<
138+ typename RegistryClass::FunctionPassCtor>,
139+ public cl::parser<typename RegistryClass::FunctionPassCtor> {
125140public:
126141 RegisterPassParser (cl::Option &O)
127142 : cl::parser<typename RegistryClass::FunctionPassCtor>(O) {}
@@ -144,15 +159,15 @@ class RegisterPassParser : public MachinePassRegistryListener,
144159
145160 // Implement the MachinePassRegistryListener callbacks.
146161 //
147- void NotifyAdd (const char *N, MachinePassCtor C, const char *D) override {
148- this ->addLiteralOption (N, (typename RegistryClass::FunctionPassCtor)C, D);
162+ void NotifyAdd (const char *N, typename RegistryClass::FunctionPassCtor C,
163+ const char *D) override {
164+ this ->addLiteralOption (N, C, D);
149165 }
150166 void NotifyRemove (const char *N) override {
151167 this ->removeLiteralOption (N);
152168 }
153169};
154170
155-
156171} // end namespace llvm
157172
158173#endif
0 commit comments