Changes in directory llvm/lib/CodeGen:
Passes.cpp updated: 1.17 -> 1.18 --- Log message: Working toward registration of register allocators. --- Diffs of the changes: (+47 -11) Passes.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 47 insertions(+), 11 deletions(-) Index: llvm/lib/CodeGen/Passes.cpp diff -u llvm/lib/CodeGen/Passes.cpp:1.17 llvm/lib/CodeGen/Passes.cpp:1.18 --- llvm/lib/CodeGen/Passes.cpp:1.17 Thu Jul 20 12:28:38 2006 +++ llvm/lib/CodeGen/Passes.cpp Thu Jul 27 15:05:00 2006 @@ -13,6 +13,7 @@ //===---------------------------------------------------------------------===// #include "llvm/CodeGen/Passes.h" +#include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" #include <iostream> using namespace llvm; @@ -33,17 +34,52 @@ cl::init(linearscan)); } -FunctionPass *llvm::createRegisterAllocator() { - switch (RegAlloc) { - default: - std::cerr << "no register allocator selected"; - abort(); - case simple: - return createSimpleRegisterAllocator(); - case local: - return createLocalRegisterAllocator(); - case linearscan: - return createLinearScanRegisterAllocator(); + +RegisterRegAlloc *RegisterRegAlloc::List = NULL; + +/// Find - Finds a register allocator in registration list. +/// +RegisterRegAlloc::FunctionPassCtor RegisterRegAlloc::Find(const char *N) { + for (RegisterRegAlloc *RA = List; RA; RA = RA->Next) { + if (strcmp(N, RA->Name) == 0) return RA->Ctor; } + return NULL; } + +#ifndef NDEBUG +void RegisterRegAlloc::print() { + for (RegisterRegAlloc *RA = List; RA; RA = RA->Next) { + std::cerr << "RegAlloc:" << RA->Name << "\n"; + } +} +#endif + + +static RegisterRegAlloc + simpleRegAlloc("simple", " simple register allocator", + createSimpleRegisterAllocator); + +static RegisterRegAlloc + localRegAlloc("local", " local register allocator", + createLocalRegisterAllocator); + +static RegisterRegAlloc + linearscanRegAlloc("linearscan", "linear scan register allocator", + createLinearScanRegisterAllocator); + + +FunctionPass *llvm::createRegisterAllocator() { + const char *Names[] = {"simple", "local", "linearscan"}; + const char *DefltName = "linearscan"; + + RegisterRegAlloc::FunctionPassCtor Ctor = + RegisterRegAlloc::Find(Names[RegAlloc]); + if (!Ctor) Ctor = RegisterRegAlloc::Find(DefltName); + + assert(Ctor && "No register allocator found"); + + return Ctor(); +} + + _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits