MachinePassRegistry.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. #ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
  18. #define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
  19. #include "llvm/CodeGen/Passes.h"
  20. #include "llvm/Support/CommandLine.h"
  21. namespace llvm {
  22. typedef void *(*MachinePassCtor)();
  23. //===----------------------------------------------------------------------===//
  24. ///
  25. /// MachinePassRegistryListener - Listener to adds and removals of nodes in
  26. /// registration list.
  27. ///
  28. //===----------------------------------------------------------------------===//
  29. class MachinePassRegistryListener {
  30. virtual void anchor();
  31. public:
  32. MachinePassRegistryListener() {}
  33. virtual ~MachinePassRegistryListener() {}
  34. virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0;
  35. virtual void NotifyRemove(const char *N) = 0;
  36. };
  37. //===----------------------------------------------------------------------===//
  38. ///
  39. /// MachinePassRegistryNode - Machine pass node stored in registration list.
  40. ///
  41. //===----------------------------------------------------------------------===//
  42. class MachinePassRegistryNode {
  43. private:
  44. MachinePassRegistryNode *Next; // Next function pass in list.
  45. const char *Name; // Name of function pass.
  46. const char *Description; // Description string.
  47. MachinePassCtor Ctor; // Function pass creator.
  48. public:
  49. MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C)
  50. : Next(nullptr)
  51. , Name(N)
  52. , Description(D)
  53. , Ctor(C)
  54. {}
  55. // Accessors
  56. MachinePassRegistryNode *getNext() const { return Next; }
  57. MachinePassRegistryNode **getNextAddress() { return &Next; }
  58. const char *getName() const { return Name; }
  59. const char *getDescription() const { return Description; }
  60. MachinePassCtor getCtor() const { return Ctor; }
  61. void setNext(MachinePassRegistryNode *N) { Next = N; }
  62. };
  63. //===----------------------------------------------------------------------===//
  64. ///
  65. /// MachinePassRegistry - Track the registration of machine passes.
  66. ///
  67. //===----------------------------------------------------------------------===//
  68. class MachinePassRegistry {
  69. private:
  70. MachinePassRegistryNode *List; // List of registry nodes.
  71. MachinePassCtor Default; // Default function pass creator.
  72. MachinePassRegistryListener* Listener;// Listener for list adds are removes.
  73. public:
  74. // NO CONSTRUCTOR - we don't want static constructor ordering to mess
  75. // with the registry.
  76. // Accessors.
  77. //
  78. MachinePassRegistryNode *getList() { return List; }
  79. MachinePassCtor getDefault() { return Default; }
  80. void setDefault(MachinePassCtor C) { Default = C; }
  81. void setDefault(StringRef Name);
  82. void setListener(MachinePassRegistryListener *L) { Listener = L; }
  83. /// Add - Adds a function pass to the registration list.
  84. ///
  85. void Add(MachinePassRegistryNode *Node);
  86. /// Remove - Removes a function pass from the registration list.
  87. ///
  88. void Remove(MachinePassRegistryNode *Node);
  89. };
  90. //===----------------------------------------------------------------------===//
  91. ///
  92. /// RegisterPassParser class - Handle the addition of new machine passes.
  93. ///
  94. // //
  95. ///////////////////////////////////////////////////////////////////////////////
  96. template<class RegistryClass>
  97. class RegisterPassParser : public MachinePassRegistryListener,
  98. public cl::parser<typename RegistryClass::FunctionPassCtor> {
  99. public:
  100. RegisterPassParser(cl::Option &O)
  101. : cl::parser<typename RegistryClass::FunctionPassCtor>(O) {}
  102. ~RegisterPassParser() override { RegistryClass::setListener(nullptr); }
  103. void initialize() {
  104. cl::parser<typename RegistryClass::FunctionPassCtor>::initialize();
  105. // Add existing passes to option.
  106. for (RegistryClass *Node = RegistryClass::getList();
  107. Node; Node = Node->getNext()) {
  108. this->addLiteralOption(Node->getName(),
  109. (typename RegistryClass::FunctionPassCtor)Node->getCtor(),
  110. Node->getDescription());
  111. }
  112. // Make sure we listen for list changes.
  113. RegistryClass::setListener(this);
  114. }
  115. // Implement the MachinePassRegistryListener callbacks.
  116. //
  117. void NotifyAdd(const char *N, MachinePassCtor C, const char *D) override {
  118. this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D);
  119. }
  120. void NotifyRemove(const char *N) override {
  121. this->removeLiteralOption(N);
  122. }
  123. };
  124. } // end namespace llvm
  125. #endif