]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/CodeGen/MachinePassRegistry.h
Upgrade our copies of clang, llvm, lld, lldb, compiler-rt and libc++ to
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / CodeGen / MachinePassRegistry.h
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"
23 #include "llvm/Support/CommandLine.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 //===----------------------------------------------------------------------===//
35 class MachinePassRegistryListener {
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 //===----------------------------------------------------------------------===//
51 class MachinePassRegistryNode {
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; }
64   MachinePassRegistryNode **getNextAddress()    { 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 //===----------------------------------------------------------------------===//
76 class MachinePassRegistry {
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   //
88   MachinePassRegistryNode *getList()                    { return List; }
89   MachinePassCtor getDefault()                          { return Default; }
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>
109 class RegisterPassParser : public MachinePassRegistryListener,
110                    public cl::parser<typename RegistryClass::FunctionPassCtor> {
111 public:
112   RegisterPassParser(cl::Option &O)
113       : cl::parser<typename RegistryClass::FunctionPassCtor>(O) {}
114   ~RegisterPassParser() override { RegistryClass::setListener(nullptr); }
115
116   void initialize() {
117     cl::parser<typename RegistryClass::FunctionPassCtor>::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.
132   void NotifyAdd(StringRef N, MachinePassCtor C, StringRef D) override {
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