diff options
author | Jim Laskey <jlaskey@mac.com> | 2006-08-01 14:21:23 +0000 |
---|---|---|
committer | Jim Laskey <jlaskey@mac.com> | 2006-08-01 14:21:23 +0000 |
commit | 13ec702c430b91ee49b9e6d9581cd95412f216c8 (patch) | |
tree | 2f3ae596c4afff110a8cdbca5dc4c4f6298e2308 /lib/CodeGen/Passes.cpp | |
parent | 06c1e7eacb11edd1671eabfc11291b7716be2608 (diff) |
Introducing plugable register allocators and instruction schedulers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29434 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Passes.cpp')
-rw-r--r-- | lib/CodeGen/Passes.cpp | 71 |
1 files changed, 14 insertions, 57 deletions
diff --git a/lib/CodeGen/Passes.cpp b/lib/CodeGen/Passes.cpp index 12b021c3bd..04f390a2f8 100644 --- a/lib/CodeGen/Passes.cpp +++ b/lib/CodeGen/Passes.cpp @@ -12,74 +12,31 @@ // //===---------------------------------------------------------------------===// +#include "llvm/CodeGen/MachinePassRegistry.h" #include "llvm/CodeGen/Passes.h" -#include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" #include <iostream> + using namespace llvm; namespace { - enum RegAllocName { simple, local, linearscan }; - - static cl::opt<RegAllocName> - RegAlloc( - "regalloc", - cl::desc("Register allocator to use: (default = linearscan)"), - cl::Prefix, - cl::values( - clEnumVal(simple, " simple register allocator"), - clEnumVal(local, " local register allocator"), - clEnumVal(linearscan, " linear scan register allocator"), - clEnumValEnd), - cl::init(linearscan)); -} - - -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"; - } + cl::opt<const char *, false, RegisterPassParser<RegisterRegAlloc> > + RegAlloc("regalloc", + cl::init("linearscan"), + cl::desc("Register allocator to use: (default = linearscan)")); } -#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::getCache(); + + if (!Ctor) { + Ctor = RegisterRegAlloc::FindCtor(RegAlloc); + assert(Ctor && "No register allocator found"); + if (!Ctor) Ctor = RegisterRegAlloc::FirstCtor(); + RegisterRegAlloc::setCache(Ctor); + } - RegisterRegAlloc::FunctionPassCtor Ctor = - RegisterRegAlloc::Find(Names[RegAlloc]); - if (!Ctor) Ctor = RegisterRegAlloc::Find(DefltName); - assert(Ctor && "No register allocator found"); return Ctor(); } - - |