MachinePassRegistry.h revision 234353
177957Sbenno//===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
277957Sbenno//
377957Sbenno//                     The LLVM Compiler Infrastructure
477957Sbenno//
577957Sbenno// This file is distributed under the University of Illinois Open Source
677957Sbenno// License. See LICENSE.TXT for details.
777957Sbenno//
877957Sbenno//===----------------------------------------------------------------------===//
977957Sbenno//
1077957Sbenno// This file contains the mechanics for machine function pass registries.  A
1177957Sbenno// function pass registry (MachinePassRegistry) is auto filled by the static
1277957Sbenno// constructors of MachinePassRegistryNode.  Further there is a command line
1377957Sbenno// parser (RegisterPassParser) which listens to each registry for additions
1477957Sbenno// and deletions, so that the appropriate command option is updated.
1577957Sbenno//
1677957Sbenno//===----------------------------------------------------------------------===//
1777957Sbenno
1877957Sbenno#ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
1977957Sbenno#define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
2077957Sbenno
2177957Sbenno#include "llvm/CodeGen/Passes.h"
2277957Sbenno#include "llvm/Support/CommandLine.h"
2377957Sbenno
2477957Sbennonamespace llvm {
2577957Sbenno
2677957Sbennotypedef void *(*MachinePassCtor)();
2777957Sbenno
2877957Sbenno
2977957Sbenno//===----------------------------------------------------------------------===//
3077957Sbenno///
3177957Sbenno/// MachinePassRegistryListener - Listener to adds and removals of nodes in
3277957Sbenno/// registration list.
3377957Sbenno///
34113038Sobrien//===----------------------------------------------------------------------===//
35113038Sobrienclass MachinePassRegistryListener {
3677957Sbenno  virtual void anchor();
3777957Sbennopublic:
3890643Sbenno  MachinePassRegistryListener() {}
3977957Sbenno  virtual ~MachinePassRegistryListener() {}
4077957Sbenno  virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0;
4177957Sbenno  virtual void NotifyRemove(const char *N) = 0;
4277957Sbenno};
4377957Sbenno
4477957Sbenno
4577957Sbenno//===----------------------------------------------------------------------===//
4677957Sbenno///
4777957Sbenno/// MachinePassRegistryNode - Machine pass node stored in registration list.
4877957Sbenno///
4977957Sbenno//===----------------------------------------------------------------------===//
5077957Sbennoclass MachinePassRegistryNode {
5177957Sbenno
52private:
53
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.
58
59public:
60
61  MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
62  : Next(NULL)
63  , Name(N)
64  , Description(D)
65  , Ctor(C)
66  {}
67
68  // Accessors
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; }
75
76};
77
78
79//===----------------------------------------------------------------------===//
80///
81/// MachinePassRegistry - Track the registration of machine passes.
82///
83//===----------------------------------------------------------------------===//
84class MachinePassRegistry {
85
86private:
87
88  MachinePassRegistryNode *List;        // List of registry nodes.
89  MachinePassCtor Default;              // Default function pass creator.
90  MachinePassRegistryListener* Listener;// Listener for list adds are removes.
91
92public:
93
94  // NO CONSTRUCTOR - we don't want static constructor ordering to mess
95  // with the registry.
96
97  // Accessors.
98  //
99  MachinePassRegistryNode *getList()                    { return List; }
100  MachinePassCtor getDefault()                          { return Default; }
101  void setDefault(MachinePassCtor C)                    { Default = C; }
102  void setListener(MachinePassRegistryListener *L)      { Listener = L; }
103
104  /// Add - Adds a function pass to the registration list.
105  ///
106  void Add(MachinePassRegistryNode *Node);
107
108  /// Remove - Removes a function pass from the registration list.
109  ///
110  void Remove(MachinePassRegistryNode *Node);
111
112};
113
114
115//===----------------------------------------------------------------------===//
116///
117/// RegisterPassParser class - Handle the addition of new machine passes.
118///
119//===----------------------------------------------------------------------===//
120template<class RegistryClass>
121class RegisterPassParser : public MachinePassRegistryListener,
122                   public cl::parser<typename RegistryClass::FunctionPassCtor> {
123public:
124  RegisterPassParser() {}
125  ~RegisterPassParser() { RegistryClass::setListener(NULL); }
126
127  void initialize(cl::Option &O) {
128    cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O);
129
130    // Add existing passes to option.
131    for (RegistryClass *Node = RegistryClass::getList();
132         Node; Node = Node->getNext()) {
133      this->addLiteralOption(Node->getName(),
134                      (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
135                             Node->getDescription());
136    }
137
138    // Make sure we listen for list changes.
139    RegistryClass::setListener(this);
140  }
141
142  // Implement the MachinePassRegistryListener callbacks.
143  //
144  virtual void NotifyAdd(const char *N,
145                         MachinePassCtor C,
146                         const char *D) {
147    this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
148  }
149  virtual void NotifyRemove(const char *N) {
150    this->removeLiteralOption(N);
151  }
152};
153
154
155} // end namespace llvm
156
157#endif
158