mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
Access stack structure through runtime structure [#81470252]
This commit is contained in:
parent
693c4b3dfa
commit
3670e328ba
5 changed files with 30 additions and 26 deletions
|
|
@ -181,7 +181,7 @@ std::unique_ptr<llvm::Module> Compiler::compile(bytesConstRef bytecode)
|
||||||
GasMeter gasMeter(m_builder, runtimeManager);
|
GasMeter gasMeter(m_builder, runtimeManager);
|
||||||
Memory memory(m_builder, gasMeter, runtimeManager);
|
Memory memory(m_builder, gasMeter, runtimeManager);
|
||||||
Ext ext(m_builder);
|
Ext ext(m_builder);
|
||||||
Stack stack(m_builder);
|
Stack stack(m_builder, runtimeManager);
|
||||||
|
|
||||||
m_builder.CreateBr(basicBlocks.begin()->second);
|
m_builder.CreateBr(basicBlocks.begin()->second);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,10 +44,6 @@ Runtime::~Runtime()
|
||||||
g_runtime = nullptr;
|
g_runtime = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
StackImpl& Runtime::getStack()
|
|
||||||
{
|
|
||||||
return g_runtime->m_stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
ExtVMFace& Runtime::getExt()
|
ExtVMFace& Runtime::getExt()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ public:
|
||||||
|
|
||||||
RuntimeData* getDataPtr() { return &m_data; }
|
RuntimeData* getDataPtr() { return &m_data; }
|
||||||
|
|
||||||
static StackImpl& getStack();
|
StackImpl& getStack() { return m_stack; }
|
||||||
MemoryImpl& getMemory() { return m_memory; }
|
MemoryImpl& getMemory() { return m_memory; }
|
||||||
static ExtVMFace& getExt();
|
static ExtVMFace& getExt();
|
||||||
u256 getGas();
|
u256 getGas();
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,9 @@ namespace eth
|
||||||
namespace jit
|
namespace jit
|
||||||
{
|
{
|
||||||
|
|
||||||
Stack::Stack(llvm::IRBuilder<>& _builder)
|
Stack::Stack(llvm::IRBuilder<>& _builder, RuntimeManager& _runtimeManager)
|
||||||
: CompilerHelper(_builder)
|
: CompilerHelper(_builder),
|
||||||
|
m_runtimeManager(_runtimeManager)
|
||||||
{
|
{
|
||||||
m_arg = m_builder.CreateAlloca(Type::i256, nullptr, "stack.arg");
|
m_arg = m_builder.CreateAlloca(Type::i256, nullptr, "stack.arg");
|
||||||
|
|
||||||
|
|
@ -23,11 +24,16 @@ Stack::Stack(llvm::IRBuilder<>& _builder)
|
||||||
using Linkage = GlobalValue::LinkageTypes;
|
using Linkage = GlobalValue::LinkageTypes;
|
||||||
|
|
||||||
auto module = getModule();
|
auto module = getModule();
|
||||||
m_push = Function::Create(FunctionType::get(m_builder.getVoidTy(), Type::WordPtr, false), Linkage::ExternalLinkage, "stack_push", module);
|
|
||||||
m_pop = Function::Create(FunctionType::get(m_builder.getVoidTy(), Type::Size, false), Linkage::ExternalLinkage, "stack_pop", module);
|
llvm::Type* pushArgTypes[] = {Type::RuntimePtr, Type::WordPtr};
|
||||||
llvm::Type* getSetArgTypes[] = {Type::Size, Type::WordPtr};
|
m_push = Function::Create(FunctionType::get(Type::Void, pushArgTypes, false), Linkage::ExternalLinkage, "stack_push", module);
|
||||||
m_get = Function::Create(FunctionType::get(m_builder.getVoidTy(), ArrayRef<llvm::Type*>(getSetArgTypes), false), Linkage::ExternalLinkage, "stack_get", module);
|
|
||||||
m_set = Function::Create(FunctionType::get(m_builder.getVoidTy(), ArrayRef<llvm::Type*>(getSetArgTypes), false), Linkage::ExternalLinkage, "stack_set", module);
|
llvm::Type* popArgTypes[] = {Type::RuntimePtr, Type::Size};
|
||||||
|
m_pop = Function::Create(FunctionType::get(Type::Void, popArgTypes, false), Linkage::ExternalLinkage, "stack_pop", module);
|
||||||
|
|
||||||
|
llvm::Type* getSetArgTypes[] = {Type::RuntimePtr, Type::Size, Type::WordPtr};
|
||||||
|
m_get = Function::Create(FunctionType::get(Type::Void, getSetArgTypes, false), Linkage::ExternalLinkage, "stack_get", module);
|
||||||
|
m_set = Function::Create(FunctionType::get(Type::Void, getSetArgTypes, false), Linkage::ExternalLinkage, "stack_set", module);
|
||||||
}
|
}
|
||||||
|
|
||||||
Stack::~Stack()
|
Stack::~Stack()
|
||||||
|
|
@ -35,25 +41,25 @@ Stack::~Stack()
|
||||||
|
|
||||||
llvm::Value* Stack::get(size_t _index)
|
llvm::Value* Stack::get(size_t _index)
|
||||||
{
|
{
|
||||||
m_builder.CreateCall2(m_get, llvm::ConstantInt::get(Type::Size, _index, false), m_arg);
|
m_builder.CreateCall3(m_get, m_runtimeManager.getRuntimePtr(), llvm::ConstantInt::get(Type::Size, _index, false), m_arg);
|
||||||
return m_builder.CreateLoad(m_arg);
|
return m_builder.CreateLoad(m_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stack::set(size_t _index, llvm::Value* _value)
|
void Stack::set(size_t _index, llvm::Value* _value)
|
||||||
{
|
{
|
||||||
m_builder.CreateStore(_value, m_arg);
|
m_builder.CreateStore(_value, m_arg);
|
||||||
m_builder.CreateCall2(m_set, llvm::ConstantInt::get(Type::Size, _index, false), m_arg);
|
m_builder.CreateCall3(m_set, m_runtimeManager.getRuntimePtr(), llvm::ConstantInt::get(Type::Size, _index, false), m_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stack::pop(size_t _count)
|
void Stack::pop(size_t _count)
|
||||||
{
|
{
|
||||||
m_builder.CreateCall(m_pop, llvm::ConstantInt::get(Type::Size, _count, false));
|
m_builder.CreateCall2(m_pop, m_runtimeManager.getRuntimePtr(), llvm::ConstantInt::get(Type::Size, _count, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Stack::push(llvm::Value* _value)
|
void Stack::push(llvm::Value* _value)
|
||||||
{
|
{
|
||||||
m_builder.CreateStore(_value, m_arg);
|
m_builder.CreateStore(_value, m_arg);
|
||||||
m_builder.CreateCall(m_push, m_arg);
|
m_builder.CreateCall2(m_push, m_runtimeManager.getRuntimePtr(), m_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -70,27 +76,27 @@ using namespace dev::eth::jit;
|
||||||
|
|
||||||
extern std::jmp_buf* rt_jmpBuf;
|
extern std::jmp_buf* rt_jmpBuf;
|
||||||
|
|
||||||
EXPORT void stack_pop(uint64_t _count)
|
EXPORT void stack_pop(Runtime* _rt, uint64_t _count)
|
||||||
{
|
{
|
||||||
auto& stack = Runtime::getStack();
|
auto& stack = _rt->getStack();
|
||||||
if (stack.size() < _count)
|
if (stack.size() < _count)
|
||||||
longjmp(*rt_jmpBuf, static_cast<uint64_t>(ReturnCode::StackTooSmall));
|
longjmp(*rt_jmpBuf, static_cast<uint64_t>(ReturnCode::StackTooSmall));
|
||||||
|
|
||||||
stack.erase(stack.end() - _count, stack.end());
|
stack.erase(stack.end() - _count, stack.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void stack_push(i256* _word)
|
EXPORT void stack_push(Runtime* _rt, i256* _word)
|
||||||
{
|
{
|
||||||
auto& stack = Runtime::getStack();
|
auto& stack = _rt->getStack();
|
||||||
stack.push_back(*_word);
|
stack.push_back(*_word);
|
||||||
|
|
||||||
if (stack.size() > Stack::maxStackSize)
|
if (stack.size() > Stack::maxStackSize)
|
||||||
Stack::maxStackSize = stack.size();
|
Stack::maxStackSize = stack.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void stack_get(uint64_t _index, i256* _ret)
|
EXPORT void stack_get(Runtime* _rt, uint64_t _index, i256* _ret)
|
||||||
{
|
{
|
||||||
auto& stack = Runtime::getStack();
|
auto& stack = _rt->getStack();
|
||||||
// TODO: encode _index and stack size in the return code
|
// TODO: encode _index and stack size in the return code
|
||||||
if (stack.size() <= _index)
|
if (stack.size() <= _index)
|
||||||
longjmp(*rt_jmpBuf, static_cast<uint64_t>(ReturnCode::StackTooSmall));
|
longjmp(*rt_jmpBuf, static_cast<uint64_t>(ReturnCode::StackTooSmall));
|
||||||
|
|
@ -98,9 +104,9 @@ EXPORT void stack_get(uint64_t _index, i256* _ret)
|
||||||
*_ret = *(stack.rbegin() + _index);
|
*_ret = *(stack.rbegin() + _index);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void stack_set(uint64_t _index, i256* _word)
|
EXPORT void stack_set(Runtime* _rt, uint64_t _index, i256* _word)
|
||||||
{
|
{
|
||||||
auto& stack = Runtime::getStack();
|
auto& stack = _rt->getStack();
|
||||||
// TODO: encode _index and stack size in the return code
|
// TODO: encode _index and stack size in the return code
|
||||||
if (stack.size() <= _index)
|
if (stack.size() <= _index)
|
||||||
longjmp(*rt_jmpBuf, static_cast<uint64_t>(ReturnCode::StackTooSmall));
|
longjmp(*rt_jmpBuf, static_cast<uint64_t>(ReturnCode::StackTooSmall));
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,13 @@ namespace eth
|
||||||
{
|
{
|
||||||
namespace jit
|
namespace jit
|
||||||
{
|
{
|
||||||
|
class RuntimeManager;
|
||||||
|
|
||||||
class Stack : public CompilerHelper
|
class Stack : public CompilerHelper
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Stack(llvm::IRBuilder<>& builder);
|
Stack(llvm::IRBuilder<>& builder, RuntimeManager& runtimeManager);
|
||||||
virtual ~Stack();
|
virtual ~Stack();
|
||||||
|
|
||||||
llvm::Value* get(size_t _index);
|
llvm::Value* get(size_t _index);
|
||||||
|
|
@ -26,6 +27,7 @@ public:
|
||||||
static size_t maxStackSize;
|
static size_t maxStackSize;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
RuntimeManager& m_runtimeManager;
|
||||||
|
|
||||||
llvm::Function* m_push;
|
llvm::Function* m_push;
|
||||||
llvm::Function* m_pop;
|
llvm::Function* m_pop;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue