diff --git a/libevmjit/Cache.h b/libevmjit/Cache.h index f56716de2e..d36b9fc0b8 100644 --- a/libevmjit/Cache.h +++ b/libevmjit/Cache.h @@ -18,10 +18,12 @@ class ExecBundle { public: std::unique_ptr engine; + std::string mainFuncName; ExecBundle() = default; ExecBundle(ExecBundle&& _other): - engine(std::move(_other.engine)) + engine(std::move(_other.engine)), + mainFuncName(std::move(_other.mainFuncName)) {} ExecBundle(ExecBundle const&) = delete; diff --git a/libevmjit/Compiler.cpp b/libevmjit/Compiler.cpp index 40dff5cb15..8d4556d87f 100644 --- a/libevmjit/Compiler.cpp +++ b/libevmjit/Compiler.cpp @@ -164,7 +164,7 @@ std::unique_ptr Compiler::compile(bytes const& _bytecode) // Create main function auto mainFuncType = llvm::FunctionType::get(Type::MainReturn, Type::RuntimePtr, false); - m_mainFunc = llvm::Function::Create(mainFuncType, llvm::Function::ExternalLinkage, "main", module.get()); + m_mainFunc = llvm::Function::Create(mainFuncType, llvm::Function::ExternalLinkage, strHash, module.get()); m_mainFunc->getArgumentList().front().setName("rt"); // Create the basic blocks. diff --git a/libevmjit/CompilerHelper.cpp b/libevmjit/CompilerHelper.cpp index 6846ffd1ce..badf9d8890 100644 --- a/libevmjit/CompilerHelper.cpp +++ b/libevmjit/CompilerHelper.cpp @@ -2,6 +2,7 @@ #include "CompilerHelper.h" #include +#include #include "RuntimeManager.h" @@ -25,10 +26,11 @@ llvm::Module* CompilerHelper::getModule() llvm::Function* CompilerHelper::getMainFunction() { + // TODO: Rename or change semantics of getMainFunction() function assert(m_builder.GetInsertBlock()); auto mainFunc = m_builder.GetInsertBlock()->getParent(); assert(mainFunc); - if (mainFunc->getName() == "main") + if (mainFunc == &mainFunc->getParent()->getFunctionList().front()) // Main function is the first one in module return mainFunc; return nullptr; } diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index 162851ae8f..fc1b4ea3a1 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -68,6 +68,7 @@ ReturnCode ExecutionEngine::run(std::unique_ptr _module, RuntimeDa _module->setTargetTriple(triple.str()); ExecBundle exec; + exec.mainFuncName = _module->getModuleIdentifier(); exec.engine.reset(builder.create()); if (!exec.engine) return ReturnCode::LLVMConfigError; @@ -110,7 +111,7 @@ ReturnCode runEntryFunc(ExecBundle const& _exec, Runtime* _runtime) // to allow function to be executed. // That might be related to memory manager. Can we share one? typedef ReturnCode(*EntryFuncPtr)(Runtime*); - auto entryFuncPtr = (EntryFuncPtr)_exec.engine->getFunctionAddress("main"); + auto entryFuncPtr = (EntryFuncPtr)_exec.engine->getFunctionAddress(_exec.mainFuncName); ReturnCode returnCode{}; auto sj = setjmp(_runtime->getJmpBuf());