Browse Source

Remove helper function for getting an item from global stack.

cl-refactor
Paweł Bylica 10 years ago
parent
commit
403b4c0399
  1. 2
      evmjit/libevmjit/Compiler.cpp
  2. 43
      evmjit/libevmjit/Stack.cpp
  3. 13
      evmjit/libevmjit/Stack.h

2
evmjit/libevmjit/Compiler.cpp

@ -139,7 +139,7 @@ std::unique_ptr<llvm::Module> Compiler::compile(code_iterator _begin, code_itera
GasMeter gasMeter(m_builder, runtimeManager);
Memory memory(runtimeManager, gasMeter);
Ext ext(runtimeManager, memory);
Stack stack(m_builder, runtimeManager);
Stack stack(m_builder);
runtimeManager.setStack(stack); // Runtime Manager will free stack memory
Arith256 arith(m_builder);

43
evmjit/libevmjit/Stack.cpp

@ -16,52 +16,14 @@ namespace eth
namespace jit
{
Stack::Stack(llvm::IRBuilder<>& _builder, RuntimeManager& _runtimeManager):
Stack::Stack(llvm::IRBuilder<>& _builder):
CompilerHelper(_builder),
m_runtimeManager(_runtimeManager),
m_stack(_builder, "stack")
{}
llvm::Function* Stack::getGetFunc()
{
auto& func = m_get;
if (!func)
{
llvm::Type* argTypes[] = {Type::Size, Type::Size, Type::BytePtr};
func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::ExternalLinkage, "stack.require", getModule());
auto index = &func->getArgumentList().front();
index->setName("index");
auto size = index->getNextNode();
size->setName("size");
auto jmpBuf = size->getNextNode();
jmpBuf->setName("jmpBuf");
InsertPointGuard guard{m_builder};
auto entryBB = llvm::BasicBlock::Create(m_builder.getContext(), {}, func);
auto underflowBB = llvm::BasicBlock::Create(m_builder.getContext(), "Underflow", func);
auto returnBB = llvm::BasicBlock::Create(m_builder.getContext(), "Return", func);
m_builder.SetInsertPoint(entryBB);
auto underflow = m_builder.CreateICmpUGE(index, size, "underflow");
m_builder.CreateCondBr(underflow, underflowBB, returnBB);
m_builder.SetInsertPoint(underflowBB);
m_runtimeManager.abort(jmpBuf);
m_builder.CreateUnreachable();
m_builder.SetInsertPoint(returnBB);
m_builder.CreateRetVoid();
}
return func;
}
llvm::Value* Stack::get(size_t _index)
{
createCall(getGetFunc(), {m_builder.getInt64(_index), m_stack.size(), m_runtimeManager.getJmpBuf()});
auto value = m_stack.get(m_builder.CreateSub(m_stack.size(), m_builder.getInt64(_index + 1)));
//return m_builder.CreateLoad(valuePtr);
return value;
return m_stack.get(m_builder.CreateSub(m_stack.size(), m_builder.getInt64(_index + 1)));
}
void Stack::set(size_t _index, llvm::Value* _value)
@ -71,7 +33,6 @@ void Stack::set(size_t _index, llvm::Value* _value)
void Stack::pop(size_t _count)
{
// TODO: We should place stack.require() check and begining of every BB
m_stack.pop(m_builder.getInt64(_count));
}

13
evmjit/libevmjit/Stack.h

@ -1,7 +1,5 @@
#pragma once
#include <functional>
#include "Array.h"
namespace dev
@ -10,12 +8,11 @@ namespace eth
{
namespace jit
{
class RuntimeManager;
class Stack : public CompilerHelper
class Stack: public CompilerHelper
{
public:
Stack(llvm::IRBuilder<>& builder, RuntimeManager& runtimeManager);
Stack(llvm::IRBuilder<>& builder);
llvm::Value* get(size_t _index);
void set(size_t _index, llvm::Value* _value);
@ -24,10 +21,6 @@ public:
void free() { m_stack.free(); }
private:
llvm::Function* getGetFunc();
RuntimeManager& m_runtimeManager;
llvm::Function* m_get = nullptr;
Array m_stack;
};
@ -35,5 +28,3 @@ private:
}
}
}

Loading…
Cancel
Save