Browse Source

Introducing CompilerHelper - a base class for... compiler helper classes like Memory, GasMeter, etc.

cl-refactor
Paweł Bylica 11 years ago
parent
commit
5e13d593be
  1. 2
      evmcc/Compiler.cpp
  2. 13
      evmcc/CompilerHelper.cpp
  3. 34
      evmcc/CompilerHelper.h
  4. 4
      evmcc/Ext.cpp
  5. 9
      evmcc/Ext.h
  6. 2
      evmcc/GasMeter.cpp
  7. 11
      evmcc/GasMeter.h
  8. 2
      evmcc/Memory.cpp
  9. 14
      evmcc/Memory.h

2
evmcc/Compiler.cpp

@ -714,7 +714,7 @@ void Compiler::compileBasicBlock(BasicBlock& basicBlock, const bytes& bytecode,
auto srcIdx = stack.pop(); auto srcIdx = stack.pop();
auto reqBytes = stack.pop(); auto reqBytes = stack.pop();
auto srcPtr = ext.code(); auto srcPtr = ext.code(); // TODO: Code & its size are constants, feature #80814234
auto srcSize = ext.codesize(); auto srcSize = ext.codesize();
memory.copyBytes(srcPtr, srcSize, srcIdx, destMemIdx, reqBytes); memory.copyBytes(srcPtr, srcSize, srcIdx, destMemIdx, reqBytes);

13
evmcc/CompilerHelper.cpp

@ -0,0 +1,13 @@
#include "CompilerHelper.h"
namespace dev
{
namespace eth
{
namespace jit
{
}
}
}

34
evmcc/CompilerHelper.h

@ -0,0 +1,34 @@
#pragma once
#include <llvm/IR/IRBuilder.h>
namespace dev
{
namespace eth
{
namespace jit
{
class CompilerHelper
{
protected:
CompilerHelper(llvm::IRBuilder<>& _builder, llvm::Module* _module):
m_builder(_builder),
m_module(_module)
{}
CompilerHelper(const CompilerHelper&) = delete;
void operator=(CompilerHelper) = delete;
/// Reference to parent compiler IR builder
llvm::IRBuilder<>& m_builder;
/// Reference to the IR module being compiled
llvm::Module* m_module;
};
}
}
}

4
evmcc/Ext.cpp

@ -43,8 +43,8 @@ struct ExtData
const byte* code; const byte* code;
}; };
Ext::Ext(llvm::IRBuilder<>& _builder, llvm::Module* module) Ext::Ext(llvm::IRBuilder<>& _builder, llvm::Module* module):
: m_builder(_builder) CompilerHelper(_builder, module)
{ {
auto&& ctx = _builder.getContext(); auto&& ctx = _builder.getContext();

9
evmcc/Ext.h

@ -1,10 +1,10 @@
#pragma once #pragma once
#include <llvm/IR/IRBuilder.h>
#include <libevm/ExtVMFace.h> #include <libevm/ExtVMFace.h>
#include "CompilerHelper.h"
namespace dev namespace dev
{ {
namespace eth namespace eth
@ -12,11 +12,10 @@ namespace eth
namespace jit namespace jit
{ {
class Ext class Ext : public CompilerHelper
{ {
public: public:
Ext(llvm::IRBuilder<>& _builder, llvm::Module* module); Ext(llvm::IRBuilder<>& _builder, llvm::Module* module);
static void init(std::unique_ptr<ExtVMFace> _ext);
llvm::Value* store(llvm::Value* _index); llvm::Value* store(llvm::Value* _index);
void setStore(llvm::Value* _index, llvm::Value* _value); void setStore(llvm::Value* _index, llvm::Value* _value);
@ -54,8 +53,6 @@ private:
llvm::Value* bswap(llvm::Value*); llvm::Value* bswap(llvm::Value*);
private: private:
llvm::IRBuilder<>& m_builder;
llvm::Value* m_args[2]; llvm::Value* m_args[2];
llvm::Value* m_arg2; llvm::Value* m_arg2;
llvm::Value* m_arg3; llvm::Value* m_arg3;

2
evmcc/GasMeter.cpp

@ -81,7 +81,7 @@ bool isCostBlockEnd(Instruction _inst)
} }
GasMeter::GasMeter(llvm::IRBuilder<>& _builder, llvm::Module* _module) : GasMeter::GasMeter(llvm::IRBuilder<>& _builder, llvm::Module* _module) :
m_builder(_builder) CompilerHelper(_builder, _module)
{ {
m_gas = new llvm::GlobalVariable(*_module, Type::i256, false, llvm::GlobalVariable::ExternalLinkage, nullptr, "gas"); m_gas = new llvm::GlobalVariable(*_module, Type::i256, false, llvm::GlobalVariable::ExternalLinkage, nullptr, "gas");
m_gas->setUnnamedAddr(true); // Address is not important m_gas->setUnnamedAddr(true); // Address is not important

11
evmcc/GasMeter.h

@ -1,10 +1,10 @@
#pragma once #pragma once
#include <llvm/IR/IRBuilder.h>
#include <libevmface/Instruction.h> #include <libevmface/Instruction.h>
#include "CompilerHelper.h"
namespace dev namespace dev
{ {
namespace eth namespace eth
@ -12,14 +12,11 @@ namespace eth
namespace jit namespace jit
{ {
class GasMeter class GasMeter : public CompilerHelper
{ {
public: public:
GasMeter(llvm::IRBuilder<>& _builder, llvm::Module* _module); GasMeter(llvm::IRBuilder<>& _builder, llvm::Module* _module);
GasMeter(const GasMeter&) = delete;
void operator=(GasMeter) = delete;
/// Count step cost of instruction /// Count step cost of instruction
void count(Instruction _inst); void count(Instruction _inst);
@ -42,7 +39,7 @@ private:
/// Cumulative gas cost of a block of instructions /// Cumulative gas cost of a block of instructions
/// @TODO Handle overflow /// @TODO Handle overflow
uint64_t m_blockCost = 0; uint64_t m_blockCost = 0;
llvm::IRBuilder<>& m_builder;
llvm::CallInst* m_checkCall = nullptr; llvm::CallInst* m_checkCall = nullptr;
llvm::GlobalVariable* m_gas; llvm::GlobalVariable* m_gas;
llvm::Function* m_gasCheckFunc; llvm::Function* m_gasCheckFunc;

2
evmcc/Memory.cpp

@ -23,7 +23,7 @@ namespace jit
{ {
Memory::Memory(llvm::IRBuilder<>& _builder, llvm::Module* _module, GasMeter& _gasMeter): Memory::Memory(llvm::IRBuilder<>& _builder, llvm::Module* _module, GasMeter& _gasMeter):
m_builder(_builder) CompilerHelper(_builder, _module)
{ {
auto i64Ty = m_builder.getInt64Ty(); auto i64Ty = m_builder.getInt64Ty();
llvm::Type* argTypes[] = {i64Ty, i64Ty}; llvm::Type* argTypes[] = {i64Ty, i64Ty};

14
evmcc/Memory.h

@ -1,9 +1,9 @@
#pragma once #pragma once
#include <llvm/IR/IRBuilder.h>
#include <libdevcore/Common.h> #include <libdevcore/Common.h>
#include "CompilerHelper.h"
namespace dev namespace dev
{ {
namespace eth namespace eth
@ -11,14 +11,10 @@ namespace eth
namespace jit namespace jit
{ {
class GasMeter; class Memory : public CompilerHelper
class Memory
{ {
public: public:
Memory(llvm::IRBuilder<>& _builder, llvm::Module* _module, GasMeter& _gasMeter); Memory(llvm::IRBuilder<>& _builder, llvm::Module* _module, class GasMeter& _gasMeter);
Memory(const Memory&) = delete;
void operator=(Memory) = delete;
llvm::Value* loadWord(llvm::Value* _addr); llvm::Value* loadWord(llvm::Value* _addr);
void storeWord(llvm::Value* _addr, llvm::Value* _word); void storeWord(llvm::Value* _addr, llvm::Value* _word);
@ -44,8 +40,6 @@ private:
llvm::Function* createRequireFunc(llvm::Module* _module, GasMeter& _gasMeter); llvm::Function* createRequireFunc(llvm::Module* _module, GasMeter& _gasMeter);
private: private:
llvm::IRBuilder<>& m_builder;
llvm::GlobalVariable* m_data; llvm::GlobalVariable* m_data;
llvm::GlobalVariable* m_size; llvm::GlobalVariable* m_size;

Loading…
Cancel
Save