/ libevmjit / Ext.h
Ext.h
  1  #pragma once
  2  
  3  #include <array>
  4  
  5  #include "JIT.h"
  6  #include "CompilerHelper.h"
  7  
  8  namespace dev
  9  {
 10  namespace eth
 11  {
 12  namespace jit
 13  {
 14  
 15  /// The flag indicating call failure in evmc_call_fn() -- highest bit set.
 16  constexpr int64_t EVM_CALL_FAILURE = 0x8000000000000000;
 17  
 18  /// The hackish constant indicating EVM_CALL + EVM_STATIC flag.
 19  constexpr int EVM_STATICCALL = EVMC_CREATE + 1;
 20  
 21  class Memory;
 22  
 23  struct MemoryRef
 24  {
 25  	llvm::Value* ptr;
 26  	llvm::Value* size;
 27  };
 28  
 29  template<typename _EnumT>
 30  struct sizeOf
 31  {
 32  	static const size_t value = static_cast<size_t>(_EnumT::_size);
 33  };
 34  
 35  enum class EnvFunc
 36  {
 37  	sload,
 38  	sstore,
 39  	sha3,
 40  	balance,
 41  	create,
 42  	call,
 43  	log,
 44  	blockhash,
 45  	extcode,
 46  
 47  	_size
 48  };
 49  
 50  class Ext : public RuntimeHelper
 51  {
 52  public:
 53  	Ext(RuntimeManager& _runtimeManager, Memory& _memoryMan);
 54  
 55  	llvm::Value* sload(llvm::Value* _index);
 56  	void sstore(llvm::Value* _index, llvm::Value* _value);
 57  
 58  	llvm::Value* balance(llvm::Value* _address);
 59  	llvm::Value* exists(llvm::Value* _address);
 60  	llvm::Value* calldataload(llvm::Value* _index);
 61  	std::tuple<llvm::Value*, llvm::Value*> create(llvm::Value* _gas, llvm::Value* _endowment, llvm::Value* _initOff, llvm::Value* _initSize);
 62  	llvm::Value* blockHash(llvm::Value* _number);
 63  
 64  	llvm::Value* sha3(llvm::Value* _inOff, llvm::Value* _inSize);
 65  	MemoryRef extcode(llvm::Value* _addr);
 66  	llvm::Value* extcodesize(llvm::Value* _addr);
 67  
 68  	void log(llvm::Value* _memIdx, llvm::Value* _numBytes, llvm::ArrayRef<llvm::Value*> _topics);
 69  	void selfdestruct(llvm::Value* _beneficiary);
 70  
 71  	llvm::Value* call(int _kind,
 72  	                  llvm::Value* _gas,
 73  	                  llvm::Value* _addr,
 74  	                  llvm::Value* _value,
 75  	                  llvm::Value* _inOff,
 76  	                  llvm::Value* _inSize,
 77  	                  llvm::Value* _outOff,
 78  	                  llvm::Value* _outSize);
 79  
 80  private:
 81  	Memory& m_memoryMan;
 82  
 83  	llvm::Value* m_size;
 84  
 85  	std::array<llvm::Function*, sizeOf<EnvFunc>::value> m_funcs;
 86  	std::array<llvm::Value*, 8> m_argAllocas;
 87  	size_t m_argCounter = 0;
 88  
 89  	/// Memory for array of up to 4 log topics
 90  	/// TODO: Merge this memory with args allocas.
 91  	llvm::Value* m_topics = nullptr;
 92  
 93  	llvm::CallInst* createCall(EnvFunc _funcId, std::initializer_list<llvm::Value*> const& _args);
 94  	llvm::Value* getArgAlloca();
 95  
 96  	llvm::Value* createCABICall(llvm::Function* _func,
 97  	                            std::initializer_list<llvm::Value*> const& _args);
 98  };
 99  
100  
101  }
102  }
103  }
104