X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FCodeGen%2FMachinePassRegistry.h;h=90ee7f4bb9e7d6f1cea77e8f785d26d7b77d2f5d;hb=af650354a1de1254c0937a9f6e9c88f447ad3889;hp=97ecaae1842074809d219fa65bfe9512d8457027;hpb=9ff542f2cce5bf7bf3cf9f692cf3ec0690ad2b3b;p=oota-llvm.git diff --git a/include/llvm/CodeGen/MachinePassRegistry.h b/include/llvm/CodeGen/MachinePassRegistry.h index 97ecaae1842..90ee7f4bb9e 100644 --- a/include/llvm/CodeGen/MachinePassRegistry.h +++ b/include/llvm/CodeGen/MachinePassRegistry.h @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the James M. Laskey and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -19,45 +19,46 @@ #define LLVM_CODEGEN_MACHINEPASSREGISTRY_H #include "llvm/CodeGen/Passes.h" -#include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/Support/CommandLine.h" namespace llvm { +typedef void *(*MachinePassCtor)(); -//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// /// /// MachinePassRegistryListener - Listener to adds and removals of nodes in /// registration list. /// //===----------------------------------------------------------------------===// class MachinePassRegistryListener { + virtual void anchor(); public: MachinePassRegistryListener() {} virtual ~MachinePassRegistryListener() {} - virtual void NotifyAdd(const char *N, const char *D) = 0; - virtual void NotifyRemove(const char *N, const char *D) = 0; + virtual void NotifyAdd(const char *N, MachinePassCtor C, const char *D) = 0; + virtual void NotifyRemove(const char *N) = 0; }; -//===----------------------------------------------------------------------===// +//===----------------------------------------------------------------------===// /// /// MachinePassRegistryNode - Machine pass node stored in registration list. /// //===----------------------------------------------------------------------===// -template class MachinePassRegistryNode { private: - MachinePassRegistryNode *Next;// Next function pass in list. + MachinePassRegistryNode *Next; // Next function pass in list. const char *Name; // Name of function pass. const char *Description; // Description string. - FunctionPassCtor Ctor; // Function pass creator. - + MachinePassCtor Ctor; // Function pass creator. + public: - MachinePassRegistryNode(const char *N, const char *D, FunctionPassCtor C) + MachinePassRegistryNode(const char *N, const char *D, MachinePassCtor C) : Next(NULL) , Name(N) , Description(D) @@ -65,33 +66,29 @@ public: {} // Accessors - MachinePassRegistryNode *getNext() - const { return Next; } - MachinePassRegistryNode **getNextAddress() - { return &Next; } + MachinePassRegistryNode *getNext() const { return Next; } + MachinePassRegistryNode **getNextAddress() { return &Next; } const char *getName() const { return Name; } const char *getDescription() const { return Description; } - FunctionPassCtor getCtor() const { return Ctor; } - void setNext(MachinePassRegistryNode *N) { Next = N; } - + MachinePassCtor getCtor() const { return Ctor; } + void setNext(MachinePassRegistryNode *N) { Next = N; } + }; -//===----------------------------------------------------------------------===// +//===----------------------------------------------------------------------===// /// /// MachinePassRegistry - Track the registration of machine passes. /// //===----------------------------------------------------------------------===// -template class MachinePassRegistry { private: - MachinePassRegistryNode *List; - // List of registry nodes. - FunctionPassCtor Default; // Default function pass creator. + MachinePassRegistryNode *List; // List of registry nodes. + MachinePassCtor Default; // Default function pass creator. MachinePassRegistryListener* Listener;// Listener for list adds are removes. - + public: // NO CONSTRUCTOR - we don't want static constructor ordering to mess @@ -99,171 +96,23 @@ public: // Accessors. // - MachinePassRegistryNode *getList() { return List; } - FunctionPassCtor getDefault() { return Default; } - void setDefault(FunctionPassCtor C) { Default = C; } + MachinePassRegistryNode *getList() { return List; } + MachinePassCtor getDefault() { return Default; } + void setDefault(MachinePassCtor C) { Default = C; } + void setDefault(StringRef Name); void setListener(MachinePassRegistryListener *L) { Listener = L; } /// Add - Adds a function pass to the registration list. /// - void Add(MachinePassRegistryNode *Node) { - Node->setNext(List); - List = Node; - if (Listener) Listener->NotifyAdd(Node->getName(), Node->getDescription()); - } - + void Add(MachinePassRegistryNode *Node); /// Remove - Removes a function pass from the registration list. /// - void Remove(MachinePassRegistryNode *Node) { - for (MachinePassRegistryNode **I = &List; - *I; I = (*I)->getNextAddress()) { - if (*I == Node) { - if (Listener) Listener->NotifyRemove(Node->getName(), - Node->getDescription()); - *I = (*I)->getNext(); - break; - } - } - } - - - /// FInd - Finds and returns a function pass in registration list, otherwise - /// returns NULL. - MachinePassRegistryNode *Find(const char *Name) { - for (MachinePassRegistryNode *I = List; - I; I = I->getNext()) { - if (std::string(Name) == std::string(I->getName())) return I; - } - return NULL; - } - + void Remove(MachinePassRegistryNode *Node); }; -//===----------------------------------------------------------------------===// -/// -/// RegisterRegAlloc class - Track the registration of register allocators. -/// -//===----------------------------------------------------------------------===// -class RegisterRegAlloc : public MachinePassRegistryNode { - -public: - - typedef FunctionPass *(*FunctionPassCtor)(); - - static MachinePassRegistry Registry; - - RegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C) - : MachinePassRegistryNode(N, D, C) - { Registry.Add(this); } - ~RegisterRegAlloc() { Registry.Remove(this); } - - - // Accessors. - // - RegisterRegAlloc *getNext() const { - return (RegisterRegAlloc *) - MachinePassRegistryNode::getNext(); - } - static RegisterRegAlloc *getList() { - return (RegisterRegAlloc *)Registry.getList(); - } - static FunctionPassCtor getDefault() { - return Registry.getDefault(); - } - static void setDefault(FunctionPassCtor C) { - Registry.setDefault(C); - } - static void setListener(MachinePassRegistryListener *L) { - Registry.setListener(L); - } - - - /// FirstCtor - Finds the first register allocator in registration - /// list and returns its creator function, otherwise return NULL. - static FunctionPassCtor FirstCtor() { - MachinePassRegistryNode *Node = Registry.getList(); - return Node ? Node->getCtor() : NULL; - } - - /// FindCtor - Finds a register allocator in registration list and returns - /// its creator function, otherwise return NULL. - static FunctionPassCtor FindCtor(const char *N) { - MachinePassRegistryNode *Node = Registry.Find(N); - return Node ? Node->getCtor() : NULL; - } - -}; - - -//===----------------------------------------------------------------------===// -/// -/// RegisterScheduler class - Track the registration of instruction schedulers. -/// -//===----------------------------------------------------------------------===// - -class SelectionDAGISel; -class ScheduleDAG; -class SelectionDAG; -class MachineBasicBlock; - -class RegisterScheduler : public - MachinePassRegistryNode< - ScheduleDAG *(*)(SelectionDAGISel*, SelectionDAG*, MachineBasicBlock*)> { - -public: - - typedef ScheduleDAG *(*FunctionPassCtor)(SelectionDAGISel*, SelectionDAG*, - MachineBasicBlock*); - - static MachinePassRegistry Registry; - - RegisterScheduler(const char *N, const char *D, FunctionPassCtor C) - : MachinePassRegistryNode(N, D, C) - { Registry.Add(this); } - ~RegisterScheduler() { Registry.Remove(this); } - - - // Accessors. - // - RegisterScheduler *getNext() const { - return (RegisterScheduler *) - MachinePassRegistryNode::getNext(); - } - static RegisterScheduler *getList() { - return (RegisterScheduler *)Registry.getList(); - } - static FunctionPassCtor getDefault() { - return Registry.getDefault(); - } - static void setDefault(FunctionPassCtor C) { - Registry.setDefault(C); - } - static void setListener(MachinePassRegistryListener *L) { - Registry.setListener(L); - } - - - /// FirstCtor - Finds the first instruction scheduler in registration - /// list and returns its creator function, otherwise return NULL. - static FunctionPassCtor FirstCtor() { - MachinePassRegistryNode *Node = Registry.getList(); - return Node ? Node->getCtor() : NULL; - } - - - /// FindCtor - Finds a instruction scheduler in registration list and returns - /// its creator function, otherwise return NULL. - static FunctionPassCtor FindCtor(const char *N) { - MachinePassRegistryNode *Node = Registry.Find(N); - return Node ? Node->getCtor() : NULL; - } - -}; - - //===----------------------------------------------------------------------===// /// /// RegisterPassParser class - Handle the addition of new machine passes. @@ -271,46 +120,35 @@ public: //===----------------------------------------------------------------------===// template class RegisterPassParser : public MachinePassRegistryListener, - public cl::parser { + public cl::parser { public: RegisterPassParser() {} ~RegisterPassParser() { RegistryClass::setListener(NULL); } void initialize(cl::Option &O) { - cl::parser::initialize(O); - + cl::parser::initialize(O); + // Add existing passes to option. for (RegistryClass *Node = RegistryClass::getList(); Node; Node = Node->getNext()) { - addLiteralOption(Node->getName(), Node->getName(), - Node->getDescription()); + this->addLiteralOption(Node->getName(), + (typename RegistryClass::FunctionPassCtor)Node->getCtor(), + Node->getDescription()); } - + // Make sure we listen for list changes. RegistryClass::setListener(this); } // Implement the MachinePassRegistryListener callbacks. // - virtual void NotifyAdd(const char *N, const char *D) { - addLiteralOption(N, N, D); + virtual void NotifyAdd(const char *N, + MachinePassCtor C, + const char *D) { + this->addLiteralOption(N, (typename RegistryClass::FunctionPassCtor)C, D); } - virtual void NotifyRemove(const char *N, const char *D) { - removeLiteralOption(N); - } - - // ValLessThan - Provide a sorting comparator for Values elements... - typedef std::pair > ValType; - static bool ValLessThan(const ValType &VT1, const ValType &VT2) { - return std::string(VT1.first) < std::string(VT2.first); - } - - // printOptionInfo - Print out information about this option. Override the - // default implementation to sort the table before we print... - virtual void printOptionInfo(const cl::Option &O, unsigned GlobalWidth) const{ - RegisterPassParser *PNP = const_cast(this); - std::sort(PNP->Values.begin(), PNP->Values.end(), ValLessThan); - cl::parser::printOptionInfo(O, GlobalWidth); + virtual void NotifyRemove(const char *N) { + this->removeLiteralOption(N); } };