From de024259c23a4dd83427745c5bfa91aaf0ea9e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 31 Dec 2014 13:54:43 +0100 Subject: [PATCH] Clean up ExecutionEngine --- libevmjit/ExecutionEngine.cpp | 42 +++++++++-------------------------- 1 file changed, 10 insertions(+), 32 deletions(-) diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index c2c7a86284..354c6e151d 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -35,12 +35,6 @@ namespace jit ReturnCode ExecutionEngine::run(bytes const& _code, RuntimeData* _data, Env* _env) { - std::string key{reinterpret_cast(_code.data()), _code.size()}; - /*if (auto cachedExec = Cache::findExec(key)) - { - return run(*cachedExec, _data, _env); - }*/ - auto module = Compiler({}).compile(_code); //module->dump(); return run(std::move(module), _data, _env, _code); @@ -77,10 +71,12 @@ ReturnCode ExecutionEngine::run(std::unique_ptr _module, RuntimeDa static std::unique_ptr ee; // TODO: Use Managed Objects from LLVM? - typedef ReturnCode(*EntryFuncPtr)(Runtime*); EntryFuncPtr entryFuncPtr{}; + + Runtime runtime(_data, _env); + auto&& mainFuncName = _module->getModuleIdentifier(); if (!ee) @@ -108,47 +104,29 @@ ReturnCode ExecutionEngine::run(std::unique_ptr _module, RuntimeDa memoryManager.release(); // and memory manager //ee->setObjectCache(Cache::getObjectCache()); + entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName); } else { - if (entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(_module->getModuleIdentifier())) - { - entryFuncPtr = nullptr; - } - else + entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName); + if (!entryFuncPtr) { ee->addModule(_module.get()); - //std::cerr << _module->getModuleIdentifier() << "\n"; _module.release(); + entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName); } } + assert(entryFuncPtr); - assert(ee); - - //ExecBundle exec; - //exec.engine.reset(builder.create()); - //if (!exec.engine) - // return ReturnCode::LLVMConfigError; - - // TODO: Finalization not needed when llvm::ExecutionEngine::getFunctionAddress used - //auto finalizationStartTime = std::chrono::high_resolution_clock::now(); - //exec.engine->finalizeObject(); - //auto finalizationEndTime = std::chrono::high_resolution_clock::now(); - //clog(JIT) << " + " << std::chrono::duration_cast(finalizationEndTime - finalizationStartTime).count(); auto executionStartTime = std::chrono::high_resolution_clock::now(); - - std::string key{reinterpret_cast(_code.data()), _code.size()}; - //auto& cachedExec = Cache::registerExec(key, std::move(exec)); - Runtime runtime(_data, _env); - auto mainFunc = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName); - auto returnCode = runEntryFunc(mainFunc, &runtime); + //auto mainFunc = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName); + auto returnCode = runEntryFunc(entryFuncPtr, &runtime); if (returnCode == ReturnCode::Return) this->returnData = runtime.getReturnData(); auto executionEndTime = std::chrono::high_resolution_clock::now(); clog(JIT) << " + " << std::chrono::duration_cast(executionEndTime - executionStartTime).count() << " ms "; - //clog(JIT) << "Max stack size: " << Stack::maxStackSize; clog(JIT) << "\n";