MachinePassRegistry.h revision 234353
177957Sbenno//===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===// 277957Sbenno// 377957Sbenno// The LLVM Compiler Infrastructure 477957Sbenno// 577957Sbenno// This file is distributed under the University of Illinois Open Source 677957Sbenno// License. See LICENSE.TXT for details. 777957Sbenno// 877957Sbenno//===----------------------------------------------------------------------===// 977957Sbenno// 1077957Sbenno// This file contains the mechanics for machine function pass registries. A 1177957Sbenno// function pass registry (MachinePassRegistry) is auto filled by the static 1277957Sbenno// constructors of MachinePassRegistryNode. Further there is a command line 1377957Sbenno// parser (RegisterPassParser) which listens to each registry for additions 1477957Sbenno// and deletions, so that the appropriate command option is updated. 1577957Sbenno// 1677957Sbenno//===----------------------------------------------------------------------===// 1777957Sbenno 1877957Sbenno#ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H 1977957Sbenno#define LLVM_CODEGEN_MACHINEPASSREGISTRY_H 2077957Sbenno 2177957Sbenno#include "llvm/CodeGen/Passes.h" 2277957Sbenno#include "llvm/Support/CommandLine.h" 2377957Sbenno 2477957Sbennonamespace llvm { 2577957Sbenno 2677957Sbennotypedef void *(*MachinePassCtor)(); 2777957Sbenno 2877957Sbenno 2977957Sbenno//===----------------------------------------------------------------------===// 3077957Sbenno/// 3177957Sbenno/// MachinePassRegistryListener - Listener to adds and removals of nodes in 3277957Sbenno/// registration list. 3377957Sbenno/// 34113038Sobrien//===----------------------------------------------------------------------===// 35113038Sobrienclass MachinePassRegistryListener { 3677957Sbenno virtual void anchor(); 3777957Sbennopublic: 3890643Sbenno MachinePassRegistryListener() {} 3977957Sbenno virtual ~MachinePassRegistryListener() {} 4077957Sbenno virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0; 4177957Sbenno virtual void NotifyRemove(const char *N) = 0; 4277957Sbenno}; 4377957Sbenno 4477957Sbenno 4577957Sbenno//===----------------------------------------------------------------------===// 4677957Sbenno/// 4777957Sbenno/// MachinePassRegistryNode - Machine pass node stored in registration list. 4877957Sbenno/// 4977957Sbenno//===----------------------------------------------------------------------===// 5077957Sbennoclass MachinePassRegistryNode { 5177957Sbenno 52private: 53 54 MachinePassRegistryNode *Next; // Next function pass in list. 55 const char *Name; // Name of function pass. 56 const char *Description; // Description string. 57 MachinePassCtor Ctor; // Function pass creator. 58 59public: 60 61 MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C) 62 : Next(NULL) 63 , Name(N) 64 , Description(D) 65 , Ctor(C) 66 {} 67 68 // Accessors 69 MachinePassRegistryNode *getNext() const { return Next; } 70 MachinePassRegistryNode **getNextAddress() { return &Next; } 71 const char *getName() const { return Name; } 72 const char *getDescription() const { return Description; } 73 MachinePassCtor getCtor() const { return Ctor; } 74 void setNext(MachinePassRegistryNode *N) { Next = N; } 75 76}; 77 78 79//===----------------------------------------------------------------------===// 80/// 81/// MachinePassRegistry - Track the registration of machine passes. 82/// 83//===----------------------------------------------------------------------===// 84class MachinePassRegistry { 85 86private: 87 88 MachinePassRegistryNode *List; // List of registry nodes. 89 MachinePassCtor Default; // Default function pass creator. 90 MachinePassRegistryListener* Listener;// Listener for list adds are removes. 91 92public: 93 94 // NO CONSTRUCTOR - we don't want static constructor ordering to mess 95 // with the registry. 96 97 // Accessors. 98 // 99 MachinePassRegistryNode *getList() { return List; } 100 MachinePassCtor getDefault() { return Default; } 101 void setDefault(MachinePassCtor C) { Default = C; } 102 void setListener(MachinePassRegistryListener *L) { Listener = L; } 103 104 /// Add - Adds a function pass to the registration list. 105 /// 106 void Add(MachinePassRegistryNode *Node); 107 108 /// Remove - Removes a function pass from the registration list. 109 /// 110 void Remove(MachinePassRegistryNode *Node); 111 112}; 113 114 115//===----------------------------------------------------------------------===// 116/// 117/// RegisterPassParser class - Handle the addition of new machine passes. 118/// 119//===----------------------------------------------------------------------===// 120template<class RegistryClass> 121class RegisterPassParser : public MachinePassRegistryListener, 122 public cl::parser<typename RegistryClass::FunctionPassCtor> { 123public: 124 RegisterPassParser() {} 125 ~RegisterPassParser() { RegistryClass::setListener(NULL); } 126 127 void initialize(cl::Option &O) { 128 cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O); 129 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 138 // Make sure we listen for list changes. 139 RegistryClass::setListener(this); 140 } 141 142 // Implement the MachinePassRegistryListener callbacks. 143 // 144 virtual void NotifyAdd(const char *N, 145 MachinePassCtor C, 146 const char *D) { 147 this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D); 148 } 149 virtual void NotifyRemove(const char *N) { 150 this->removeLiteralOption(N); 151 } 152}; 153 154 155} // end namespace llvm 156 157#endif 158