aboutsummaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine/JIT/TargetSelect.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-12-20 01:46:27 +0000
committerChris Lattner <sabre@nondot.org>2003-12-20 01:46:27 +0000
commit4d326fa9bea5b80147edf14d1521fc41ce315275 (patch)
tree6bb9d8e84301a874276b93c02c6f44377a376f9e /lib/ExecutionEngine/JIT/TargetSelect.cpp
parent61612df9cb596448b8310e479d568d6b2a8e8a4c (diff)
Cleanup the JIT as per PR176. This renames the VM class to JIT, and merges the
VM.cpp and JIT.cpp files into JIT.cpp. This also splits some nasty code out into TargetSelect.cpp so that people hopefully won't notice it. :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10544 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/JIT/TargetSelect.cpp')
-rw-r--r--lib/ExecutionEngine/JIT/TargetSelect.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/JIT/TargetSelect.cpp b/lib/ExecutionEngine/JIT/TargetSelect.cpp
new file mode 100644
index 0000000000..4a381fb5a2
--- /dev/null
+++ b/lib/ExecutionEngine/JIT/TargetSelect.cpp
@@ -0,0 +1,92 @@
+//===-- TargetSelect.cpp - Target Chooser Code ----------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains the hideously gross code that is currently used to select
+// a particular TargetMachine for the JIT to use. This should obviously be
+// improved in the future, probably by having the TargetMachines register
+// themselves with the runtime, and then have them choose themselves if they
+// match the current machine.
+//
+//===----------------------------------------------------------------------===//
+
+#include "JIT.h"
+#include "llvm/Module.h"
+#include "llvm/ModuleProvider.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetMachineImpls.h"
+#include "Support/CommandLine.h"
+using namespace llvm;
+
+#if !defined(ENABLE_X86_JIT) && !defined(ENABLE_SPARC_JIT)
+#define NO_JITS_ENABLED
+#endif
+
+namespace {
+ enum ArchName { x86, Sparc };
+
+#ifndef NO_JITS_ENABLED
+ cl::opt<ArchName>
+ Arch("march", cl::desc("Architecture to JIT to:"), cl::Prefix,
+ cl::values(
+#ifdef ENABLE_X86_JIT
+ clEnumVal(x86, " IA-32 (Pentium and above)"),
+#endif
+#ifdef ENABLE_SPARC_JIT
+ clEnumValN(Sparc, "sparc", " Sparc-V9"),
+#endif
+ 0),
+#if defined(ENABLE_X86_JIT)
+ cl::init(x86)
+#elif defined(ENABLE_SPARC_JIT)
+ cl::init(Sparc)
+#endif
+ );
+#endif /* NO_JITS_ENABLED */
+}
+
+/// create - Create an return a new JIT compiler if there is one available
+/// for the current target. Otherwise, return null.
+///
+ExecutionEngine *JIT::create(ModuleProvider *MP) {
+ TargetMachine* (*TargetMachineAllocator)(const Module &) = 0;
+
+ // Allow a command-line switch to override what *should* be the default target
+ // machine for this platform. This allows for debugging a Sparc JIT on X86 --
+ // our X86 machines are much faster at recompiling LLVM and linking LLI.
+#ifndef NO_JITS_ENABLED
+
+ switch (Arch) {
+#ifdef ENABLE_X86_JIT
+ case x86:
+ TargetMachineAllocator = allocateX86TargetMachine;
+ break;
+#endif
+#ifdef ENABLE_SPARC_JIT
+ case Sparc:
+ TargetMachineAllocator = allocateSparcTargetMachine;
+ break;
+#endif
+ default:
+ assert(0 && "-march flag not supported on this host!");
+ }
+#else
+ return 0;
+#endif
+
+ // Allocate a target...
+ TargetMachine *Target = TargetMachineAllocator(*MP->getModule());
+ assert(Target && "Could not allocate target machine!");
+
+ // If the target supports JIT code generation, return a new JIT now.
+ if (TargetJITInfo *TJ = Target->getJITInfo())
+ return new JIT(MP, *Target, *TJ);
+ return 0;
+}
+
+