From 58d2bfbd8a0af5e1fa5088ff04e5e7dc25c81e31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Thu, 4 Dec 2014 20:12:05 +0100 Subject: [PATCH] External code access in Env reimplemented --- libevmjit-cpp/Env.cpp | 12 +++--------- libevmjit/Compiler.cpp | 11 +++++------ libevmjit/Ext.cpp | 22 +++++++++------------- libevmjit/Ext.h | 13 +++++++++---- 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/libevmjit-cpp/Env.cpp b/libevmjit-cpp/Env.cpp index 13b4002ff..72775822c 100644 --- a/libevmjit-cpp/Env.cpp +++ b/libevmjit-cpp/Env.cpp @@ -99,18 +99,12 @@ extern "C" *o_hash = hash; } - EXPORT unsigned char* ext_codeAt(ExtVMFace* _env, h256* _addr256) + EXPORT byte const* env_getExtCode(ExtVMFace* _env, h256* _addr256, uint64_t* o_size) { auto addr = right160(*_addr256); auto& code = _env->codeAt(addr); - return const_cast(code.data()); - } - - EXPORT void ext_codesizeAt(ExtVMFace* _env, h256* _addr256, i256* o_ret) - { - auto addr = right160(*_addr256); - auto& code = _env->codeAt(addr); - *o_ret = eth2llvm(u256(code.size())); + *o_size = code.size(); + return code.data(); } EXPORT void env_log(ExtVMFace* _env, byte* _beg, uint64_t _size, h256* _topic1, h256* _topic2, h256* _topic3, h256* _topic4) diff --git a/libevmjit/Compiler.cpp b/libevmjit/Compiler.cpp index 91e25c111..32f1579ee 100644 --- a/libevmjit/Compiler.cpp +++ b/libevmjit/Compiler.cpp @@ -681,8 +681,8 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, bytes const& _bytecode case Instruction::EXTCODESIZE: { auto addr = stack.pop(); - auto value = _ext.codesizeAt(addr); - stack.push(value); + auto codeRef = _ext.getExtCode(addr); + stack.push(codeRef.size); break; } @@ -714,15 +714,14 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, bytes const& _bytecode case Instruction::EXTCODECOPY: { - auto extAddr = stack.pop(); + auto addr = stack.pop(); auto destMemIdx = stack.pop(); auto srcIdx = stack.pop(); auto reqBytes = stack.pop(); - auto srcPtr = _ext.codeAt(extAddr); - auto srcSize = _ext.codesizeAt(extAddr); + auto codeRef = _ext.getExtCode(addr); - _memory.copyBytes(srcPtr, srcSize, srcIdx, destMemIdx, reqBytes); + _memory.copyBytes(codeRef.ptr, codeRef.size, srcIdx, destMemIdx, reqBytes); break; } diff --git a/libevmjit/Ext.cpp b/libevmjit/Ext.cpp index a686f7751..d14a67ac0 100644 --- a/libevmjit/Ext.cpp +++ b/libevmjit/Ext.cpp @@ -38,6 +38,7 @@ Ext::Ext(RuntimeManager& _runtimeManager, Memory& _memoryMan): m_arg6 = m_builder.CreateAlloca(i256Ty, nullptr, "ext.arg6"); m_arg7 = m_builder.CreateAlloca(i256Ty, nullptr, "ext.arg7"); m_arg8 = m_builder.CreateAlloca(i256Ty, nullptr, "ext.arg8"); + m_size = m_builder.CreateAlloca(Type::Size, nullptr, "env.size"); using Linkage = llvm::GlobalValue::LinkageTypes; @@ -48,9 +49,6 @@ Ext::Ext(RuntimeManager& _runtimeManager, Memory& _memoryMan): m_calldataload = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 3}, false), Linkage::ExternalLinkage, "ext_calldataload", module); m_balance = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 3}, false), Linkage::ExternalLinkage, "ext_balance", module); m_suicide = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 2}, false), Linkage::ExternalLinkage, "ext_suicide", module); - m_exp = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 4}, false), Linkage::ExternalLinkage, "ext_exp", module); // FIXME: Remove - m_codeAt = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, {argsTypes, 2}, false), Linkage::ExternalLinkage, "ext_codeAt", module); - m_codesizeAt = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 3}, false), Linkage::ExternalLinkage, "ext_codesizeAt", module); llvm::Type* sha3ArgsTypes[] = {Type::BytePtr, Type::Size, Type::WordPtr}; m_sha3 = llvm::Function::Create(llvm::FunctionType::get(Type::Void, sha3ArgsTypes, false), Linkage::ExternalLinkage, "env_sha3", module); @@ -63,6 +61,9 @@ Ext::Ext(RuntimeManager& _runtimeManager, Memory& _memoryMan): llvm::Type* logArgsTypes[] = {Type::EnvPtr, Type::BytePtr, Type::Size, Type::WordPtr, Type::WordPtr, Type::WordPtr, Type::WordPtr}; m_log = llvm::Function::Create(llvm::FunctionType::get(Type::Void, logArgsTypes, false), Linkage::ExternalLinkage, "env_log", module); + + llvm::Type* getExtCodeArgsTypes[] = {Type::EnvPtr, Type::WordPtr, Type::Size->getPointerTo()}; + m_getExtCode = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, getExtCodeArgsTypes, false), Linkage::ExternalLinkage, "env_getExtCode", module); } llvm::Value* Ext::sload(llvm::Value* _index) @@ -140,19 +141,14 @@ llvm::Value* Ext::sha3(llvm::Value* _inOff, llvm::Value* _inSize) return hash; } -llvm::Value* Ext::codeAt(llvm::Value* _addr) +MemoryRef Ext::getExtCode(llvm::Value* _addr) { auto addr = Endianness::toBE(m_builder, _addr); m_builder.CreateStore(addr, m_args[0]); - return m_builder.CreateCall2(m_codeAt, getRuntimeManager().getEnv(), m_args[0]); -} - -llvm::Value* Ext::codesizeAt(llvm::Value* _addr) -{ - auto addr = Endianness::toBE(m_builder, _addr); - m_builder.CreateStore(addr, m_args[0]); - createCall(m_codesizeAt, getRuntimeManager().getEnv(), m_args[0], m_args[1]); - return m_builder.CreateLoad(m_args[1]); + auto code = createCall(m_getExtCode, getRuntimeManager().getEnv(), m_args[0], m_size); + auto codeSize = m_builder.CreateLoad(m_size); + auto codeSize256 = m_builder.CreateZExt(codeSize, Type::Word); + return {code, codeSize256}; } void Ext::log(llvm::Value* _memIdx, llvm::Value* _numBytes, std::array const& _topics) diff --git a/libevmjit/Ext.h b/libevmjit/Ext.h index 61888e9ff..21e67ba88 100644 --- a/libevmjit/Ext.h +++ b/libevmjit/Ext.h @@ -12,6 +12,12 @@ namespace jit { class Memory; +struct MemoryRef +{ + llvm::Value* ptr; + llvm::Value* size; +}; + class Ext : public RuntimeHelper { public: @@ -27,8 +33,7 @@ public: llvm::Value* call(llvm::Value*& _gas, llvm::Value* _receiveAddress, llvm::Value* _value, llvm::Value* _inOff, llvm::Value* _inSize, llvm::Value* _outOff, llvm::Value* _outSize, llvm::Value* _codeAddress); llvm::Value* sha3(llvm::Value* _inOff, llvm::Value* _inSize); - llvm::Value* codeAt(llvm::Value* _addr); - llvm::Value* codesizeAt(llvm::Value* _addr); + MemoryRef getExtCode(llvm::Value* _addr); void log(llvm::Value* _memIdx, llvm::Value* _numBytes, std::array const& _topics); @@ -43,6 +48,7 @@ private: llvm::Value* m_arg6; llvm::Value* m_arg7; llvm::Value* m_arg8; + llvm::Value* m_size; llvm::Value* m_data = nullptr; llvm::Function* m_sload; llvm::Function* m_sstore; @@ -53,8 +59,7 @@ private: llvm::Function* m_call; llvm::Function* m_sha3; llvm::Function* m_exp; - llvm::Function* m_codeAt; - llvm::Function* m_codesizeAt; + llvm::Function* m_getExtCode; llvm::Function* m_log; };