summaryrefslogtreecommitdiff
path: root/lib/CodeGen/Passes.cpp
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2006-07-27 20:05:00 +0000
committerJim Laskey <jlaskey@mac.com>2006-07-27 20:05:00 +0000
commit33a0a6ddf5427e05b1d9477075c6f6bf60aa7e62 (patch)
tree66af254fef135e9c21de02b021cdeded3b22b73c /lib/CodeGen/Passes.cpp
parent3aac4d58e415b9efa5d214cb5d9a25bc616fa4d7 (diff)
downloadllvm-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.cpp58
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();
+}
+
+