mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
Moving ext_calldataload helper function to evmjit library (does not depend on Env)
This commit is contained in:
parent
2b9b53024d
commit
bd40486c7b
3 changed files with 27 additions and 12 deletions
|
|
@ -36,16 +36,6 @@ extern "C"
|
||||||
_env->setStore(index, value); // Interface uses native endianness
|
_env->setStore(index, value); // Interface uses native endianness
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Move to Memory/Runtime
|
|
||||||
EXPORT void ext_calldataload(ExtVMFace* _env, i256* _index, ::byte* o_value)
|
|
||||||
{
|
|
||||||
auto index = static_cast<size_t>(llvm2eth(*_index));
|
|
||||||
assert(index + 31 > index); // TODO: Handle large index
|
|
||||||
for (size_t i = index, j = 0; i <= index + 31; ++i, ++j)
|
|
||||||
o_value[j] = i < _env->data.size() ? _env->data[i] : 0; // Keep Big Endian
|
|
||||||
// TODO: It all can be done by adding padding to data or by using min() algorithm without branch
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT void ext_balance(ExtVMFace* _env, h256* _address, i256* o_value)
|
EXPORT void ext_balance(ExtVMFace* _env, h256* _address, i256* o_value)
|
||||||
{
|
{
|
||||||
auto u = _env->balance(right160(*_address));
|
auto u = _env->balance(right160(*_address));
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,6 @@ Ext::Ext(RuntimeManager& _runtimeManager, Memory& _memoryMan):
|
||||||
|
|
||||||
m_sload = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 3}, false), Linkage::ExternalLinkage, "env_sload", module);
|
m_sload = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 3}, false), Linkage::ExternalLinkage, "env_sload", module);
|
||||||
m_sstore = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 3}, false), Linkage::ExternalLinkage, "env_sstore", module);
|
m_sstore = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 3}, false), Linkage::ExternalLinkage, "env_sstore", module);
|
||||||
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_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_suicide = llvm::Function::Create(llvm::FunctionType::get(Type::Void, {argsTypes, 2}, false), Linkage::ExternalLinkage, "ext_suicide", module);
|
||||||
|
|
||||||
|
|
@ -64,6 +63,10 @@ Ext::Ext(RuntimeManager& _runtimeManager, Memory& _memoryMan):
|
||||||
|
|
||||||
llvm::Type* getExtCodeArgsTypes[] = {Type::EnvPtr, Type::WordPtr, Type::Size->getPointerTo()};
|
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);
|
m_getExtCode = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, getExtCodeArgsTypes, false), Linkage::ExternalLinkage, "env_getExtCode", module);
|
||||||
|
|
||||||
|
// Helper function, not client Env interface
|
||||||
|
llvm::Type* callDataLoadArgsTypes[] = {Type::RuntimePtr, Type::WordPtr, Type::WordPtr};
|
||||||
|
m_calldataload = llvm::Function::Create(llvm::FunctionType::get(Type::Void, callDataLoadArgsTypes, false), Linkage::ExternalLinkage, "ext_calldataload", module);
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Value* Ext::sload(llvm::Value* _index)
|
llvm::Value* Ext::sload(llvm::Value* _index)
|
||||||
|
|
@ -83,7 +86,7 @@ void Ext::sstore(llvm::Value* _index, llvm::Value* _value)
|
||||||
llvm::Value* Ext::calldataload(llvm::Value* _index)
|
llvm::Value* Ext::calldataload(llvm::Value* _index)
|
||||||
{
|
{
|
||||||
m_builder.CreateStore(_index, m_args[0]);
|
m_builder.CreateStore(_index, m_args[0]);
|
||||||
m_builder.CreateCall3(m_calldataload, getRuntimeManager().getEnv(), m_args[0], m_args[1]);
|
createCall(m_calldataload, getRuntimeManager().getRuntimePtr(), m_args[0], m_args[1]);
|
||||||
auto ret = m_builder.CreateLoad(m_args[1]);
|
auto ret = m_builder.CreateLoad(m_args[1]);
|
||||||
return Endianness::toNative(m_builder, ret);
|
return Endianness::toNative(m_builder, ret);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,5 +109,27 @@ extern "C"
|
||||||
*(stack.rbegin() + _index) = *_word;
|
*(stack.rbegin() + _index) = *_word;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT void ext_calldataload(Runtime* _rt, i256* _index, byte* o_value)
|
||||||
|
{
|
||||||
|
// It asumes all indexes are less than 2^64
|
||||||
|
|
||||||
|
auto index = _index->a;
|
||||||
|
if (_index->b || _index->c || _index->d) // if bigger that 2^64
|
||||||
|
index = std::numeric_limits<decltype(index)>::max(); // set max to fill with 0 leter
|
||||||
|
|
||||||
|
auto data = _rt->getDataPtr()->callData;
|
||||||
|
auto size = _rt->getDataPtr()->elems[RuntimeData::CallDataSize].a;
|
||||||
|
for (auto i = 0; i < 32; ++i)
|
||||||
|
{
|
||||||
|
if (index < size)
|
||||||
|
{
|
||||||
|
o_value[i] = data[index];
|
||||||
|
++index; // increment only if in range
|
||||||
|
}
|
||||||
|
else
|
||||||
|
o_value[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue