LLVM  7.0.0svn
MachinePassRegistry.h
Go to the documentation of this file.
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/ADT/StringRef.h"
22 #include "llvm/CodeGen/Passes.h"
24 
25 namespace llvm {
26 
27 using MachinePassCtor = void *(*)();
28 
29 //===----------------------------------------------------------------------===//
30 ///
31 /// MachinePassRegistryListener - Listener to adds and removals of nodes in
32 /// registration list.
33 ///
34 //===----------------------------------------------------------------------===//
36  virtual void anchor();
37 
38 public:
39  MachinePassRegistryListener() = default;
40  virtual ~MachinePassRegistryListener() = default;
41 
42  virtual void NotifyAdd(StringRef N, MachinePassCtor C, StringRef D) = 0;
43  virtual void NotifyRemove(StringRef N) = 0;
44 };
45 
46 //===----------------------------------------------------------------------===//
47 ///
48 /// MachinePassRegistryNode - Machine pass node stored in registration list.
49 ///
50 //===----------------------------------------------------------------------===//
52 private:
53  MachinePassRegistryNode *Next = nullptr; // Next function pass in list.
54  StringRef Name; // Name of function pass.
55  StringRef Description; // Description string.
56  MachinePassCtor Ctor; // Function pass creator.
57 
58 public:
59  MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
60  : Name(N), Description(D), Ctor(C) {}
61 
62  // Accessors
63  MachinePassRegistryNode *getNext() const { return Next; }
65  StringRef getName() const { return Name; }
66  StringRef getDescription() const { return Description; }
67  MachinePassCtor getCtor() const { return Ctor; }
68  void setNext(MachinePassRegistryNode *N) { Next = N; }
69 };
70 
71 //===----------------------------------------------------------------------===//
72 ///
73 /// MachinePassRegistry - Track the registration of machine passes.
74 ///
75 //===----------------------------------------------------------------------===//
77 private:
78  MachinePassRegistryNode *List; // List of registry nodes.
79  MachinePassCtor Default; // Default function pass creator.
80  MachinePassRegistryListener *Listener; // Listener for list adds are removes.
81 
82 public:
83  // NO CONSTRUCTOR - we don't want static constructor ordering to mess
84  // with the registry.
85 
86  // Accessors.
87  //
90  void setDefault(MachinePassCtor C) { Default = C; }
91  void setDefault(StringRef Name);
92  void setListener(MachinePassRegistryListener *L) { Listener = L; }
93 
94  /// Add - Adds a function pass to the registration list.
95  ///
96  void Add(MachinePassRegistryNode *Node);
97 
98  /// Remove - Removes a function pass from the registration list.
99  ///
100  void Remove(MachinePassRegistryNode *Node);
101 };
102 
103 //===----------------------------------------------------------------------===//
104 ///
105 /// RegisterPassParser class - Handle the addition of new machine passes.
106 ///
107 //===----------------------------------------------------------------------===//
108 template<class RegistryClass>
110  public cl::parser<typename RegistryClass::FunctionPassCtor> {
111 public:
113  : cl::parser<typename RegistryClass::FunctionPassCtor>(O) {}
114  ~RegisterPassParser() override { RegistryClass::setListener(nullptr); }
115 
116  void initialize() {
118 
119  // Add existing passes to option.
120  for (RegistryClass *Node = RegistryClass::getList();
121  Node; Node = Node->getNext()) {
122  this->addLiteralOption(Node->getName(),
123  (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
124  Node->getDescription());
125  }
126 
127  // Make sure we listen for list changes.
128  RegistryClass::setListener(this);
129  }
130 
131  // Implement the MachinePassRegistryListener callbacks.
133  this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
134  }
135  void NotifyRemove(StringRef N) override {
136  this->removeLiteralOption(N);
137  }
138 };
139 
140 } // end namespace llvm
141 
142 #endif // LLVM_CODEGEN_MACHINEPASSREGISTRY_H
uint64_t CallInst * C
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
MachinePassRegistryNode * getList()
RegisterPassParser class - Handle the addition of new machine passes.
MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
virtual ~MachinePassRegistryListener()=default
void setListener(MachinePassRegistryListener *L)
void NotifyRemove(StringRef N) override
void setNext(MachinePassRegistryNode *N)
MachinePassCtor getCtor() const
MachinePassRegistry - Track the registration of machine passes.
void NotifyAdd(StringRef N, MachinePassCtor C, StringRef D) override
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
MachinePassRegistryListener - Listener to adds and removals of nodes in registration list...
virtual void NotifyAdd(StringRef N, MachinePassCtor C, StringRef D)=0
MachinePassRegistryNode ** getNextAddress()
virtual void NotifyRemove(StringRef N)=0
const NodeList & List
Definition: RDFGraph.cpp:210
#define N
MachinePassRegistryNode - Machine pass node stored in registration list.
MachinePassRegistryNode * getNext() const
void *(*)() MachinePassCtor
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
void setDefault(MachinePassCtor C)