summaryrefslogtreecommitdiff
path: root/lib/CodeGen/Passes.cpp
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2006-08-01 14:21:23 +0000
committerJim Laskey <jlaskey@mac.com>2006-08-01 14:21:23 +0000
commit13ec702c430b91ee49b9e6d9581cd95412f216c8 (patch)
tree2f3ae596c4afff110a8cdbca5dc4c4f6298e2308 /lib/CodeGen/Passes.cpp
parent06c1e7eacb11edd1671eabfc11291b7716be2608 (diff)
downloadllvm-13ec702c430b91ee49b9e6d9581cd95412f216c8.tar.gz
llvm-13ec702c430b91ee49b9e6d9581cd95412f216c8.tar.bz2
llvm-13ec702c430b91ee49b9e6d9581cd95412f216c8.tar.xz
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.cpp71
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();
}
-
-