//
//===---------------------------------------------------------------------===//
+#include "llvm/CodeGen/RegAllocRegistry.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;
+using namespace llvm;
-/// 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;
-}
+/// RegisterRegAlloc class - Track the registration of register allocators.
+///
+//===---------------------------------------------------------------------===//
+MachinePassRegistry RegisterRegAlloc::Registry;
-#ifndef NDEBUG
-void RegisterRegAlloc::print() {
- for (RegisterRegAlloc *RA = List; RA; RA = RA->Next) {
- std::cerr << "RegAlloc:" << RA->Name << "\n";
- }
+//===---------------------------------------------------------------------===//
+///
+/// RegAlloc command line options.
+///
+//===---------------------------------------------------------------------===//
+namespace {
+ cl::opt<RegisterRegAlloc::FunctionPassCtor, false,
+ RegisterPassParser<RegisterRegAlloc> >
+ RegAlloc("regalloc",
+ cl::init(&createLinearScanRegisterAllocator),
+ 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);
+//===---------------------------------------------------------------------===//
+///
+/// createRegisterAllocator - choose the appropriate register allocator.
+///
+//===---------------------------------------------------------------------===//
FunctionPass *llvm::createRegisterAllocator() {
- const char *Names[] = {"simple", "local", "linearscan"};
- const char *DefltName = "linearscan";
+ RegisterRegAlloc::FunctionPassCtor Ctor = RegisterRegAlloc::getDefault();
- RegisterRegAlloc::FunctionPassCtor Ctor =
- RegisterRegAlloc::Find(Names[RegAlloc]);
- if (!Ctor) Ctor = RegisterRegAlloc::Find(DefltName);
-
- assert(Ctor && "No register allocator found");
+ if (!Ctor) {
+ Ctor = RegAlloc;
+ RegisterRegAlloc::setDefault(RegAlloc);
+ }
return Ctor();
}
-
-