1c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===// 2c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// 3c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// The LLVM Compiler Infrastructure 4c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// 8c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 99ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// 109ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// This file contains the mechanics for machine function pass registries. A 119ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// function pass registry (MachinePassRegistry) is auto filled by the static 129ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// constructors of MachinePassRegistryNode. Further there is a command line 139ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// parser (RegisterPassParser) which listens to each registry for additions 149ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// and deletions, so that the appropriate command option is updated. 159ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// 169ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey//===----------------------------------------------------------------------===// 17c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 18c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H 19c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#define LLVM_CODEGEN_MACHINEPASSREGISTRY_H 20c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 21c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#include "llvm/CodeGen/Passes.h" 22c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#include "llvm/Support/CommandLine.h" 23c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 24c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeynamespace llvm { 25c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 26eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskeytypedef void *(*MachinePassCtor)(); 27eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey 28c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 2927745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick//===----------------------------------------------------------------------===// 30c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 31c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistryListener - Listener to adds and removals of nodes in 32c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// registration list. 33c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 34c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 35c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistryListener { 362d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 37c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 38c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryListener() {} 39c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey virtual ~MachinePassRegistryListener() {} 40eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0; 41eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey virtual void NotifyRemove(const char *N) = 0; 42c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 43c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 44c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 4527745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick//===----------------------------------------------------------------------===// 46c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 47c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistryNode - Machine pass node stored in registration list. 48c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 49c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 50c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistryNode { 51c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 52c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyprivate: 53c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 54eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassRegistryNode *Next; // Next function pass in list. 55c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const char *Name; // Name of function pass. 56c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const char *Description; // Description string. 57eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassCtor Ctor; // Function pass creator. 5827745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick 59c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 60c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 61eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C) 62c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey : Next(NULL) 63c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey , Name(N) 64c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey , Description(D) 65c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey , Ctor(C) 66c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey {} 67c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 68c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Accessors 69eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassRegistryNode *getNext() const { return Next; } 70eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassRegistryNode **getNextAddress() { return &Next; } 71c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const char *getName() const { return Name; } 72c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const char *getDescription() const { return Description; } 73eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassCtor getCtor() const { return Ctor; } 74eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey void setNext(MachinePassRegistryNode *N) { Next = N; } 7527745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick 76c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 77c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 78c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 7927745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick//===----------------------------------------------------------------------===// 80c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 81c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistry - Track the registration of machine passes. 82c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 83c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 84c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistry { 85c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 86c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyprivate: 87c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 88eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassRegistryNode *List; // List of registry nodes. 89eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassCtor Default; // Default function pass creator. 90c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryListener* Listener;// Listener for list adds are removes. 9127745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick 92c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 93c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 94c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // NO CONSTRUCTOR - we don't want static constructor ordering to mess 95c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // with the registry. 96c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 97c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Accessors. 98c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // 99eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassRegistryNode *getList() { return List; } 100eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassCtor getDefault() { return Default; } 101eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey void setDefault(MachinePassCtor C) { Default = C; } 102fc728fbdc2631ce8f343cf9b7292d218fde7419fAndrew Trick void setDefault(StringRef Name); 103c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey void setListener(MachinePassRegistryListener *L) { Listener = L; } 104c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 105c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// Add - Adds a function pass to the registration list. 106c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// 107eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey void Add(MachinePassRegistryNode *Node); 108c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 109c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// Remove - Removes a function pass from the registration list. 110c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// 111eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey void Remove(MachinePassRegistryNode *Node); 112c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 113c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 114c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 115c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 116c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 117c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 118c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// RegisterPassParser class - Handle the addition of new machine passes. 119c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 120c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 121c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeytemplate<class RegistryClass> 122c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass RegisterPassParser : public MachinePassRegistryListener, 123eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey public cl::parser<typename RegistryClass::FunctionPassCtor> { 124c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 125c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegisterPassParser() {} 1269ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey ~RegisterPassParser() { RegistryClass::setListener(NULL); } 127c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 128c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey void initialize(cl::Option &O) { 129eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey cl::parser<typename RegistryClass::FunctionPassCtor>::initialize(O); 13027745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick 131c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Add existing passes to option. 132c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey for (RegistryClass *Node = RegistryClass::getList(); 133c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey Node; Node = Node->getNext()) { 134a6923131032be5e47b5e1155e69b23aa4c5e65acJohn McCall this->addLiteralOption(Node->getName(), 135eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey (typename RegistryClass::FunctionPassCtor)Node->getCtor(), 136a6923131032be5e47b5e1155e69b23aa4c5e65acJohn McCall Node->getDescription()); 137c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 13827745c19a957f1298cc2c56e6dabea5ef244a1c8Andrew Trick 139c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Make sure we listen for list changes. 140c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegistryClass::setListener(this); 141c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 142c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 143c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Implement the MachinePassRegistryListener callbacks. 144c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // 145eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey virtual void NotifyAdd(const char *N, 146eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey MachinePassCtor C, 147eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey const char *D) { 148eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D); 149c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 150eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey virtual void NotifyRemove(const char *N) { 151eb577ba3b815a1fa4627b060dd2345d17abf672dJim Laskey this->removeLiteralOption(N); 152c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 153c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 154c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 155c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 156c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey} // end namespace llvm 157c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 158c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#endif 159