1193323Sed//===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed// 10193323Sed// This file contains the mechanics for machine function pass registries. A 11193323Sed// function pass registry (MachinePassRegistry) is auto filled by the static 12193323Sed// constructors of MachinePassRegistryNode. Further there is a command line 13193323Sed// parser (RegisterPassParser) which listens to each registry for additions 14193323Sed// and deletions, so that the appropriate command option is updated. 15193323Sed// 16193323Sed//===----------------------------------------------------------------------===// 17193323Sed 18193323Sed#ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H 19193323Sed#define LLVM_CODEGEN_MACHINEPASSREGISTRY_H 20193323Sed 21193323Sed#include "llvm/CodeGen/Passes.h" 22193323Sed#include "llvm/Support/CommandLine.h" 23193323Sed 24193323Sednamespace llvm { 25193323Sed 26193323Sedtypedef void *(*MachinePassCtor)(); 27193323Sed 28193323Sed 29239462Sdim//===----------------------------------------------------------------------===// 30193323Sed/// 31193323Sed/// MachinePassRegistryListener - Listener to adds and removals of nodes in 32193323Sed/// registration list. 33193323Sed/// 34193323Sed//===----------------------------------------------------------------------===// 35193323Sedclass MachinePassRegistryListener { 36234353Sdim virtual void anchor(); 37193323Sedpublic: 38193323Sed MachinePassRegistryListener() {} 39193323Sed virtual ~MachinePassRegistryListener() {} 40193323Sed virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0; 41193323Sed virtual void NotifyRemove(const char *N) = 0; 42193323Sed}; 43193323Sed 44193323Sed 45239462Sdim//===----------------------------------------------------------------------===// 46193323Sed/// 47193323Sed/// MachinePassRegistryNode - Machine pass node stored in registration list. 48193323Sed/// 49193323Sed//===----------------------------------------------------------------------===// 50193323Sedclass MachinePassRegistryNode { 51193323Sed 52193323Sedprivate: 53193323Sed 54193323Sed MachinePassRegistryNode *Next; // Next function pass in list. 55193323Sed const char *Name; // Name of function pass. 56193323Sed const char *Description; // Description string. 57193323Sed MachinePassCtor Ctor; // Function pass creator. 58239462Sdim 59193323Sedpublic: 60193323Sed 61193323Sed MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C) 62193323Sed : Next(NULL) 63193323Sed , Name(N) 64193323Sed , Description(D) 65193323Sed , Ctor(C) 66193323Sed {} 67193323Sed 68193323Sed // Accessors 69193323Sed MachinePassRegistryNode *getNext() const { return Next; } 70193323Sed MachinePassRegistryNode **getNextAddress() { return &Next; } 71193323Sed const char *getName() const { return Name; } 72193323Sed const char *getDescription() const { return Description; } 73193323Sed MachinePassCtor getCtor() const { return Ctor; } 74193323Sed void setNext(MachinePassRegistryNode *N) { Next = N; } 75239462Sdim 76193323Sed}; 77193323Sed 78193323Sed 79239462Sdim//===----------------------------------------------------------------------===// 80193323Sed/// 81193323Sed/// MachinePassRegistry - Track the registration of machine passes. 82193323Sed/// 83193323Sed//===----------------------------------------------------------------------===// 84193323Sedclass MachinePassRegistry { 85193323Sed 86193323Sedprivate: 87193323Sed 88193323Sed MachinePassRegistryNode *List; // List of registry nodes. 89193323Sed MachinePassCtor Default; // Default function pass creator. 90193323Sed MachinePassRegistryListener* Listener;// Listener for list adds are removes. 91239462Sdim 92193323Sedpublic: 93193323Sed 94193323Sed // NO CONSTRUCTOR - we don't want static constructor ordering to mess 95193323Sed // with the registry. 96193323Sed 97193323Sed // Accessors. 98193323Sed // 99193323Sed MachinePassRegistryNode *getList() { return List; } 100193323Sed MachinePassCtor getDefault() { return Default; } 101193323Sed void setDefault(MachinePassCtor C) { Default = C; } 102239462Sdim void setDefault(StringRef Name); 103193323Sed void setListener(MachinePassRegistryListener *L) { Listener = L; } 104193323Sed 105193323Sed /// Add - Adds a function pass to the registration list. 106193323Sed /// 107193323Sed void Add(MachinePassRegistryNode *Node); 108193323Sed 109193323Sed /// Remove - Removes a function pass from the registration list. 110193323Sed /// 111193323Sed void Remove(MachinePassRegistryNode *Node); 112193323Sed 113193323Sed}; 114193323Sed 115193323Sed 116193323Sed//===----------------------------------------------------------------------===// 117193323Sed/// 118193323Sed/// RegisterPassParser class - Handle the addition of new machine passes. 119193323Sed/// 120193323Sed//===----------------------------------------------------------------------===// 121193323Sedtemplate<class RegistryClass> 122193323Sedclass RegisterPassParser : public MachinePassRegistryListener, 123193323Sed public cl::parser<typename RegistryClass::FunctionPassCtor> { 124193323Sedpublic: 125193323Sed RegisterPassParser() {} 126193323Sed ~RegisterPassParser() { RegistryClass::setListener(NULL); } 127193323Sed 128193323Sed void initialize(cl::Option &O) { 129193323Sed cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O); 130239462Sdim 131193323Sed // Add existing passes to option. 132193323Sed for (RegistryClass *Node = RegistryClass::getList(); 133193323Sed Node; Node = Node->getNext()) { 134201360Srdivacky this->addLiteralOption(Node->getName(), 135193323Sed (typename RegistryClass::FunctionPassCtor)Node->getCtor(), 136201360Srdivacky Node->getDescription()); 137193323Sed } 138239462Sdim 139193323Sed // Make sure we listen for list changes. 140193323Sed RegistryClass::setListener(this); 141193323Sed } 142193323Sed 143193323Sed // Implement the MachinePassRegistryListener callbacks. 144193323Sed // 145193323Sed virtual void NotifyAdd(const char *N, 146193323Sed MachinePassCtor C, 147193323Sed const char *D) { 148193323Sed this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D); 149193323Sed } 150193323Sed virtual void NotifyRemove(const char *N) { 151193323Sed this->removeLiteralOption(N); 152193323Sed } 153193323Sed}; 154193323Sed 155193323Sed 156193323Sed} // end namespace llvm 157193323Sed 158193323Sed#endif 159