Browse Source

Clean up ExecutionEngine

cl-refactor
Paweł Bylica 10 years ago
parent
commit
de024259c2
  1. 42
      libevmjit/ExecutionEngine.cpp

42
libevmjit/ExecutionEngine.cpp

@ -35,12 +35,6 @@ namespace jit
ReturnCode ExecutionEngine::run(bytes const& _code, RuntimeData* _data, Env* _env) ReturnCode ExecutionEngine::run(bytes const& _code, RuntimeData* _data, Env* _env)
{ {
std::string key{reinterpret_cast<char const*>(_code.data()), _code.size()};
/*if (auto cachedExec = Cache::findExec(key))
{
return run(*cachedExec, _data, _env);
}*/
auto module = Compiler({}).compile(_code); auto module = Compiler({}).compile(_code);
//module->dump(); //module->dump();
return run(std::move(module), _data, _env, _code); return run(std::move(module), _data, _env, _code);
@ -77,10 +71,12 @@ ReturnCode ExecutionEngine::run(std::unique_ptr<llvm::Module> _module, RuntimeDa
static std::unique_ptr<llvm::ExecutionEngine> ee; // TODO: Use Managed Objects from LLVM? static std::unique_ptr<llvm::ExecutionEngine> ee; // TODO: Use Managed Objects from LLVM?
typedef ReturnCode(*EntryFuncPtr)(Runtime*);
EntryFuncPtr entryFuncPtr{}; EntryFuncPtr entryFuncPtr{};
Runtime runtime(_data, _env);
auto&& mainFuncName = _module->getModuleIdentifier(); auto&& mainFuncName = _module->getModuleIdentifier();
if (!ee) if (!ee)
@ -108,47 +104,29 @@ ReturnCode ExecutionEngine::run(std::unique_ptr<llvm::Module> _module, RuntimeDa
memoryManager.release(); // and memory manager memoryManager.release(); // and memory manager
//ee->setObjectCache(Cache::getObjectCache()); //ee->setObjectCache(Cache::getObjectCache());
entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName);
} }
else else
{ {
if (entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(_module->getModuleIdentifier())) entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName);
{ if (!entryFuncPtr)
entryFuncPtr = nullptr;
}
else
{ {
ee->addModule(_module.get()); ee->addModule(_module.get());
//std::cerr << _module->getModuleIdentifier() << "\n";
_module.release(); _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<std::chrono::milliseconds>(finalizationEndTime - finalizationStartTime).count();
auto executionStartTime = std::chrono::high_resolution_clock::now(); auto executionStartTime = std::chrono::high_resolution_clock::now();
//auto mainFunc = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName);
std::string key{reinterpret_cast<char const*>(_code.data()), _code.size()}; auto returnCode = runEntryFunc(entryFuncPtr, &runtime);
//auto& cachedExec = Cache::registerExec(key, std::move(exec));
Runtime runtime(_data, _env);
auto mainFunc = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName);
auto returnCode = runEntryFunc(mainFunc, &runtime);
if (returnCode == ReturnCode::Return) if (returnCode == ReturnCode::Return)
this->returnData = runtime.getReturnData(); this->returnData = runtime.getReturnData();
auto executionEndTime = std::chrono::high_resolution_clock::now(); auto executionEndTime = std::chrono::high_resolution_clock::now();
clog(JIT) << " + " << std::chrono::duration_cast<std::chrono::milliseconds>(executionEndTime - executionStartTime).count() << " ms "; clog(JIT) << " + " << std::chrono::duration_cast<std::chrono::milliseconds>(executionEndTime - executionStartTime).count() << " ms ";
//clog(JIT) << "Max stack size: " << Stack::maxStackSize;
clog(JIT) << "\n"; clog(JIT) << "\n";

Loading…
Cancel
Save