mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
Merge remote-tracking branch 'upstream/develop' into evmjit
This commit is contained in:
commit
ba84c6c8a1
3 changed files with 11 additions and 8 deletions
|
|
@ -644,7 +644,7 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, bytes const& _bytecode
|
||||||
case Instruction::EXTCODESIZE:
|
case Instruction::EXTCODESIZE:
|
||||||
{
|
{
|
||||||
auto addr = stack.pop();
|
auto addr = stack.pop();
|
||||||
auto codeRef = _ext.getExtCode(addr);
|
auto codeRef = _ext.extcode(addr);
|
||||||
stack.push(codeRef.size);
|
stack.push(codeRef.size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -682,7 +682,7 @@ void Compiler::compileBasicBlock(BasicBlock& _basicBlock, bytes const& _bytecode
|
||||||
auto srcIdx = stack.pop();
|
auto srcIdx = stack.pop();
|
||||||
auto reqBytes = stack.pop();
|
auto reqBytes = stack.pop();
|
||||||
|
|
||||||
auto codeRef = _ext.getExtCode(addr);
|
auto codeRef = _ext.extcode(addr);
|
||||||
|
|
||||||
_memory.copyBytes(codeRef.ptr, codeRef.size, srcIdx, destMemIdx, reqBytes);
|
_memory.copyBytes(codeRef.ptr, codeRef.size, srcIdx, destMemIdx, reqBytes);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,12 @@ namespace jit
|
||||||
|
|
||||||
Ext::Ext(RuntimeManager& _runtimeManager, Memory& _memoryMan):
|
Ext::Ext(RuntimeManager& _runtimeManager, Memory& _memoryMan):
|
||||||
RuntimeHelper(_runtimeManager),
|
RuntimeHelper(_runtimeManager),
|
||||||
m_memoryMan(_memoryMan),
|
m_memoryMan(_memoryMan)
|
||||||
|
#ifdef __MSCVER
|
||||||
|
,
|
||||||
m_funcs({}), // The only std::array initialization that works in both Visual Studio & GCC
|
m_funcs({}), // The only std::array initialization that works in both Visual Studio & GCC
|
||||||
m_argAllocas({})
|
m_argAllocas({})
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
m_size = m_builder.CreateAlloca(Type::Size, nullptr, "env.size");
|
m_size = m_builder.CreateAlloca(Type::Size, nullptr, "env.size");
|
||||||
}
|
}
|
||||||
|
|
@ -48,7 +51,7 @@ std::array<FuncDesc, sizeOf<EnvFunc>::value> const& getEnvFuncDescs()
|
||||||
FuncDesc{"env_call", getFunctionType(Type::Bool, {Type::EnvPtr, Type::WordPtr, Type::WordPtr, Type::WordPtr, Type::BytePtr, Type::Size, Type::BytePtr, Type::Size, Type::WordPtr})},
|
FuncDesc{"env_call", getFunctionType(Type::Bool, {Type::EnvPtr, Type::WordPtr, Type::WordPtr, Type::WordPtr, Type::BytePtr, Type::Size, Type::BytePtr, Type::Size, Type::WordPtr})},
|
||||||
FuncDesc{"env_log", getFunctionType(Type::Void, {Type::EnvPtr, Type::BytePtr, Type::Size, Type::WordPtr, Type::WordPtr, Type::WordPtr, Type::WordPtr})},
|
FuncDesc{"env_log", getFunctionType(Type::Void, {Type::EnvPtr, Type::BytePtr, Type::Size, Type::WordPtr, Type::WordPtr, Type::WordPtr, Type::WordPtr})},
|
||||||
FuncDesc{"env_blockhash", getFunctionType(Type::Void, {Type::EnvPtr, Type::WordPtr, Type::WordPtr})},
|
FuncDesc{"env_blockhash", getFunctionType(Type::Void, {Type::EnvPtr, Type::WordPtr, Type::WordPtr})},
|
||||||
FuncDesc{"env_getExtCode", getFunctionType(Type::BytePtr, {Type::EnvPtr, Type::WordPtr, Type::Size->getPointerTo()})},
|
FuncDesc{"env_extcode", getFunctionType(Type::BytePtr, {Type::EnvPtr, Type::WordPtr, Type::Size->getPointerTo()})},
|
||||||
FuncDesc{"ext_calldataload", getFunctionType(Type::Void, {Type::RuntimeDataPtr, Type::WordPtr, Type::WordPtr})},
|
FuncDesc{"ext_calldataload", getFunctionType(Type::Void, {Type::RuntimeDataPtr, Type::WordPtr, Type::WordPtr})},
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|
@ -166,10 +169,10 @@ llvm::Value* Ext::sha3(llvm::Value* _inOff, llvm::Value* _inSize)
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
MemoryRef Ext::getExtCode(llvm::Value* _addr)
|
MemoryRef Ext::extcode(llvm::Value* _addr)
|
||||||
{
|
{
|
||||||
auto addr = Endianness::toBE(m_builder, _addr);
|
auto addr = Endianness::toBE(m_builder, _addr);
|
||||||
auto code = createCall(EnvFunc::getExtCode, {getRuntimeManager().getEnvPtr(), byPtr(addr), m_size});
|
auto code = createCall(EnvFunc::extcode, {getRuntimeManager().getEnvPtr(), byPtr(addr), m_size});
|
||||||
auto codeSize = m_builder.CreateLoad(m_size);
|
auto codeSize = m_builder.CreateLoad(m_size);
|
||||||
auto codeSize256 = m_builder.CreateZExt(codeSize, Type::Word);
|
auto codeSize256 = m_builder.CreateZExt(codeSize, Type::Word);
|
||||||
return {code, codeSize256};
|
return {code, codeSize256};
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ enum class EnvFunc
|
||||||
call,
|
call,
|
||||||
log,
|
log,
|
||||||
blockhash,
|
blockhash,
|
||||||
getExtCode,
|
extcode,
|
||||||
calldataload, // Helper function, not client Env interface
|
calldataload, // Helper function, not client Env interface
|
||||||
|
|
||||||
_size
|
_size
|
||||||
|
|
@ -55,7 +55,7 @@ public:
|
||||||
llvm::Value* blockhash(llvm::Value* _number);
|
llvm::Value* blockhash(llvm::Value* _number);
|
||||||
|
|
||||||
llvm::Value* sha3(llvm::Value* _inOff, llvm::Value* _inSize);
|
llvm::Value* sha3(llvm::Value* _inOff, llvm::Value* _inSize);
|
||||||
MemoryRef getExtCode(llvm::Value* _addr);
|
MemoryRef extcode(llvm::Value* _addr);
|
||||||
|
|
||||||
void log(llvm::Value* _memIdx, llvm::Value* _numBytes, std::array<llvm::Value*,4> const& _topics);
|
void log(llvm::Value* _memIdx, llvm::Value* _numBytes, std::array<llvm::Value*,4> const& _topics);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue