MachinePassRegistry.h revision 9ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3b
1c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===// 2c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// 3c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// The LLVM Compiler Infrastructure 4c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// 59ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey// This file was developed by the James M. Laskey and is distributed under 6c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey// the University of Illinois Open Source 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/CodeGen/ScheduleDAG.h" 23c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#include "llvm/Support/CommandLine.h" 24c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 25c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeynamespace llvm { 26c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 27c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 28c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 29c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 30c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistryListener - Listener to adds and removals of nodes in 31c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// registration list. 32c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 33c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 34c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistryListener { 35c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 36c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryListener() {} 37c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey virtual ~MachinePassRegistryListener() {} 38c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey virtual void NotifyAdd(const char *N, const char *D) = 0; 39c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey virtual void NotifyRemove(const char *N, const char *D) = 0; 40c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 41c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 42c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 43c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 44c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 45c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistryNode - Machine pass node stored in registration list. 46c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 47c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 48c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeytemplate<typename FunctionPassCtor> 49c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistryNode { 50c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 51c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyprivate: 52c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 53c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *Next;// Next function pass in list. 54c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const char *Name; // Name of function pass. 55c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const char *Description; // Description string. 56c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey FunctionPassCtor Ctor; // Function pass creator. 57c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 58c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 59c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 60c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode(const char *N, const char *D, FunctionPassCtor C) 61c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey : Next(NULL) 62c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey , Name(N) 63c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey , Description(D) 64c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey , Ctor(C) 65c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey {} 66c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 67c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Accessors 68c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *getNext() 69c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const { return Next; } 70c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> **getNextAddress() 71c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey { return &Next; } 72c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const char *getName() const { return Name; } 73c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey const char *getDescription() const { return Description; } 74c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey FunctionPassCtor getCtor() const { return Ctor; } 75c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey void setNext(MachinePassRegistryNode<FunctionPassCtor> *N) { Next = N; } 76c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 77c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 78c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 79c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 80c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 81c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 82c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// MachinePassRegistry - Track the registration of machine passes. 83c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 84c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 85c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeytemplate<typename FunctionPassCtor> 86c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachinePassRegistry { 87c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 88c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyprivate: 89c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 90c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *List; 91c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // List of registry nodes. 929ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey FunctionPassCtor Default; // Default function pass creator. 93c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryListener* Listener;// Listener for list adds are removes. 94c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 95c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 96c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 97c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // NO CONSTRUCTOR - we don't want static constructor ordering to mess 98c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // with the registry. 99c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 100c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Accessors. 101c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // 102c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *getList() { return List; } 1039ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey FunctionPassCtor getDefault() { return Default; } 1049ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey void setDefault(FunctionPassCtor C) { Default = C; } 105c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey void setListener(MachinePassRegistryListener *L) { Listener = L; } 106c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 107c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// Add - Adds a function pass to the registration list. 108c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// 109c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey void Add(MachinePassRegistryNode<FunctionPassCtor> *Node) { 110c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey Node->setNext(List); 111c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey List = Node; 112c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey if (Listener) Listener->NotifyAdd(Node->getName(), Node->getDescription()); 113c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 114c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 115c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 116c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// Remove - Removes a function pass from the registration list. 117c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// 118c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey void Remove(MachinePassRegistryNode<FunctionPassCtor> *Node) { 119c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey for (MachinePassRegistryNode<FunctionPassCtor> **I = &List; 120c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey *I; I = (*I)->getNextAddress()) { 121c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey if (*I == Node) { 122c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey if (Listener) Listener->NotifyRemove(Node->getName(), 123c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey Node->getDescription()); 124c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey *I = (*I)->getNext(); 125c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey break; 126c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 127c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 128c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 129c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 130c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 131c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// FInd - Finds and returns a function pass in registration list, otherwise 132c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// returns NULL. 133c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *Find(const char *Name) { 134c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey for (MachinePassRegistryNode<FunctionPassCtor> *I = List; 135c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey I; I = I->getNext()) { 136c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey if (std::string(Name) == std::string(I->getName())) return I; 137c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 138c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return NULL; 139c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 140c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 141c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 142c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 143c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 144c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 145c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 146c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 147c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// RegisterRegAlloc class - Track the registration of register allocators. 148c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 149c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 150c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass RegisterRegAlloc : public MachinePassRegistryNode<FunctionPass *(*)()> { 151c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 152c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 153c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 154c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey typedef FunctionPass *(*FunctionPassCtor)(); 155c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 156c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static MachinePassRegistry<FunctionPassCtor> Registry; 157c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 158c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C) 159c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey : MachinePassRegistryNode<FunctionPassCtor>(N, D, C) 160c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey { Registry.Add(this); } 161c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey ~RegisterRegAlloc() { Registry.Remove(this); } 162c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 163c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 164c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Accessors. 165c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // 166c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegisterRegAlloc *getNext() const { 167c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return (RegisterRegAlloc *) 168c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor>::getNext(); 169c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 170c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static RegisterRegAlloc *getList() { 171c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return (RegisterRegAlloc *)Registry.getList(); 172c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 1739ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey static FunctionPassCtor getDefault() { 1749ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey return Registry.getDefault(); 175c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 1769ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey static void setDefault(FunctionPassCtor C) { 1779ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey Registry.setDefault(C); 178c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 179c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static void setListener(MachinePassRegistryListener *L) { 180c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey Registry.setListener(L); 181c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 182c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 183c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 184c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// FirstCtor - Finds the first register allocator in registration 185c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// list and returns its creator function, otherwise return NULL. 186c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static FunctionPassCtor FirstCtor() { 187c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.getList(); 188c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return Node ? Node->getCtor() : NULL; 189c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 190c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 191c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// FindCtor - Finds a register allocator in registration list and returns 192c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// its creator function, otherwise return NULL. 193c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static FunctionPassCtor FindCtor(const char *N) { 194c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.Find(N); 195c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return Node ? Node->getCtor() : NULL; 196c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 197c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 198c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 199c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 200c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 201c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 202c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 203c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// RegisterScheduler class - Track the registration of instruction schedulers. 204c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 205c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 206c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 2079ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskeyclass SelectionDAGISel; 208c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass ScheduleDAG; 209c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass SelectionDAG; 210c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass MachineBasicBlock; 211c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 212c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass RegisterScheduler : public 2139ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey MachinePassRegistryNode< 2149ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey ScheduleDAG *(*)(SelectionDAGISel*, SelectionDAG*, MachineBasicBlock*)> { 215c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 216c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 217c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 2189ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey typedef ScheduleDAG *(*FunctionPassCtor)(SelectionDAGISel*, SelectionDAG*, 2199ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey MachineBasicBlock*); 220c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 221c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static MachinePassRegistry<FunctionPassCtor> Registry; 222c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 223c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegisterScheduler(const char *N, const char *D, FunctionPassCtor C) 224c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey : MachinePassRegistryNode<FunctionPassCtor>(N, D, C) 225c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey { Registry.Add(this); } 226c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey ~RegisterScheduler() { Registry.Remove(this); } 227c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 228c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 229c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Accessors. 230c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // 231c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegisterScheduler *getNext() const { 232c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return (RegisterScheduler *) 233c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor>::getNext(); 234c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 235c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static RegisterScheduler *getList() { 236c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return (RegisterScheduler *)Registry.getList(); 237c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 2389ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey static FunctionPassCtor getDefault() { 2399ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey return Registry.getDefault(); 240c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 2419ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey static void setDefault(FunctionPassCtor C) { 2429ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey Registry.setDefault(C); 243c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 244c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static void setListener(MachinePassRegistryListener *L) { 245c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey Registry.setListener(L); 246c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 247c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 248c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 249c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// FirstCtor - Finds the first instruction scheduler in registration 250c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// list and returns its creator function, otherwise return NULL. 251c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static FunctionPassCtor FirstCtor() { 252c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.getList(); 253c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return Node ? Node->getCtor() : NULL; 254c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 255c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 256c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 257c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// FindCtor - Finds a instruction scheduler in registration list and returns 258c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey /// its creator function, otherwise return NULL. 259c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static FunctionPassCtor FindCtor(const char *N) { 260c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey MachinePassRegistryNode<FunctionPassCtor> *Node = Registry.Find(N); 261c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return Node ? Node->getCtor() : NULL; 262c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 263c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 264c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 265c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 266c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 267c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 268c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 269c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// RegisterPassParser class - Handle the addition of new machine passes. 270c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey/// 271c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey//===----------------------------------------------------------------------===// 272c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeytemplate<class RegistryClass> 273c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeyclass RegisterPassParser : public MachinePassRegistryListener, 274c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey public cl::parser<const char *> { 275c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskeypublic: 276c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegisterPassParser() {} 2779ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3bJim Laskey ~RegisterPassParser() { RegistryClass::setListener(NULL); } 278c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 279c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey void initialize(cl::Option &O) { 280c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey cl::parser<const char *>::initialize(O); 281c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 282c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Add existing passes to option. 283c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey for (RegistryClass *Node = RegistryClass::getList(); 284c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey Node; Node = Node->getNext()) { 285c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey addLiteralOption(Node->getName(), Node->getName(), 286c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey Node->getDescription()); 287c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 288c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 289c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Make sure we listen for list changes. 290c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegistryClass::setListener(this); 291c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 292c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 293c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // Implement the MachinePassRegistryListener callbacks. 294c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // 295c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey virtual void NotifyAdd(const char *N, const char *D) { 296c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey addLiteralOption(N, N, D); 297c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 298c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey virtual void NotifyRemove(const char *N, const char *D) { 299c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey removeLiteralOption(N); 300c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 301c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 302c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // ValLessThan - Provide a sorting comparator for Values elements... 303c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey typedef std::pair<const char*, std::pair<const char*, const char*> > ValType; 304c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey static bool ValLessThan(const ValType &VT1, const ValType &VT2) { 305c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey return std::string(VT1.first) < std::string(VT2.first); 306c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 307c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 308c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // printOptionInfo - Print out information about this option. Override the 309c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey // default implementation to sort the table before we print... 310c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey virtual void printOptionInfo(const cl::Option &O, unsigned GlobalWidth) const{ 311c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey RegisterPassParser *PNP = const_cast<RegisterPassParser*>(this); 312c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey std::sort(PNP->Values.begin(), PNP->Values.end(), ValLessThan); 313c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey cl::parser<const char *>::printOptionInfo(O, GlobalWidth); 314c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey } 315c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey}; 316c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 317c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 318c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey} // end namespace llvm 319c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey 320c6a0a117a63b22ac8f4ae1aaa16a4a4fb57a45f1Jim Laskey#endif 321