add a new ExecutionEngine::createJIT which can be used if you only want
authorChris Lattner <sabre@nondot.org>
Thu, 6 Dec 2007 01:34:04 +0000 (01:34 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 6 Dec 2007 01:34:04 +0000 (01:34 +0000)
to create a JIT.  This lets you specify JIT-specific configuration items
like the JITMemoryManager to use.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44647 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ExecutionEngine/ExecutionEngine.h
lib/ExecutionEngine/JIT/JIT.cpp
lib/ExecutionEngine/JIT/JIT.h
lib/ExecutionEngine/JIT/TargetSelect.cpp

index ad0a738426e765c8c1bc7fdd40ebc6109c5751eb..5b33e15d906d5d6628620ce52eef8c823620f08c 100644 (file)
@@ -108,6 +108,14 @@ public:
   /// is appropriate for the current machine.  This takes ownership of the
   /// module.
   static ExecutionEngine *create(Module *M);
+
+  /// createJIT - This is the factory method for creating a JIT for the current
+  /// machine, it does not fall back to the interpreter.  This takes ownership
+  /// of the ModuleProvider and JITMemoryManager if successful.
+  static ExecutionEngine *createJIT(ModuleProvider *MP,
+                                    std::string *ErrorStr = 0,
+                                    JITMemoryManager *JMM = 0);
+  
   
   
   /// addModuleProvider - Add a ModuleProvider to the list of modules that we
index b5994975025713451fcd98603397bbd886093014..d6267d509acaec3cd11ce56e059f821d37d35135 100644 (file)
@@ -61,12 +61,29 @@ namespace llvm {
   }
 }
 
-JIT::JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji)
+/// createJIT - This is the factory method for creating a JIT for the current
+/// machine, it does not fall back to the interpreter.  This takes ownership
+/// of the module provider.
+ExecutionEngine *ExecutionEngine::createJIT(ModuleProvider *MP,
+                                            std::string *ErrorStr,
+                                            JITMemoryManager *JMM) {
+  ExecutionEngine *EE = JIT::createJIT(MP, ErrorStr, JMM);
+  if (!EE) return 0;
+  
+  
+  // Make sure we can resolve symbols in the program as well. The zero arg
+  // to the function tells DynamicLibrary to load the program, not a library.
+  sys::DynamicLibrary::LoadLibraryPermanently(0, ErrorStr);
+  return EE;
+}
+
+JIT::JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji,
+         JITMemoryManager *JMM)
   : ExecutionEngine(MP), TM(tm), TJI(tji), jitstate(MP) {
   setTargetData(TM.getTargetData());
 
   // Initialize MCE
-  MCE = createEmitter(*this, 0);
+  MCE = createEmitter(*this, JMM);
 
   // Add target data
   MutexGuard locked(lock);
index 6453740917098c9a05e5e27167ae371c4e96d8d3..789bbbb6629ef5605f20076e0d4410f91d7d1300 100644 (file)
@@ -56,7 +56,8 @@ class JIT : public ExecutionEngine {
 
   JITState jitstate;
 
-  JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji);
+  JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji, 
+      JITMemoryManager *JMM);
 public:
   ~JIT();
 
@@ -71,7 +72,9 @@ public:
   /// create - Create an return a new JIT compiler if there is one available
   /// for the current target.  Otherwise, return null.
   ///
-  static ExecutionEngine *create(ModuleProvider *MP, std::string* = 0);
+  static ExecutionEngine *create(ModuleProvider *MP, std::string *Err) {
+    return createJIT(MP, Err, 0);
+  }
 
   /// run - Start execution with the specified function and arguments.
   ///
@@ -120,6 +123,10 @@ public:
 
   /// getCodeEmitter - Return the code emitter this JIT is emitting into.
   MachineCodeEmitter *getCodeEmitter() const { return MCE; }
+  
+  static ExecutionEngine *createJIT(ModuleProvider *MP, std::string *Err,
+                                    JITMemoryManager *JMM);
+  
 private:
   static MachineCodeEmitter *createEmitter(JIT &J, JITMemoryManager *JMM);
   void runJITOnFunction (Function *F);
index 14e0a5f10e72dd4ee29752e4503b55c35b818a62..e6598504a267f83d9b4943d48301e7e733c7b8f1 100644 (file)
@@ -36,10 +36,11 @@ MAttrs("mattr",
   cl::desc("Target specific attributes (-mattr=help for details)"),
   cl::value_desc("a1,+a2,-a3,..."));
 
-/// create - Create an return a new JIT compiler if there is one available
-/// for the current target.  Otherwise, return null.
+/// createInternal - Create an return a new JIT compiler if there is one
+/// available for the current target.  Otherwise, return null.
 ///
-ExecutionEngine *JIT::create(ModuleProvider *MP, std::string *ErrorStr) {
+ExecutionEngine *JIT::createJIT(ModuleProvider *MP, std::string *ErrorStr,
+                                JITMemoryManager *JMM) {
   const TargetMachineRegistry::entry *TheArch = MArch;
   if (TheArch == 0) {
     std::string Error;
@@ -71,7 +72,7 @@ ExecutionEngine *JIT::create(ModuleProvider *MP, std::string *ErrorStr) {
 
   // If the target supports JIT code generation, return a new JIT now.
   if (TargetJITInfo *TJ = Target->getJITInfo())
-    return new JIT(MP, *Target, *TJ);
+    return new JIT(MP, *Target, *TJ, JMM);
 
   if (ErrorStr)
     *ErrorStr = "target does not support JIT code generation";