MachinePassRegistry.h revision 9ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3b
1c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
2c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//
3c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//                     The LLVM Compiler Infrastructure
4c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//
59ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// This file was developed by the James M. Laskey and is distributed under
6c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// the University of Illinois Open Source 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/CodeGen/ScheduleDAG.h"
23c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#include "llvm/Support/CommandLine.h"
24c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
25c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeynamespace llvm {
26c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
27c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
28c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
29c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
30c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistryListener - Listener to adds and removals of nodes in
31c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// registration list.
32c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
33c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
34c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistryListener {
35c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
36c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryListener() {}
37c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  virtual ~MachinePassRegistryListener() {}
38c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  virtual void NotifyAdd(const char *N, const char *D) = 0;
39c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  virtual void NotifyRemove(const char *N, const char *D) = 0;
40c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
41c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
42c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
43c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
44c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
45c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistryNode - Machine pass node stored in registration list.
46c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
47c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
48c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeytemplate<typename FunctionPassCtor>
49c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistryNode {
50c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
51c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyprivate:
52c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
53c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryNode<FunctionPassCtor> *Next;// Next function pass in list.
54c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  const char *Name;                     // Name of function pass.
55c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  const char *Description;              // Description string.
56c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  FunctionPassCtor Ctor;                // Function pass creator.
57c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
58c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
59c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
60c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryNode(const char *N, const char *D, FunctionPassCtor C)
61c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  : Next(NULL)
62c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  , Name(N)
63c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  , Description(D)
64c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  , Ctor(C)
65c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  {}
66c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
67c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // Accessors
68c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryNode<FunctionPassCtor> *getNext()
69c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey                                          const { return Next; }
70c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryNode<FunctionPassCtor> **getNextAddress()
71c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey                                                { return &Next; }
72c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  const char *getName()                   const { return Name; }
73c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  const char *getDescription()            const { return Description; }
74c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  FunctionPassCtor getCtor()              const { return Ctor; }
75c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  void setNext(MachinePassRegistryNode<FunctionPassCtor> *N) { Next = N; }
76c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
77c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
78c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
79c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
80c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
81c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
82c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistry - Track the registration of machine passes.
83c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
84c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
85c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeytemplate<typename FunctionPassCtor>
86c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistry {
87c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
88c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyprivate:
89c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
90c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryNode<FunctionPassCtor> *List;
91c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey                                        // List of registry nodes.
929ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  FunctionPassCtor Default;             // Default function pass creator.
93c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryListener* Listener;// Listener for list adds are removes.
94c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
95c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
96c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
97c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // NO CONSTRUCTOR - we don't want static constructor ordering to mess
98c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // with the registry.
99c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
100c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // Accessors.
101c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  //
102c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryNode<FunctionPassCtor> *getList()  { return List; }
1039ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  FunctionPassCtor getDefault()                         { return Default; }
1049ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  void setDefault(FunctionPassCtor C)                   { Default = C; }
105c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  void setListener(MachinePassRegistryListener *L)      { Listener = L; }
106c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
107c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// Add - Adds a function pass to the registration list.
108c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  ///
109c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey void Add(MachinePassRegistryNode<FunctionPassCtor> *Node) {
110c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    Node->setNext(List);
111c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    List = Node;
112c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    if (Listener) Listener->NotifyAdd(Node->getName(), Node->getDescription());
113c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
114c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
115c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
116c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// Remove - Removes a function pass from the registration list.
117c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  ///
118c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  void Remove(MachinePassRegistryNode<FunctionPassCtor> *Node) {
119c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    for (MachinePassRegistryNode<FunctionPassCtor> **I = &List;
120c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey         *I; I = (*I)->getNextAddress()) {
121c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey      if (*I == Node) {
122c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey        if (Listener) Listener->NotifyRemove(Node->getName(),
123c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey                                             Node->getDescription());
124c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey        *I = (*I)->getNext();
125c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey        break;
126c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey      }
127c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    }
128c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
129c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
130c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
131c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// FInd - Finds and returns a function pass in registration list, otherwise
132c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// returns NULL.
133c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  MachinePassRegistryNode<FunctionPassCtor> *Find(const char *Name) {
134c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    for (MachinePassRegistryNode<FunctionPassCtor> *I = List;
135c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey         I; I = I->getNext()) {
136c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey      if (std::string(Name) == std::string(I->getName())) return I;
137c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    }
138c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return NULL;
139c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
140c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
141c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
142c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
143c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
144c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
145c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
146c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
147c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// RegisterRegAlloc class - Track the registration of register allocators.
148c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
149c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
150c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass RegisterRegAlloc : public MachinePassRegistryNode<FunctionPass *(*)()> {
151c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
152c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
153c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
154c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  typedef FunctionPass *(*FunctionPassCtor)();
155c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
156c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static MachinePassRegistry<FunctionPassCtor> Registry;
157c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
158c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  RegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C)
159c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  : MachinePassRegistryNode<FunctionPassCtor>(N, D, C)
160c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  { Registry.Add(this); }
161c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  ~RegisterRegAlloc() { Registry.Remove(this); }
162c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
163c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
164c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // Accessors.
165c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  //
166c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  RegisterRegAlloc *getNext() const {
167c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return (RegisterRegAlloc *)
168c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey           MachinePassRegistryNode<FunctionPassCtor>::getNext();
169c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
170c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static RegisterRegAlloc *getList() {
171c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return (RegisterRegAlloc *)Registry.getList();
172c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
1739ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  static FunctionPassCtor getDefault() {
1749ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey    return Registry.getDefault();
175c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
1769ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  static void setDefault(FunctionPassCtor C) {
1779ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey    Registry.setDefault(C);
178c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
179c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static void setListener(MachinePassRegistryListener *L) {
180c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    Registry.setListener(L);
181c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
182c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
183c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
184c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// FirstCtor - Finds the first register allocator in registration
185c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// list and returns its creator function, otherwise return NULL.
186c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static FunctionPassCtor FirstCtor() {
187c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.getList();
188c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return Node ? Node->getCtor() : NULL;
189c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
190c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
191c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// FindCtor - Finds a register allocator in registration list and returns
192c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// its creator function, otherwise return NULL.
193c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static FunctionPassCtor FindCtor(const char *N) {
194c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.Find(N);
195c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return Node ? Node->getCtor() : NULL;
196c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
197c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
198c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
199c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
200c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
201c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
202c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
203c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// RegisterScheduler class - Track the registration of instruction schedulers.
204c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
205c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
206c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
2079ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskeyclass SelectionDAGISel;
208c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass ScheduleDAG;
209c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass SelectionDAG;
210c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachineBasicBlock;
211c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
212c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass RegisterScheduler : public
2139ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  MachinePassRegistryNode<
2149ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey       ScheduleDAG *(*)(SelectionDAGISel*, SelectionDAG*, MachineBasicBlock*)> {
215c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
216c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
217c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
2189ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  typedef ScheduleDAG *(*FunctionPassCtor)(SelectionDAGISel*, SelectionDAG*,
2199ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey                                           MachineBasicBlock*);
220c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
221c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static MachinePassRegistry<FunctionPassCtor> Registry;
222c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
223c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  RegisterScheduler(const char *N, const char *D, FunctionPassCtor C)
224c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  : MachinePassRegistryNode<FunctionPassCtor>(N, D, C)
225c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  { Registry.Add(this); }
226c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  ~RegisterScheduler() { Registry.Remove(this); }
227c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
228c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
229c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // Accessors.
230c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  //
231c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  RegisterScheduler *getNext() const {
232c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return (RegisterScheduler *)
233c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey           MachinePassRegistryNode<FunctionPassCtor>::getNext();
234c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
235c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static RegisterScheduler *getList() {
236c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return (RegisterScheduler *)Registry.getList();
237c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
2389ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  static FunctionPassCtor getDefault() {
2399ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey    return Registry.getDefault();
240c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
2419ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  static void setDefault(FunctionPassCtor C) {
2429ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey    Registry.setDefault(C);
243c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
244c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static void setListener(MachinePassRegistryListener *L) {
245c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    Registry.setListener(L);
246c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
247c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
248c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
249c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// FirstCtor - Finds the first instruction scheduler in registration
250c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// list and returns its creator function, otherwise return NULL.
251c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static FunctionPassCtor FirstCtor() {
252c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.getList();
253c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return Node ? Node->getCtor() : NULL;
254c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
255c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
256c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
257c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// FindCtor - Finds a instruction scheduler in registration list and returns
258c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  /// its creator function, otherwise return NULL.
259c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static FunctionPassCtor FindCtor(const char *N) {
260c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.Find(N);
261c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return Node ? Node->getCtor() : NULL;
262c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
263c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
264c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
265c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
266c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
267c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
268c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
269c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// RegisterPassParser class - Handle the addition of new machine passes.
270c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey///
271c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===//
272c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeytemplate<class RegistryClass>
273c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass RegisterPassParser : public MachinePassRegistryListener,
274c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey                           public cl::parser<const char *> {
275c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic:
276c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  RegisterPassParser() {}
2779ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey  ~RegisterPassParser() { RegistryClass::setListener(NULL); }
278c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
279c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  void initialize(cl::Option &O) {
280c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    cl::parser<const char *>::initialize(O);
281c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
282c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    // Add existing passes to option.
283c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    for (RegistryClass *Node = RegistryClass::getList();
284c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey         Node; Node = Node->getNext()) {
285c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey      addLiteralOption(Node->getName(), Node->getName(),
286c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey                       Node->getDescription());
287c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    }
288c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
289c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    // Make sure we listen for list changes.
290c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    RegistryClass::setListener(this);
291c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
292c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
293c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // Implement the MachinePassRegistryListener callbacks.
294c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  //
295c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  virtual void NotifyAdd(const char *N, const char *D) {
296c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    addLiteralOption(N, N, D);
297c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
298c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  virtual void NotifyRemove(const char *N, const char *D) {
299c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    removeLiteralOption(N);
300c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
301c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
302c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // ValLessThan - Provide a sorting comparator for Values elements...
303c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  typedef std::pair<const char*, std::pair<const char*, const char*> > ValType;
304c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  static bool ValLessThan(const ValType &VT1, const ValType &VT2) {
305c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    return std::string(VT1.first) < std::string(VT2.first);
306c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
307c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
308c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // printOptionInfo - Print out information about this option.  Override the
309c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  // default implementation to sort the table before we print...
310c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  virtual void printOptionInfo(const cl::Option &O, unsigned GlobalWidth) const{
311c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    RegisterPassParser *PNP = const_cast<RegisterPassParser*>(this);
312c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    std::sort(PNP->Values.begin(), PNP->Values.end(), ValLessThan);
313c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey    cl::parser<const char *>::printOptionInfo(O, GlobalWidth);
314c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey  }
315c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey};
316c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
317c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
318c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey} // end namespace llvm
319c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey
320c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#endif
321