Add new parameter Fast to createJIT to enable the fast codegen path.
authorEvan Cheng <evan.cheng@apple.com>
Fri, 8 Aug 2008 08:11:34 +0000 (08:11 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 8 Aug 2008 08:11:34 +0000 (08:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54523 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 6fd368d207a7b3d84f13c08063037f9da86b0a3b..edcddde2e390bab6335ae574193a9928305a5404 100644 (file)
@@ -79,7 +79,8 @@ protected:
   // To avoid having libexecutionengine depend on the JIT and interpreter
   // libraries, the JIT and Interpreter set these functions to ctor pointers
   // at startup time if they are linked in.
-  typedef ExecutionEngine *(*EECtorFn)(ModuleProvider*, std::string*);
+  typedef ExecutionEngine *(*EECtorFn)(ModuleProvider*, std::string*,
+                                       bool Fast);
   static EECtorFn JITCtor, InterpCtor;
 
   /// LazyFunctionCreator - If an unknown function is needed, this function
@@ -108,7 +109,8 @@ public:
   /// module provider.
   static ExecutionEngine *create(ModuleProvider *MP,
                                  bool ForceInterpreter = false,
-                                 std::string *ErrorStr = 0);
+                                 std::string *ErrorStr = 0,
+                                 bool Fast = false);
   
   /// create - This is the factory method for creating an execution engine which
   /// is appropriate for the current machine.  This takes ownership of the
@@ -120,7 +122,8 @@ public:
   /// of the ModuleProvider and JITMemoryManager if successful.
   static ExecutionEngine *createJIT(ModuleProvider *MP,
                                     std::string *ErrorStr = 0,
-                                    JITMemoryManager *JMM = 0);
+                                    JITMemoryManager *JMM = 0,
+                                    bool Fast = false);
   
   
   
index b3dfe01069d0cdbdd70923b68f4d604df05997a3..aae0cf7823e7b2747ad740fe18bb99acb21992c3 100644 (file)
@@ -345,7 +345,8 @@ int ExecutionEngine::runFunctionAsMain(Function *Fn,
 ///
 ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP,
                                          bool ForceInterpreter,
-                                         std::string *ErrorStr) {
+                                         std::string *ErrorStr,
+                                         bool Fast) {
   ExecutionEngine *EE = 0;
 
   // Make sure we can resolve symbols in the program as well. The zero arg
@@ -355,11 +356,11 @@ ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP,
 
   // Unless the interpreter was explicitly selected, try making a JIT.
   if (!ForceInterpreter && JITCtor)
-    EE = JITCtor(MP, ErrorStr);
+    EE = JITCtor(MP, ErrorStr, Fast);
 
   // If we can't make a JIT, make an interpreter instead.
   if (EE == 0 && InterpCtor)
-    EE = InterpCtor(MP, ErrorStr);
+    EE = InterpCtor(MP, ErrorStr, Fast);
 
   return EE;
 }
index 54340fba9aa17fd24edce08105cee344f8731e88..5ceeb9097d002086c97a4d9ed04ff3119a8f12c6 100644 (file)
@@ -114,9 +114,11 @@ int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
 
 int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
                           LLVMModuleProviderRef MP,
-                          char **OutError) {
+                          char **OutError,
+                          bool Fast = false) {
   std::string Error;
-  if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error)) {
+  if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error, 0,
+                                                        Fast)) {
     *OutJIT = wrap(JIT);
     return 0;
   }
index 4234bd9d8c715f9cbf4c7bbbaebad87c604d393e..ac0ee3fb49ca4b09258de79f2e80ea92f1c460e1 100644 (file)
@@ -36,7 +36,8 @@ namespace llvm {
 
 /// create - Create a new interpreter object.  This can never fail.
 ///
-ExecutionEngine *Interpreter::create(ModuleProvider *MP, std::string* ErrStr) {
+ExecutionEngine *Interpreter::create(ModuleProvider *MP, std::string* ErrStr,
+                                     bool Fast /*unused*/) {
   // Tell this ModuleProvide to materialize and release the module
   if (!MP->materializeModule(ErrStr))
     // We got an error, just return 0
index 02edaa0264011e66eb20deadff544f5f80cb7791..fc7da18fd0529ff4625ce358c4585aac7705f97c 100644 (file)
@@ -108,7 +108,8 @@ public:
   
   /// create - Create an interpreter ExecutionEngine. This can never fail.
   ///
-  static ExecutionEngine *create(ModuleProvider *M, std::string *ErrorStr = 0);
+  static ExecutionEngine *create(ModuleProvider *M, std::string *ErrorStr = 0,
+                                 bool Fast /*unused*/ = 0);
 
   /// run - Start execution with the specified function and arguments.
   ///
index d4f190bfc76538076f8742e2e3a82341356ebd8e..af8fd8fb7c0e7fb917b3fc38b3ae840e3c87688e 100644 (file)
@@ -73,8 +73,9 @@ extern "C" void __register_frame(void*);
 /// of the module provider.
 ExecutionEngine *ExecutionEngine::createJIT(ModuleProvider *MP,
                                             std::string *ErrorStr,
-                                            JITMemoryManager *JMM) {
-  ExecutionEngine *EE = JIT::createJIT(MP, ErrorStr, JMM);
+                                            JITMemoryManager *JMM,
+                                            bool Fast) {
+  ExecutionEngine *EE = JIT::createJIT(MP, ErrorStr, JMM, Fast);
   if (!EE) return 0;
   
   // Register routine for informing unwinding runtime about new EH frames
@@ -89,7 +90,7 @@ ExecutionEngine *ExecutionEngine::createJIT(ModuleProvider *MP,
 }
 
 JIT::JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji,
-         JITMemoryManager *JMM)
+         JITMemoryManager *JMM, bool Fast)
   : ExecutionEngine(MP), TM(tm), TJI(tji) {
   setTargetData(TM.getTargetData());
 
@@ -105,7 +106,7 @@ JIT::JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji,
 
   // Turn the machine code intermediate representation into bytes in memory that
   // may be executed.
-  if (TM.addPassesToEmitMachineCode(PM, *MCE, false /*fast*/)) {
+  if (TM.addPassesToEmitMachineCode(PM, *MCE, Fast)) {
     cerr << "Target does not support machine code emission!\n";
     abort();
   }
index 6e6b8c2befef11ca0ba75db7e1a160cea3d86ac5..41fa9bd0028fe5aa490bc4a3b5b67406181e0d07 100644 (file)
@@ -56,7 +56,7 @@ class JIT : public ExecutionEngine {
   JITState *jitstate;
 
   JIT(ModuleProvider *MP, TargetMachine &tm, TargetJITInfo &tji, 
-      JITMemoryManager *JMM);
+      JITMemoryManager *JMM, bool Fast);
 public:
   ~JIT();
 
@@ -71,8 +71,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 *Err) {
-    return createJIT(MP, Err, 0);
+  static ExecutionEngine *create(ModuleProvider *MP, std::string *Err,
+                                 bool Fast = false) {
+    return createJIT(MP, Err, 0, Fast);
   }
 
   virtual void addModuleProvider(ModuleProvider *MP);
@@ -128,7 +129,7 @@ public:
   MachineCodeEmitter *getCodeEmitter() const { return MCE; }
   
   static ExecutionEngine *createJIT(ModuleProvider *MP, std::string *Err,
-                                    JITMemoryManager *JMM);
+                                    JITMemoryManager *JMM, bool Fast);
   
 private:
   static MachineCodeEmitter *createEmitter(JIT &J, JITMemoryManager *JMM);
index 0654f340b5f492830a5e293df99f75dd7bdaab00..54020851019b9ed50889ae8442bc2f7ed90807cd 100644 (file)
@@ -41,7 +41,7 @@ MAttrs("mattr",
 /// available for the current target.  Otherwise, return null.
 ///
 ExecutionEngine *JIT::createJIT(ModuleProvider *MP, std::string *ErrorStr,
-                                JITMemoryManager *JMM) {
+                                JITMemoryManager *JMM, bool Fast) {
   const TargetMachineRegistry::entry *TheArch = MArch;
   if (TheArch == 0) {
     std::string Error;
@@ -73,7 +73,7 @@ ExecutionEngine *JIT::createJIT(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, JMM);
+    return new JIT(MP, *Target, *TJ, JMM, Fast);
 
   if (ErrorStr)
     *ErrorStr = "target does not support JIT code generation";