1c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
2c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//
3c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//                     The LLVM Compiler Infrastructure
4c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//
8c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
99ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey//
109ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// This file contains the mechanics for machine function pass registries.  A
119ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// function pass registry (MachinePassRegistry) is auto filled by the static
129ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// constructors of MachinePassRegistryNode.  Further there is a command line
139ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// parser (RegisterPassParser) which listens to each registry for additions
149ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// and deletions, so that the appropriate command option is updated.
159ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey//
169ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey//===----------------------------------------------------------------------===//
17c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
18c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
19c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
20c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
21c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#include "llvm/CodeGen/Passes.h"
22c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#include "llvm/Support/CommandLine.h"
23c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
24c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeynamespace llvm {
25c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
26eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskeytypedef void *(*MachinePassCtor)();
27eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey
28c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
2927745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick//===----------------------------------------------------------------------===//
30c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
31c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistryListener - Listener to adds and removals of nodes in
32c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// registration list.
33c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
34c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
35c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistryListener {
362d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
37c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
38c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryListener() {}
39c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  virtual ~MachinePassRegistryListener() {}
40eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0;
41eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  virtual void NotifyRemove(const char *N) = 0;
42c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
43c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
44c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
4527745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick//===----------------------------------------------------------------------===//
46c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
47c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistryNode - Machine pass node stored in registration list.
48c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
49c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
50c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistryNode {
51c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
52c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyprivate:
53c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
54eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassRegistryNode *Next;        // Next function pass in list.
55c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  const char *Name;                     // Name of function pass.
56c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  const char *Description;              // Description string.
57eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassCtor Ctor;                 // Function pass creator.
5827745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick
59c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
60c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
61eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
62c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  : Next(NULL)
63c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  , Name(N)
64c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  , Description(D)
65c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  , Ctor(C)
66c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  {}
67c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
68c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // Accessors
69eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassRegistryNode *getNext()      const { return Next; }
70eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassRegistryNode **getNextAddress()    { return &Next; }
71c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  const char *getName()                   const { return Name; }
72c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  const char *getDescription()            const { return Description; }
73eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassCtor getCtor()               const { return Ctor; }
74eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  void setNext(MachinePassRegistryNode *N)      { Next = N; }
7527745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick
76c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
77c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
78c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
7927745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick//===----------------------------------------------------------------------===//
80c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
81c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistry - Track the registration of machine passes.
82c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
83c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
84c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistry {
85c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
86c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyprivate:
87c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
88eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassRegistryNode *List;        // List of registry nodes.
89eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassCtor Default;              // Default function pass creator.
90c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryListener* Listener;// Listener for list adds are removes.
9127745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick
92c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
93c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
94c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // NO CONSTRUCTOR - we don't want static constructor ordering to mess
95c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // with the registry.
96c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
97c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // Accessors.
98c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  //
99eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassRegistryNode *getList()                    { return List; }
100eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  MachinePassCtor getDefault()                          { return Default; }
101eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  void setDefault(MachinePassCtor C)                    { Default = C; }
102fc728fbdc2631ce8f343cf9b7292d218fde7419fAndrew Trick  void setDefault(StringRef Name);
103c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  void setListener(MachinePassRegistryListener *L)      { Listener = L; }
104c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
105c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// Add - Adds a function pass to the registration list.
106c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  ///
107eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  void Add(MachinePassRegistryNode *Node);
108c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
109c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// Remove - Removes a function pass from the registration list.
110c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  ///
111eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  void Remove(MachinePassRegistryNode *Node);
112c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
113c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
114c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
115c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
116c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
117c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
118c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// RegisterPassParser class - Handle the addition of new machine passes.
119c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
120c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
121c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeytemplate<class RegistryClass>
122c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass RegisterPassParser : public MachinePassRegistryListener,
123eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey                   public cl::parser<typename RegistryClass::FunctionPassCtor> {
124c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
125c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  RegisterPassParser() {}
1269ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  ~RegisterPassParser() { RegistryClass::setListener(NULL); }
127c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
128c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  void initialize(cl::Option &O) {
129eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey    cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O);
13027745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick
131c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    // Add existing passes to option.
132c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    for (RegistryClass *Node = RegistryClass::getList();
133c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey         Node; Node = Node->getNext()) {
134a6923131032be5e47b5e1155e69b23aa4c5e65acJohn McCall      this->addLiteralOption(Node->getName(),
135eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey                      (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
136a6923131032be5e47b5e1155e69b23aa4c5e65acJohn McCall                             Node->getDescription());
137c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    }
13827745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick
139c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    // Make sure we listen for list changes.
140c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    RegistryClass::setListener(this);
141c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
142c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
143c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // Implement the MachinePassRegistryListener callbacks.
144c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  //
145eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  virtual void NotifyAdd(const char *N,
146eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey                         MachinePassCtor C,
147eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey                         const char *D) {
148eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey    this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
149c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
150eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey  virtual void NotifyRemove(const char *N) {
151eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey    this->removeLiteralOption(N);
152c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
153c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
154c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
155c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
156c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey} // end namespace llvm
157c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
158c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#endif
159