mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
External code access in Env reimplemented
This commit is contained in:
parent
4366542b63
commit
58d2bfbd8a
4 changed files with 26 additions and 32 deletions
|
|
@ -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<unsigned char*>(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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<llvm::Value*,4> const& _topics)
|
||||
|
|
|
|||
|
|
@ -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<llvm::Value*,4> 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;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue