MachinePassRegistry.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. //===- llvm/CodeGen/MachinePassRegistry.h -----------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file contains the mechanics for machine function pass registries. A
  10. // function pass registry (MachinePassRegistry) is auto filled by the static
  11. // constructors of MachinePassRegistryNode. Further there is a command line
  12. // parser (RegisterPassParser) which listens to each registry for additions
  13. // and deletions, so that the appropriate command option is updated.
  14. //
  15. //===----------------------------------------------------------------------===//
  16. #ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
  17. #define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
  18. #include "llvm/ADT/StringRef.h"
  19. #include "llvm/CodeGen/Passes.h"
  20. #include "llvm/Support/CommandLine.h"
  21. namespace llvm {
  22. //===----------------------------------------------------------------------===//
  23. ///
  24. /// MachinePassRegistryListener - Listener to adds and removals of nodes in
  25. /// registration list.
  26. ///
  27. //===----------------------------------------------------------------------===//
  28. template <class PassCtorTy> class MachinePassRegistryListener {
  29. virtual void anchor() {}
  30. public:
  31. MachinePassRegistryListener() = default;
  32. virtual ~MachinePassRegistryListener() = default;
  33. virtual void NotifyAdd(StringRef N, PassCtorTy C, StringRef D) = 0;
  34. virtual void NotifyRemove(StringRef N) = 0;
  35. };
  36. //===----------------------------------------------------------------------===//
  37. ///
  38. /// MachinePassRegistryNode - Machine pass node stored in registration list.
  39. ///
  40. //===----------------------------------------------------------------------===//
  41. template <typename PassCtorTy> class MachinePassRegistryNode {
  42. private:
  43. MachinePassRegistryNode *Next = nullptr; // Next function pass in list.
  44. StringRef Name; // Name of function pass.
  45. StringRef Description; // Description string.
  46. PassCtorTy Ctor; // Pass creator.
  47. public:
  48. MachinePassRegistryNode(const char *N, const char *D, PassCtorTy C)
  49. : Name(N), Description(D), Ctor(C) {}
  50. // Accessors
  51. MachinePassRegistryNode *getNext() const { return Next; }
  52. MachinePassRegistryNode **getNextAddress() { return &Next; }
  53. StringRef getName() const { return Name; }
  54. StringRef getDescription() const { return Description; }
  55. PassCtorTy getCtor() const { return Ctor; }
  56. void setNext(MachinePassRegistryNode *N) { Next = N; }
  57. };
  58. //===----------------------------------------------------------------------===//
  59. ///
  60. /// MachinePassRegistry - Track the registration of machine passes.
  61. ///
  62. //===----------------------------------------------------------------------===//
  63. template <typename PassCtorTy> class MachinePassRegistry {
  64. private:
  65. MachinePassRegistryNode<PassCtorTy> *List; // List of registry nodes.
  66. PassCtorTy Default; // Default function pass creator.
  67. MachinePassRegistryListener<PassCtorTy>
  68. *Listener; // Listener for list adds are removes.
  69. public:
  70. // NO CONSTRUCTOR - we don't want static constructor ordering to mess
  71. // with the registry.
  72. // Accessors.
  73. //
  74. MachinePassRegistryNode<PassCtorTy> *getList() { return List; }
  75. PassCtorTy getDefault() { return Default; }
  76. void setDefault(PassCtorTy C) { Default = C; }
  77. /// setDefault - Set the default constructor by name.
  78. void setDefault(StringRef Name) {
  79. PassCtorTy Ctor = nullptr;
  80. for (MachinePassRegistryNode<PassCtorTy> *R = getList(); R;
  81. R = R->getNext()) {
  82. if (R->getName() == Name) {
  83. Ctor = R->getCtor();
  84. break;
  85. }
  86. }
  87. assert(Ctor && "Unregistered pass name");
  88. setDefault(Ctor);
  89. }
  90. void setListener(MachinePassRegistryListener<PassCtorTy> *L) { Listener = L; }
  91. /// Add - Adds a function pass to the registration list.
  92. ///
  93. void Add(MachinePassRegistryNode<PassCtorTy> *Node) {
  94. Node->setNext(List);
  95. List = Node;
  96. if (Listener)
  97. Listener->NotifyAdd(Node->getName(), Node->getCtor(),
  98. Node->getDescription());
  99. }
  100. /// Remove - Removes a function pass from the registration list.
  101. ///
  102. void Remove(MachinePassRegistryNode<PassCtorTy> *Node) {
  103. for (MachinePassRegistryNode<PassCtorTy> **I = &List; *I;
  104. I = (*I)->getNextAddress()) {
  105. if (*I == Node) {
  106. if (Listener)
  107. Listener->NotifyRemove(Node->getName());
  108. *I = (*I)->getNext();
  109. break;
  110. }
  111. }
  112. }
  113. };
  114. //===----------------------------------------------------------------------===//
  115. ///
  116. /// RegisterPassParser class - Handle the addition of new machine passes.
  117. ///
  118. //===----------------------------------------------------------------------===//
  119. template <class RegistryClass>
  120. class RegisterPassParser
  121. : public MachinePassRegistryListener<
  122. typename RegistryClass::FunctionPassCtor>,
  123. public cl::parser<typename RegistryClass::FunctionPassCtor> {
  124. public:
  125. RegisterPassParser(cl::Option &O)
  126. : cl::parser<typename RegistryClass::FunctionPassCtor>(O) {}
  127. ~RegisterPassParser() override { RegistryClass::setListener(nullptr); }
  128. void initialize() {
  129. cl::parser<typename RegistryClass::FunctionPassCtor>::initialize();
  130. // Add existing passes to option.
  131. for (RegistryClass *Node = RegistryClass::getList();
  132. Node; Node = Node->getNext()) {
  133. this->addLiteralOption(Node->getName(),
  134. (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
  135. Node->getDescription());
  136. }
  137. // Make sure we listen for list changes.
  138. RegistryClass::setListener(this);
  139. }
  140. // Implement the MachinePassRegistryListener callbacks.
  141. void NotifyAdd(StringRef N, typename RegistryClass::FunctionPassCtor C,
  142. StringRef D) override {
  143. this->addLiteralOption(N, C, D);
  144. }
  145. void NotifyRemove(StringRef N) override {
  146. this->removeLiteralOption(N);
  147. }
  148. };
  149. } // end namespace llvm
  150. #endif // LLVM_CODEGEN_MACHINEPASSREGISTRY_H