mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-19 19:30:44 +00:00
Stack functions simplified
This commit is contained in:
parent
7bee86aa4b
commit
b519b73d94
2 changed files with 25 additions and 38 deletions
|
|
@ -29,18 +29,14 @@ Stack::Stack(llvm::IRBuilder<>& _builder, llvm::Module* _module)
|
||||||
auto i256PtrTy = i256Ty->getPointerTo();
|
auto i256PtrTy = i256Ty->getPointerTo();
|
||||||
auto voidTy = m_builder.getVoidTy();
|
auto voidTy = m_builder.getVoidTy();
|
||||||
|
|
||||||
auto stackCreate = llvm::Function::Create(llvm::FunctionType::get(stackPtrTy, false),
|
auto funcType = llvm::FunctionType::get(voidTy, i256PtrTy, false);
|
||||||
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_create", _module);
|
|
||||||
|
|
||||||
llvm::Type* argsTypes[] = {stackPtrTy, i256PtrTy};
|
|
||||||
auto funcType = llvm::FunctionType::get(voidTy, argsTypes, false);
|
|
||||||
m_stackPush = llvm::Function::Create(funcType,
|
m_stackPush = llvm::Function::Create(funcType,
|
||||||
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_push", _module);
|
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_push", _module);
|
||||||
|
|
||||||
m_stackPop = llvm::Function::Create(funcType,
|
m_stackPop = llvm::Function::Create(funcType,
|
||||||
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_pop", _module);
|
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_pop", _module);
|
||||||
|
|
||||||
llvm::Type* getArgsTypes[] = {stackPtrTy, m_builder.getInt32Ty(), i256PtrTy};
|
llvm::Type* getArgsTypes[] = {m_builder.getInt32Ty(), i256PtrTy};
|
||||||
auto getFuncType = llvm::FunctionType::get(voidTy, getArgsTypes, false);
|
auto getFuncType = llvm::FunctionType::get(voidTy, getArgsTypes, false);
|
||||||
m_stackGet = llvm::Function::Create(getFuncType,
|
m_stackGet = llvm::Function::Create(getFuncType,
|
||||||
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_get", _module);
|
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_get", _module);
|
||||||
|
|
@ -48,37 +44,36 @@ Stack::Stack(llvm::IRBuilder<>& _builder, llvm::Module* _module)
|
||||||
m_stackSet = llvm::Function::Create(getFuncType,
|
m_stackSet = llvm::Function::Create(getFuncType,
|
||||||
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_set", _module);
|
llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_stack_set", _module);
|
||||||
|
|
||||||
m_args[0] = m_builder.CreateCall(stackCreate, "stack.ptr");
|
m_stackVal = m_builder.CreateAlloca(i256Ty, nullptr, "stack.val");
|
||||||
m_args[1] = m_builder.CreateAlloca(i256Ty, nullptr, "stack.val");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Stack::push(llvm::Value* _value)
|
void Stack::push(llvm::Value* _value)
|
||||||
{
|
{
|
||||||
m_builder.CreateStore(_value, m_args[1]); // copy value to memory
|
m_builder.CreateStore(_value, m_stackVal); // copy value to memory
|
||||||
m_builder.CreateCall(m_stackPush, m_args);
|
m_builder.CreateCall(m_stackPush, m_stackVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
llvm::Value* Stack::pop()
|
llvm::Value* Stack::pop()
|
||||||
{
|
{
|
||||||
m_builder.CreateCall(m_stackPop, m_args);
|
m_builder.CreateCall(m_stackPop, m_stackVal);
|
||||||
return m_builder.CreateLoad(m_args[1]);
|
return m_builder.CreateLoad(m_stackVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
llvm::Value* Stack::get(uint32_t _index)
|
llvm::Value* Stack::get(uint32_t _index)
|
||||||
{
|
{
|
||||||
llvm::Value* args[] = {m_args[0], m_builder.getInt32(_index), m_args[1]};
|
llvm::Value* args[] = {m_builder.getInt32(_index), m_stackVal};
|
||||||
m_builder.CreateCall(m_stackGet, args);
|
m_builder.CreateCall(m_stackGet, args);
|
||||||
return m_builder.CreateLoad(m_args[1]);
|
return m_builder.CreateLoad(m_stackVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Stack::set(uint32_t _index, llvm::Value* _value)
|
void Stack::set(uint32_t _index, llvm::Value* _value)
|
||||||
{
|
{
|
||||||
m_builder.CreateStore(_value, m_args[1]); // copy value to memory
|
m_builder.CreateStore(_value, m_stackVal); // copy value to memory
|
||||||
llvm::Value* args[] = {m_args[0], m_builder.getInt32(_index), m_args[1]};
|
llvm::Value* args[] = {m_builder.getInt32(_index), m_stackVal};
|
||||||
m_builder.CreateCall(m_stackSet, args);
|
m_builder.CreateCall(m_stackSet, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -110,41 +105,33 @@ extern "C"
|
||||||
{
|
{
|
||||||
using namespace evmcc;
|
using namespace evmcc;
|
||||||
|
|
||||||
EXPORT void* evmccrt_stack_create()
|
EXPORT void evmccrt_stack_push(i256* _word)
|
||||||
{
|
{
|
||||||
// TODO: Simplify stack pointer passing
|
//debugStack("push", *_word);
|
||||||
auto stack = &Runtime::getStack();
|
Runtime::getStack().push_back(*_word);
|
||||||
std::cerr << "STACK create\n";
|
|
||||||
return stack;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void evmccrt_stack_push(StackImpl* _stack, i256* _word)
|
EXPORT void evmccrt_stack_pop(i256* _outWord)
|
||||||
{
|
{
|
||||||
debugStack("push", *_word);
|
assert(!Runtime::getStack().empty());
|
||||||
_stack->push_back(*_word);
|
auto word = &Runtime::getStack().back();
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT void evmccrt_stack_pop(StackImpl* _stack, i256* _outWord)
|
|
||||||
{
|
|
||||||
assert(!_stack->empty());
|
|
||||||
auto word = &_stack->back();
|
|
||||||
//debugStack("pop", *word);
|
//debugStack("pop", *word);
|
||||||
_stack->pop_back();
|
Runtime::getStack().pop_back();
|
||||||
*_outWord = *word;
|
*_outWord = *word;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void evmccrt_stack_get(StackImpl* _stack, uint32_t _index, i256* _outWord)
|
EXPORT void evmccrt_stack_get(uint32_t _index, i256* _outWord)
|
||||||
{
|
{
|
||||||
assert(_index < _stack->size());
|
assert(_index < Runtime::getStack().size());
|
||||||
auto word = _stack->rbegin() + _index;
|
auto word = Runtime::getStack().rbegin() + _index;
|
||||||
//debugStack("get", *word, _index);
|
//debugStack("get", *word, _index);
|
||||||
*_outWord = *word;
|
*_outWord = *word;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void evmccrt_stack_set(StackImpl* _stack, uint32_t _index, i256* _word)
|
EXPORT void evmccrt_stack_set(uint32_t _index, i256* _word)
|
||||||
{
|
{
|
||||||
assert(_index < _stack->size());
|
assert(_index < Runtime::getStack().size());
|
||||||
*(_stack->rbegin() + _index) = *_word;
|
*(Runtime::getStack().rbegin() + _index) = *_word;
|
||||||
//debugStack("set", *_word, _index);
|
//debugStack("set", *_word, _index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
llvm::IRBuilder<>& m_builder;
|
llvm::IRBuilder<>& m_builder;
|
||||||
llvm::Value* m_args[2];
|
llvm::Value* m_stackVal;
|
||||||
llvm::Function* m_stackPush;
|
llvm::Function* m_stackPush;
|
||||||
llvm::Function* m_stackPop;
|
llvm::Function* m_stackPop;
|
||||||
llvm::Function* m_stackGet;
|
llvm::Function* m_stackGet;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue