/ libevmjit / Array.h
Array.h
 1  #pragma once
 2  
 3  #include <functional>
 4  
 5  #include "CompilerHelper.h"
 6  
 7  namespace dev
 8  {
 9  namespace eth
10  {
11  namespace jit
12  {
13  
14  class LazyFunction
15  {
16  public:
17  	using Creator = std::function<llvm::Function*()>;
18  
19  	LazyFunction(Creator _creator) :
20  		m_creator(_creator)
21  	{}
22  
23  	llvm::Value* call(IRBuilder& _builder, std::initializer_list<llvm::Value*> const& _args, llvm::Twine const& _name = "");
24  
25  private:
26  	llvm::Function* m_func = nullptr;
27  	Creator m_creator;
28  };
29  
30  class Array : public CompilerHelper
31  {
32  public:
33  	Array(IRBuilder& _builder, char const* _name);
34  	Array(IRBuilder& _builder, llvm::Value* _array);
35  
36  	void push(llvm::Value* _value) { m_pushFunc.call(m_builder, {m_array, _value}); }
37  	void set(llvm::Value* _index, llvm::Value* _value) { m_setFunc.call(m_builder, {m_array, _index, _value}); }
38  	llvm::Value* get(llvm::Value* _index) { return m_getFunc.call(m_builder, {m_array, _index}); }
39  	void pop(llvm::Value* _count);
40  	llvm::Value* size(llvm::Value* _array = nullptr);
41  	void free() { m_freeFunc.call(m_builder, {m_array}); }
42  
43  	void extend(llvm::Value* _arrayPtr, llvm::Value* _size);
44  	llvm::Value* getPtr(llvm::Value* _arrayPtr, llvm::Value* _index) { return m_getPtrFunc.call(m_builder, {_arrayPtr, _index}); }
45  
46  	llvm::Value* getPointerTo() const { return m_array; }
47  
48  	static llvm::Type* getType();
49  
50  private:
51  	llvm::Value* m_array = nullptr;
52  
53  	llvm::Function* createArrayPushFunc();
54  	llvm::Function* createArraySetFunc();
55  	llvm::Function* createArrayGetFunc();
56  	llvm::Function* createGetPtrFunc();
57  	llvm::Function* createFreeFunc();
58  	llvm::Function* createExtendFunc();
59  	llvm::Function* getReallocFunc();
60  
61  	LazyFunction m_pushFunc = {[this](){ return createArrayPushFunc(); }};
62  	LazyFunction m_setFunc = {[this](){ return createArraySetFunc(); }};
63  	LazyFunction m_getPtrFunc = {[this](){ return createGetPtrFunc(); }};
64  	LazyFunction m_getFunc = {[this](){ return createArrayGetFunc(); }};
65  	LazyFunction m_freeFunc = {[this](){ return createFreeFunc(); }};
66  	LazyFunction m_extendFunc = {[this](){ return createExtendFunc(); }};
67  	LazyFunction m_reallocFunc = {[this](){ return getReallocFunc(); }};
68  };
69  
70  }
71  }
72  }