diff options
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(); } - - |