[llvm-commits] CVS: llvm/lib/CodeGen/Passes.cpp

Jim Laskey jlaskey at apple.com
Thu Jul 27 13:05:15 PDT 2006



Changes in directory llvm/lib/CodeGen:

Passes.cpp updated: 1.17 -> 1.18
---
Log message:

Working toward registration of register allocators.


---
Diffs of the changes:  (+47 -11)

 Passes.cpp |   58 +++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 47 insertions(+), 11 deletions(-)


Index: llvm/lib/CodeGen/Passes.cpp
diff -u llvm/lib/CodeGen/Passes.cpp:1.17 llvm/lib/CodeGen/Passes.cpp:1.18
--- llvm/lib/CodeGen/Passes.cpp:1.17	Thu Jul 20 12:28:38 2006
+++ llvm/lib/CodeGen/Passes.cpp	Thu Jul 27 15:05:00 2006
@@ -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 @@
     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();
+}
+
+






More information about the llvm-commits mailing list