From 502f20b17ede40de84503010b7699b328a4f2867 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 8 Aug 2008 08:11:34 +0000 Subject: [PATCH] Add new parameter Fast to createJIT to enable the fast codegen path. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54523 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ExecutionEngine/ExecutionEngine.h | 9 ++++++--- lib/ExecutionEngine/ExecutionEngine.cpp | 7 ++++--- lib/ExecutionEngine/ExecutionEngineBindings.cpp | 6 ++++-- lib/ExecutionEngine/Interpreter/Interpreter.cpp | 3 ++- lib/ExecutionEngine/Interpreter/Interpreter.h | 3 ++- lib/ExecutionEngine/JIT/JIT.cpp | 9 +++++---- lib/ExecutionEngine/JIT/JIT.h | 9 +++++---- lib/ExecutionEngine/JIT/TargetSelect.cpp | 4 ++-- 8 files changed, 30 insertions(+), 20 deletions(-) diff --git a/include/llvm/ExecutionEngine/ExecutionEngine.h b/include/llvm/ExecutionEngine/ExecutionEngine.h index 6fd368d207a..edcddde2e39 100644 --- a/include/llvm/ExecutionEngine/ExecutionEngine.h +++ b/include/llvm/ExecutionEngine/ExecutionEngine.h @@ -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); diff --git a/lib/ExecutionEngine/ExecutionEngine.cpp b/lib/ExecutionEngine/ExecutionEngine.cpp index b3dfe01069d..aae0cf7823e 100644 --- a/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/lib/ExecutionEngine/ExecutionEngine.cpp @@ -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; } diff --git a/lib/ExecutionEngine/ExecutionEngineBindings.cpp b/lib/ExecutionEngine/ExecutionEngineBindings.cpp index 54340fba9aa..5ceeb9097d0 100644 --- a/lib/ExecutionEngine/ExecutionEngineBindings.cpp +++ b/lib/ExecutionEngine/ExecutionEngineBindings.cpp @@ -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; } diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.cpp b/lib/ExecutionEngine/Interpreter/Interpreter.cpp index 4234bd9d8c7..ac0ee3fb49c 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.cpp +++ b/lib/ExecutionEngine/Interpreter/Interpreter.cpp @@ -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 diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.h b/lib/ExecutionEngine/Interpreter/Interpreter.h index 02edaa02640..fc7da18fd05 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.h +++ b/lib/ExecutionEngine/Interpreter/Interpreter.h @@ -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. /// diff --git a/lib/ExecutionEngine/JIT/JIT.cpp b/lib/ExecutionEngine/JIT/JIT.cpp index d4f190bfc76..af8fd8fb7c0 100644 --- a/lib/ExecutionEngine/JIT/JIT.cpp +++ b/lib/ExecutionEngine/JIT/JIT.cpp @@ -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(); } diff --git a/lib/ExecutionEngine/JIT/JIT.h b/lib/ExecutionEngine/JIT/JIT.h index 6e6b8c2befe..41fa9bd0028 100644 --- a/lib/ExecutionEngine/JIT/JIT.h +++ b/lib/ExecutionEngine/JIT/JIT.h @@ -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); diff --git a/lib/ExecutionEngine/JIT/TargetSelect.cpp b/lib/ExecutionEngine/JIT/TargetSelect.cpp index 0654f340b5f..54020851019 100644 --- a/lib/ExecutionEngine/JIT/TargetSelect.cpp +++ b/lib/ExecutionEngine/JIT/TargetSelect.cpp @@ -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";