• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
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.
15 //
16 //===----------------------------------------------------------------------===//
17 
18 #ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
19 #define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
20 
21 #include "llvm/CodeGen/Passes.h"
22 #include "llvm/Support/CommandLine.h"
23 
24 namespace llvm {
25 
26 typedef void *(*MachinePassCtor)();
27 
28 
29 //===----------------------------------------------------------------------===//
30 ///
31 /// MachinePassRegistryListener - Listener to adds and removals of nodes in
32 /// registration list.
33 ///
34 //===----------------------------------------------------------------------===//
35 class MachinePassRegistryListener {
36 public:
MachinePassRegistryListener()37   MachinePassRegistryListener() {}
~MachinePassRegistryListener()38   virtual ~MachinePassRegistryListener() {}
39   virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0;
40   virtual void NotifyRemove(const char *N) = 0;
41 };
42 
43 
44 //===----------------------------------------------------------------------===//
45 ///
46 /// MachinePassRegistryNode - Machine pass node stored in registration list.
47 ///
48 //===----------------------------------------------------------------------===//
49 class MachinePassRegistryNode {
50 
51 private:
52 
53   MachinePassRegistryNode *Next;        // Next function pass in list.
54   const char *Name;                     // Name of function pass.
55   const char *Description;              // Description string.
56   MachinePassCtor Ctor;                 // Function pass creator.
57 
58 public:
59 
MachinePassRegistryNode(const char * N,const char * D,MachinePassCtor C)60   MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
61   : Next(NULL)
62   , Name(N)
63   , Description(D)
64   , Ctor(C)
65   {}
66 
67   // Accessors
getNext()68   MachinePassRegistryNode *getNext()      const { return Next; }
getNextAddress()69   MachinePassRegistryNode **getNextAddress()    { return &Next; }
getName()70   const char *getName()                   const { return Name; }
getDescription()71   const char *getDescription()            const { return Description; }
getCtor()72   MachinePassCtor getCtor()               const { return Ctor; }
setNext(MachinePassRegistryNode * N)73   void setNext(MachinePassRegistryNode *N)      { Next = N; }
74 
75 };
76 
77 
78 //===----------------------------------------------------------------------===//
79 ///
80 /// MachinePassRegistry - Track the registration of machine passes.
81 ///
82 //===----------------------------------------------------------------------===//
83 class MachinePassRegistry {
84 
85 private:
86 
87   MachinePassRegistryNode *List;        // List of registry nodes.
88   MachinePassCtor Default;              // Default function pass creator.
89   MachinePassRegistryListener* Listener;// Listener for list adds are removes.
90 
91 public:
92 
93   // NO CONSTRUCTOR - we don't want static constructor ordering to mess
94   // with the registry.
95 
96   // Accessors.
97   //
getList()98   MachinePassRegistryNode *getList()                    { return List; }
getDefault()99   MachinePassCtor getDefault()                          { return Default; }
setDefault(MachinePassCtor C)100   void setDefault(MachinePassCtor C)                    { Default = C; }
setListener(MachinePassRegistryListener * L)101   void setListener(MachinePassRegistryListener *L)      { Listener = L; }
102 
103   /// Add - Adds a function pass to the registration list.
104   ///
105   void Add(MachinePassRegistryNode *Node);
106 
107   /// Remove - Removes a function pass from the registration list.
108   ///
109   void Remove(MachinePassRegistryNode *Node);
110 
111 };
112 
113 
114 //===----------------------------------------------------------------------===//
115 ///
116 /// RegisterPassParser class - Handle the addition of new machine passes.
117 ///
118 //===----------------------------------------------------------------------===//
119 template<class RegistryClass>
120 class RegisterPassParser : public MachinePassRegistryListener,
121                    public cl::parser<typename RegistryClass::FunctionPassCtor> {
122 public:
RegisterPassParser()123   RegisterPassParser() {}
~RegisterPassParser()124   ~RegisterPassParser() { RegistryClass::setListener(NULL); }
125 
initialize(cl::Option & O)126   void initialize(cl::Option &O) {
127     cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O);
128 
129     // Add existing passes to option.
130     for (RegistryClass *Node = RegistryClass::getList();
131          Node; Node = Node->getNext()) {
132       this->addLiteralOption(Node->getName(),
133                       (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
134                              Node->getDescription());
135     }
136 
137     // Make sure we listen for list changes.
138     RegistryClass::setListener(this);
139   }
140 
141   // Implement the MachinePassRegistryListener callbacks.
142   //
NotifyAdd(const char * N,MachinePassCtor C,const char * D)143   virtual void NotifyAdd(const char *N,
144                          MachinePassCtor C,
145                          const char *D) {
146     this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
147   }
NotifyRemove(const char * N)148   virtual void NotifyRemove(const char *N) {
149     this->removeLiteralOption(N);
150   }
151 };
152 
153 
154 } // end namespace llvm
155 
156 #endif
157