[llvm-commits] CVS: llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h MachinePassRegistry.h
Jim Laskey
jlaskey at apple.com
Tue Aug 1 09:31:24 PDT 2006
Changes in directory llvm/include/llvm/CodeGen:
LinkAllCodegenComponents.h added (r1.1)
MachinePassRegistry.h added (r1.1)
---
Log message:
Forgot the added files for plugable machine passes.
---
Diffs of the changes: (+358 -0)
LinkAllCodegenComponents.h | 46 ++++++
MachinePassRegistry.h | 312 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 358 insertions(+)
Index: llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h
diff -c /dev/null llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h:1.1
*** /dev/null Tue Aug 1 11:31:18 2006
--- llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h Tue Aug 1 11:31:08 2006
***************
*** 0 ****
--- 1,46 ----
+ //===- llvm/Codegen/LinkAllCodegenComponents.h ------------------*- C++ -*-===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // This file was developed by James M. Laskey and is distributed under the
+ // University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This header file pulls in all codegen related passes for tools like lli and
+ // llc that need this functionality.
+ //
+ //===----------------------------------------------------------------------===//
+
+ #ifndef LLVM_CODEGEN_LINKALLCODEGENCOMPONENTS_H
+ #define LLVM_CODEGEN_LINKALLCODEGENCOMPONENTS_H
+
+ #include "llvm/CodeGen/Passes.h"
+ #include "llvm/CodeGen/ScheduleDAG.h"
+
+ namespace {
+ struct ForceCodegenLinking {
+ ForceCodegenLinking() {
+ // We must reference the passes in such a way that compilers will not
+ // delete it all as dead code, even with whole program optimization,
+ // yet is effectively a NO-OP. As the compiler isn't smart enough
+ // to know that getenv() never returns -1, this will do the job.
+ if (std::getenv("bar") != (char*) -1)
+ return;
+
+ (void) llvm::createSimpleRegisterAllocator();
+ (void) llvm::createLocalRegisterAllocator();
+ (void) llvm::createLinearScanRegisterAllocator();
+
+ (void) llvm::createBFS_DAGScheduler(NULL, NULL);
+ (void) llvm::createSimpleDAGScheduler(NULL, NULL);
+ (void) llvm::createNoItinsDAGScheduler(NULL, NULL);
+ (void) llvm::createBURRListDAGScheduler(NULL, NULL);
+ (void) llvm::createTDRRListDAGScheduler(NULL, NULL);
+ (void) llvm::createTDListDAGScheduler(NULL, NULL);
+
+ }
+ } ForceCodegenLinking; // Force link by creating a global definition.
+ }
+
+ #endif
\ No newline at end of file
Index: llvm/include/llvm/CodeGen/MachinePassRegistry.h
diff -c /dev/null llvm/include/llvm/CodeGen/MachinePassRegistry.h:1.1
*** /dev/null Tue Aug 1 11:31:24 2006
--- llvm/include/llvm/CodeGen/MachinePassRegistry.h Tue Aug 1 11:31:08 2006
***************
*** 0 ****
--- 1,312 ----
+ //===-- llvm/CodeGen/MachinePassRegistry.h ----------------------*- C++ -*-===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the LLVM research group and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+
+ #ifndef LLVM_CODEGEN_MACHINEPASSREGISTRY_H
+ #define LLVM_CODEGEN_MACHINEPASSREGISTRY_H
+
+ #include "llvm/CodeGen/Passes.h"
+ #include "llvm/CodeGen/ScheduleDAG.h"
+ #include "llvm/Support/CommandLine.h"
+
+ #include <iostream>
+
+ namespace llvm {
+
+
+ //===----------------------------------------------------------------------===//
+ ///
+ /// MachinePassRegistryListener - Listener to adds and removals of nodes in
+ /// registration list.
+ ///
+ //===----------------------------------------------------------------------===//
+ class MachinePassRegistryListener {
+ public:
+ MachinePassRegistryListener() {}
+ virtual ~MachinePassRegistryListener() {}
+ virtual void NotifyAdd(const char *N, const char *D) = 0;
+ virtual void NotifyRemove(const char *N, const char *D) = 0;
+ };
+
+
+ //===----------------------------------------------------------------------===//
+ ///
+ /// MachinePassRegistryNode - Machine pass node stored in registration list.
+ ///
+ //===----------------------------------------------------------------------===//
+ template<typename FunctionPassCtor>
+ class MachinePassRegistryNode {
+
+ private:
+
+ MachinePassRegistryNode<FunctionPassCtor> *Next;// Next function pass in list.
+ const char *Name; // Name of function pass.
+ const char *Description; // Description string.
+ FunctionPassCtor Ctor; // Function pass creator.
+
+ public:
+
+ MachinePassRegistryNode(const char *N, const char *D, FunctionPassCtor C)
+ : Next(NULL)
+ , Name(N)
+ , Description(D)
+ , Ctor(C)
+ {}
+
+ // Accessors
+ MachinePassRegistryNode<FunctionPassCtor> *getNext()
+ const { return Next; }
+ MachinePassRegistryNode<FunctionPassCtor> **getNextAddress()
+ { return &Next; }
+ const char *getName() const { return Name; }
+ const char *getDescription() const { return Description; }
+ FunctionPassCtor getCtor() const { return Ctor; }
+ void setNext(MachinePassRegistryNode<FunctionPassCtor> *N) { Next = N; }
+
+ };
+
+
+ //===----------------------------------------------------------------------===//
+ ///
+ /// MachinePassRegistry - Track the registration of machine passes.
+ ///
+ //===----------------------------------------------------------------------===//
+ template<typename FunctionPassCtor>
+ class MachinePassRegistry {
+
+ private:
+
+ MachinePassRegistryNode<FunctionPassCtor> *List;
+ // List of registry nodes.
+ FunctionPassCtor Cache; // Cached function pass creator.
+ MachinePassRegistryListener* Listener;// Listener for list adds are removes.
+
+ public:
+
+ // NO CONSTRUCTOR - we don't want static constructor ordering to mess
+ // with the registry.
+
+ // Accessors.
+ //
+ MachinePassRegistryNode<FunctionPassCtor> *getList() { return List; }
+ FunctionPassCtor getCache() { return Cache; }
+ void setCache(FunctionPassCtor C) { Cache = C; }
+ void setListener(MachinePassRegistryListener *L) { Listener = L; }
+
+ /// Add - Adds a function pass to the registration list.
+ ///
+ void Add(MachinePassRegistryNode<FunctionPassCtor> *Node) {
+ Node->setNext(List);
+ List = Node;
+ if (Listener) Listener->NotifyAdd(Node->getName(), Node->getDescription());
+ }
+
+
+ /// Remove - Removes a function pass from the registration list.
+ ///
+ void Remove(MachinePassRegistryNode<FunctionPassCtor> *Node) {
+ for (MachinePassRegistryNode<FunctionPassCtor> **I = &List;
+ *I; I = (*I)->getNextAddress()) {
+ if (*I == Node) {
+ #if 0 // FIXME: Command opt needs to call a termination routine.
+ if (Listener) Listener->NotifyRemove(Node->getName(),
+ Node->getDescription());
+ #endif
+ *I = (*I)->getNext();
+ break;
+ }
+ }
+ }
+
+
+ /// FInd - Finds and returns a function pass in registration list, otherwise
+ /// returns NULL.
+ MachinePassRegistryNode<FunctionPassCtor> *Find(const char *Name) {
+ for (MachinePassRegistryNode<FunctionPassCtor> *I = List;
+ I; I = I->getNext()) {
+ if (std::string(Name) == std::string(I->getName())) return I;
+ }
+ return NULL;
+ }
+
+
+ };
+
+
+ //===----------------------------------------------------------------------===//
+ ///
+ /// RegisterRegAlloc class - Track the registration of register allocators.
+ ///
+ //===----------------------------------------------------------------------===//
+ class RegisterRegAlloc : public MachinePassRegistryNode<FunctionPass *(*)()> {
+
+ public:
+
+ typedef FunctionPass *(*FunctionPassCtor)();
+
+ static MachinePassRegistry<FunctionPassCtor> Registry;
+
+ RegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C)
+ : MachinePassRegistryNode<FunctionPassCtor>(N, D, C)
+ { Registry.Add(this); }
+ ~RegisterRegAlloc() { Registry.Remove(this); }
+
+
+ // Accessors.
+ //
+ RegisterRegAlloc *getNext() const {
+ return (RegisterRegAlloc *)
+ MachinePassRegistryNode<FunctionPassCtor>::getNext();
+ }
+ static RegisterRegAlloc *getList() {
+ return (RegisterRegAlloc *)Registry.getList();
+ }
+ static FunctionPassCtor getCache() {
+ return Registry.getCache();
+ }
+ static void setCache(FunctionPassCtor C) {
+ Registry.setCache(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<FunctionPassCtor> *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<FunctionPassCtor> *Node = Registry.Find(N);
+ return Node ? Node->getCtor() : NULL;
+ }
+
+ };
+
+
+ //===----------------------------------------------------------------------===//
+ ///
+ /// RegisterScheduler class - Track the registration of instruction schedulers.
+ ///
+ //===----------------------------------------------------------------------===//
+
+ class ScheduleDAG;
+ class SelectionDAG;
+ class MachineBasicBlock;
+
+ class RegisterScheduler : public
+ MachinePassRegistryNode<ScheduleDAG *(*)(SelectionDAG*, MachineBasicBlock*)> {
+
+ public:
+
+ typedef ScheduleDAG *(*FunctionPassCtor)(SelectionDAG*, MachineBasicBlock*);
+
+ static MachinePassRegistry<FunctionPassCtor> Registry;
+
+ RegisterScheduler(const char *N, const char *D, FunctionPassCtor C)
+ : MachinePassRegistryNode<FunctionPassCtor>(N, D, C)
+ { Registry.Add(this); }
+ ~RegisterScheduler() { Registry.Remove(this); }
+
+
+ // Accessors.
+ //
+ RegisterScheduler *getNext() const {
+ return (RegisterScheduler *)
+ MachinePassRegistryNode<FunctionPassCtor>::getNext();
+ }
+ static RegisterScheduler *getList() {
+ return (RegisterScheduler *)Registry.getList();
+ }
+ static FunctionPassCtor getCache() {
+ return Registry.getCache();
+ }
+ static void setCache(FunctionPassCtor C) {
+ Registry.setCache(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<FunctionPassCtor> *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<FunctionPassCtor> *Node = Registry.Find(N);
+ return Node ? Node->getCtor() : NULL;
+ }
+
+ };
+
+
+ //===----------------------------------------------------------------------===//
+ ///
+ /// RegisterPassParser class - Handle the addition of new machine passes.
+ ///
+ //===----------------------------------------------------------------------===//
+ template<class RegistryClass>
+ class RegisterPassParser : public MachinePassRegistryListener,
+ public cl::parser<const char *> {
+ public:
+ RegisterPassParser() {}
+
+ void initialize(cl::Option &O) {
+ cl::parser<const char *>::initialize(O);
+
+ // Add existing passes to option.
+ for (RegistryClass *Node = RegistryClass::getList();
+ Node; Node = Node->getNext()) {
+ addLiteralOption(Node->getName(), Node->getName(),
+ 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 NotifyRemove(const char *N, const char *D) {
+ removeLiteralOption(N);
+ }
+
+ // ValLessThan - Provide a sorting comparator for Values elements...
+ typedef std::pair<const char*, std::pair<const char*, const char*> > 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<RegisterPassParser*>(this);
+ std::sort(PNP->Values.begin(), PNP->Values.end(), ValLessThan);
+ cl::parser<const char *>::printOptionInfo(O, GlobalWidth);
+ }
+ };
+
+
+ } // end namespace llvm
+
+ #endif
More information about the llvm-commits
mailing list