diff options
author | Jim Laskey <jlaskey@mac.com> | 2006-07-27 20:05:00 +0000 |
---|---|---|
committer | Jim Laskey <jlaskey@mac.com> | 2006-07-27 20:05:00 +0000 |
commit | 33a0a6ddf5427e05b1d9477075c6f6bf60aa7e62 (patch) | |
tree | 66af254fef135e9c21de02b021cdeded3b22b73c /lib/CodeGen/Passes.cpp | |
parent | 3aac4d58e415b9efa5d214cb5d9a25bc616fa4d7 (diff) | |
download | llvm-33a0a6ddf5427e05b1d9477075c6f6bf60aa7e62.tar.gz llvm-33a0a6ddf5427e05b1d9477075c6f6bf60aa7e62.tar.bz2 llvm-33a0a6ddf5427e05b1d9477075c6f6bf60aa7e62.tar.xz |
Working toward registration of register allocators.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29360 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Passes.cpp')
-rw-r--r-- | lib/CodeGen/Passes.cpp | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/lib/CodeGen/Passes.cpp b/lib/CodeGen/Passes.cpp index 435d6b5627..12b021c3bd 100644 --- a/lib/CodeGen/Passes.cpp +++ b/lib/CodeGen/Passes.cpp @@ -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 @@ namespace { 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(); +} + + |