summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ExecutionEngine/JIT/TargetSelect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ExecutionEngine/JIT/TargetSelect.cpp')
-rw-r--r--llvm/lib/ExecutionEngine/JIT/TargetSelect.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/JIT/TargetSelect.cpp b/llvm/lib/ExecutionEngine/JIT/TargetSelect.cpp
new file mode 100644
index 00000000000..4a381fb5a2d
--- /dev/null
+++ b/llvm/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;
+}
+
+
OpenPOWER on IntegriCloud