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