1193323Sed//===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10193323Sed// This file contains the mechanics for machine function pass registries.  A
11193323Sed// function pass registry (MachinePassRegistry) is auto filled by the static
12193323Sed// constructors of MachinePassRegistryNode.  Further there is a command line
13193323Sed// parser (RegisterPassParser) which listens to each registry for additions
14193323Sed// and deletions, so that the appropriate command option is updated.
15193323Sed//
16193323Sed//===----------------------------------------------------------------------===//
17193323Sed
18193323Sed#ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
19193323Sed#define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
20193323Sed
21193323Sed#include "llvm/CodeGen/Passes.h"
22193323Sed#include "llvm/Support/CommandLine.h"
23193323Sed
24193323Sednamespace llvm {
25193323Sed
26193323Sedtypedef void *(*MachinePassCtor)();
27193323Sed
28193323Sed
29239462Sdim//===----------------------------------------------------------------------===//
30193323Sed///
31193323Sed/// MachinePassRegistryListener - Listener to adds and removals of nodes in
32193323Sed/// registration list.
33193323Sed///
34193323Sed//===----------------------------------------------------------------------===//
35193323Sedclass MachinePassRegistryListener {
36234353Sdim  virtual void anchor();
37193323Sedpublic:
38193323Sed  MachinePassRegistryListener() {}
39193323Sed  virtual ~MachinePassRegistryListener() {}
40193323Sed  virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0;
41193323Sed  virtual void NotifyRemove(const char *N) = 0;
42193323Sed};
43193323Sed
44193323Sed
45239462Sdim//===----------------------------------------------------------------------===//
46193323Sed///
47193323Sed/// MachinePassRegistryNode - Machine pass node stored in registration list.
48193323Sed///
49193323Sed//===----------------------------------------------------------------------===//
50193323Sedclass MachinePassRegistryNode {
51193323Sed
52193323Sedprivate:
53193323Sed
54193323Sed  MachinePassRegistryNode *Next;        // Next function pass in list.
55193323Sed  const char *Name;                     // Name of function pass.
56193323Sed  const char *Description;              // Description string.
57193323Sed  MachinePassCtor Ctor;                 // Function pass creator.
58239462Sdim
59193323Sedpublic:
60193323Sed
61193323Sed  MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
62193323Sed  : Next(NULL)
63193323Sed  , Name(N)
64193323Sed  , Description(D)
65193323Sed  , Ctor(C)
66193323Sed  {}
67193323Sed
68193323Sed  // Accessors
69193323Sed  MachinePassRegistryNode *getNext()      const { return Next; }
70193323Sed  MachinePassRegistryNode **getNextAddress()    { return &Next; }
71193323Sed  const char *getName()                   const { return Name; }
72193323Sed  const char *getDescription()            const { return Description; }
73193323Sed  MachinePassCtor getCtor()               const { return Ctor; }
74193323Sed  void setNext(MachinePassRegistryNode *N)      { Next = N; }
75239462Sdim
76193323Sed};
77193323Sed
78193323Sed
79239462Sdim//===----------------------------------------------------------------------===//
80193323Sed///
81193323Sed/// MachinePassRegistry - Track the registration of machine passes.
82193323Sed///
83193323Sed//===----------------------------------------------------------------------===//
84193323Sedclass MachinePassRegistry {
85193323Sed
86193323Sedprivate:
87193323Sed
88193323Sed  MachinePassRegistryNode *List;        // List of registry nodes.
89193323Sed  MachinePassCtor Default;              // Default function pass creator.
90193323Sed  MachinePassRegistryListener* Listener;// Listener for list adds are removes.
91239462Sdim
92193323Sedpublic:
93193323Sed
94193323Sed  // NO CONSTRUCTOR - we don't want static constructor ordering to mess
95193323Sed  // with the registry.
96193323Sed
97193323Sed  // Accessors.
98193323Sed  //
99193323Sed  MachinePassRegistryNode *getList()                    { return List; }
100193323Sed  MachinePassCtor getDefault()                          { return Default; }
101193323Sed  void setDefault(MachinePassCtor C)                    { Default = C; }
102239462Sdim  void setDefault(StringRef Name);
103193323Sed  void setListener(MachinePassRegistryListener *L)      { Listener = L; }
104193323Sed
105193323Sed  /// Add - Adds a function pass to the registration list.
106193323Sed  ///
107193323Sed  void Add(MachinePassRegistryNode *Node);
108193323Sed
109193323Sed  /// Remove - Removes a function pass from the registration list.
110193323Sed  ///
111193323Sed  void Remove(MachinePassRegistryNode *Node);
112193323Sed
113193323Sed};
114193323Sed
115193323Sed
116193323Sed//===----------------------------------------------------------------------===//
117193323Sed///
118193323Sed/// RegisterPassParser class - Handle the addition of new machine passes.
119193323Sed///
120193323Sed//===----------------------------------------------------------------------===//
121193323Sedtemplate<class RegistryClass>
122193323Sedclass RegisterPassParser : public MachinePassRegistryListener,
123193323Sed                   public cl::parser<typename RegistryClass::FunctionPassCtor> {
124193323Sedpublic:
125193323Sed  RegisterPassParser() {}
126193323Sed  ~RegisterPassParser() { RegistryClass::setListener(NULL); }
127193323Sed
128193323Sed  void initialize(cl::Option &O) {
129193323Sed    cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O);
130239462Sdim
131193323Sed    // Add existing passes to option.
132193323Sed    for (RegistryClass *Node = RegistryClass::getList();
133193323Sed         Node; Node = Node->getNext()) {
134201360Srdivacky      this->addLiteralOption(Node->getName(),
135193323Sed                      (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
136201360Srdivacky                             Node->getDescription());
137193323Sed    }
138239462Sdim
139193323Sed    // Make sure we listen for list changes.
140193323Sed    RegistryClass::setListener(this);
141193323Sed  }
142193323Sed
143193323Sed  // Implement the MachinePassRegistryListener callbacks.
144193323Sed  //
145193323Sed  virtual void NotifyAdd(const char *N,
146193323Sed                         MachinePassCtor C,
147193323Sed                         const char *D) {
148193323Sed    this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
149193323Sed  }
150193323Sed  virtual void NotifyRemove(const char *N) {
151193323Sed    this->removeLiteralOption(N);
152193323Sed  }
153193323Sed};
154193323Sed
155193323Sed
156193323Sed} // end namespace llvm
157193323Sed
158193323Sed#endif
159