Browse Source

The way runtime data is passed to jit'ed contract changed

cl-refactor
Paweł Bylica 10 years ago
parent
commit
969f1b54a3
  1. 2
      libevmjit/ExecutionEngine.cpp
  2. 2
      libevmjit/Runtime.h
  3. 58
      libevmjit/RuntimeManager.cpp
  4. 3
      libevmjit/RuntimeManager.h
  5. 4
      libevmjit/Type.cpp
  6. 1
      libevmjit/Type.h

2
libevmjit/ExecutionEngine.cpp

@ -88,7 +88,7 @@ int ExecutionEngine::run(std::unique_ptr<llvm::Module> _module, RuntimeData* _da
auto executionStartTime = std::chrono::high_resolution_clock::now(); auto executionStartTime = std::chrono::high_resolution_clock::now();
auto result = exec->runFunction(entryFunc, {{}, llvm::GenericValue(runtime.getDataPtr())}); auto result = exec->runFunction(entryFunc, {{}, llvm::GenericValue(&runtime)});
returnCode = static_cast<ReturnCode>(result.IntVal.getZExtValue()); returnCode = static_cast<ReturnCode>(result.IntVal.getZExtValue());
auto executionEndTime = std::chrono::high_resolution_clock::now(); auto executionEndTime = std::chrono::high_resolution_clock::now();

2
libevmjit/Runtime.h

@ -38,7 +38,7 @@ public:
Runtime(const Runtime&) = delete; Runtime(const Runtime&) = delete;
void operator=(const Runtime&) = delete; void operator=(const Runtime&) = delete;
RuntimeData* getDataPtr() { return &m_data; } RuntimeData* getDataPtr() { return &m_data; } // FIXME: Remove
StackImpl& getStack() { return m_stack; } StackImpl& getStack() { return m_stack; }
MemoryImpl& getMemory() { return m_memory; } MemoryImpl& getMemory() { return m_memory; }

58
libevmjit/RuntimeManager.cpp

@ -22,10 +22,25 @@ llvm::StructType* RuntimeManager::getRuntimeDataType()
{ {
llvm::Type* elems[] = llvm::Type* elems[] =
{ {
llvm::ArrayType::get(Type::Word, RuntimeData::_size), llvm::ArrayType::get(Type::Word, RuntimeData::_size), // i256[]
Type::BytePtr, Type::BytePtr, // callData
Type::BytePtr, Type::BytePtr // code
Type::BytePtr };
type = llvm::StructType::create(elems, "RuntimeData");
}
return type;
}
llvm::StructType* RuntimeManager::getRuntimeType()
{
static llvm::StructType* type = nullptr;
if (!type)
{
llvm::Type* elems[] =
{
Type::RuntimeDataPtr, // data
Type::BytePtr, // Env*
Type::BytePtr // jmpbuf
}; };
type = llvm::StructType::create(elems, "Runtime"); type = llvm::StructType::create(elems, "Runtime");
} }
@ -59,26 +74,39 @@ llvm::Twine getName(RuntimeData::Index _index)
RuntimeManager::RuntimeManager(llvm::IRBuilder<>& _builder): CompilerHelper(_builder) RuntimeManager::RuntimeManager(llvm::IRBuilder<>& _builder): CompilerHelper(_builder)
{ {
m_dataPtr = new llvm::GlobalVariable(*getModule(), Type::RuntimePtr, false, llvm::GlobalVariable::PrivateLinkage, llvm::UndefValue::get(Type::RuntimePtr), "rt"); m_rtPtr = new llvm::GlobalVariable(*getModule(), Type::RuntimePtr, false, llvm::GlobalVariable::PrivateLinkage, llvm::UndefValue::get(Type::RuntimePtr), "rt");
m_dataPtr = new llvm::GlobalVariable(*getModule(), Type::RuntimeDataPtr, false, llvm::GlobalVariable::PrivateLinkage, llvm::UndefValue::get(Type::RuntimeDataPtr), "data");
m_longjmp = llvm::Intrinsic::getDeclaration(getModule(), llvm::Intrinsic::longjmp); m_longjmp = llvm::Intrinsic::getDeclaration(getModule(), llvm::Intrinsic::longjmp);
// Export data // Export data
auto mainFunc = getMainFunction(); auto mainFunc = getMainFunction();
llvm::Value* dataPtr = &mainFunc->getArgumentList().back(); llvm::Value* rtPtr = &mainFunc->getArgumentList().back();
m_builder.CreateStore(dataPtr, m_dataPtr); m_builder.CreateStore(rtPtr, m_rtPtr);
auto dataPtr = m_builder.CreateStructGEP(rtPtr, 0, "dataPtr");
auto data = m_builder.CreateLoad(dataPtr, "data");
m_builder.CreateStore(data, m_dataPtr);
} }
llvm::Value* RuntimeManager::getRuntimePtr() llvm::Value* RuntimeManager::getRuntimePtr()
{ {
if (auto mainFunc = getMainFunction()) // FIXME: Data ptr
return mainFunc->arg_begin()->getNextNode(); // Runtime is the second parameter of main function //if (auto mainFunc = getMainFunction())
return m_builder.CreateLoad(m_dataPtr, "rt"); // return mainFunc->arg_begin()->getNextNode(); // Runtime is the second parameter of main function
return m_builder.CreateLoad(m_rtPtr, "rt");
}
llvm::Value* RuntimeManager::getDataPtr()
{
// FIXME: Data ptr
//if (auto mainFunc = getMainFunction())
// return mainFunc->arg_begin()->getNextNode(); // Runtime is the second parameter of main function
return m_builder.CreateLoad(m_dataPtr, "data");
} }
llvm::Value* RuntimeManager::getPtr(RuntimeData::Index _index) llvm::Value* RuntimeManager::getPtr(RuntimeData::Index _index)
{ {
llvm::Value* idxList[] = {m_builder.getInt32(0), m_builder.getInt32(0), m_builder.getInt32(_index)}; llvm::Value* idxList[] = {m_builder.getInt32(0), m_builder.getInt32(0), m_builder.getInt32(_index)};
return m_builder.CreateInBoundsGEP(getRuntimePtr(), idxList, getName(_index) + "Ptr"); return m_builder.CreateInBoundsGEP(getDataPtr(), idxList, getName(_index) + "Ptr");
} }
llvm::Value* RuntimeManager::get(RuntimeData::Index _index) llvm::Value* RuntimeManager::get(RuntimeData::Index _index)
@ -126,19 +154,19 @@ llvm::Value* RuntimeManager::get(Instruction _inst)
llvm::Value* RuntimeManager::getCallData() llvm::Value* RuntimeManager::getCallData()
{ {
auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 1, "calldataPtr"); auto ptr = getBuilder().CreateStructGEP(getDataPtr(), 1, "calldataPtr");
return getBuilder().CreateLoad(ptr, "calldata"); return getBuilder().CreateLoad(ptr, "calldata");
} }
llvm::Value* RuntimeManager::getCode() llvm::Value* RuntimeManager::getCode()
{ {
auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 2, "codePtr"); auto ptr = getBuilder().CreateStructGEP(getDataPtr(), 2, "codePtr");
return getBuilder().CreateLoad(ptr, "code"); return getBuilder().CreateLoad(ptr, "code");
} }
llvm::Value* RuntimeManager::getJmpBuf() llvm::Value* RuntimeManager::getJmpBuf()
{ {
auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 3, "jmpbufPtr"); auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 2, "jmpbufPtr");
return getBuilder().CreateLoad(ptr, "jmpbuf"); return getBuilder().CreateLoad(ptr, "jmpbuf");
} }
@ -150,7 +178,7 @@ llvm::Value* RuntimeManager::getGas()
void RuntimeManager::setGas(llvm::Value* _gas) void RuntimeManager::setGas(llvm::Value* _gas)
{ {
llvm::Value* idxList[] = {m_builder.getInt32(0), m_builder.getInt32(0), m_builder.getInt32(RuntimeData::Gas)}; llvm::Value* idxList[] = {m_builder.getInt32(0), m_builder.getInt32(0), m_builder.getInt32(RuntimeData::Gas)};
auto ptr = m_builder.CreateInBoundsGEP(getRuntimePtr(), idxList, "gasPtr"); auto ptr = m_builder.CreateInBoundsGEP(getDataPtr(), idxList, "gasPtr");
m_builder.CreateStore(_gas, ptr); m_builder.CreateStore(_gas, ptr);
} }

3
libevmjit/RuntimeManager.h

@ -18,6 +18,7 @@ public:
RuntimeManager(llvm::IRBuilder<>& _builder); RuntimeManager(llvm::IRBuilder<>& _builder);
llvm::Value* getRuntimePtr(); llvm::Value* getRuntimePtr();
llvm::Value* getDataPtr();
llvm::Value* get(RuntimeData::Index _index); llvm::Value* get(RuntimeData::Index _index);
llvm::Value* get(Instruction _inst); llvm::Value* get(Instruction _inst);
@ -30,6 +31,7 @@ public:
void raiseException(ReturnCode _returnCode); void raiseException(ReturnCode _returnCode);
static llvm::StructType* getRuntimeType();
static llvm::StructType* getRuntimeDataType(); static llvm::StructType* getRuntimeDataType();
private: private:
@ -37,6 +39,7 @@ private:
void set(RuntimeData::Index _index, llvm::Value* _value); void set(RuntimeData::Index _index, llvm::Value* _value);
llvm::Value* getJmpBuf(); llvm::Value* getJmpBuf();
llvm::GlobalVariable* m_rtPtr = nullptr;
llvm::GlobalVariable* m_dataPtr = nullptr; llvm::GlobalVariable* m_dataPtr = nullptr;
llvm::Function* m_longjmp = nullptr; llvm::Function* m_longjmp = nullptr;
}; };

4
libevmjit/Type.cpp

@ -20,6 +20,7 @@ llvm::IntegerType* Type::Byte;
llvm::PointerType* Type::BytePtr; llvm::PointerType* Type::BytePtr;
llvm::Type* Type::Void; llvm::Type* Type::Void;
llvm::IntegerType* Type::MainReturn; llvm::IntegerType* Type::MainReturn;
llvm::PointerType* Type::RuntimeDataPtr;
llvm::PointerType* Type::RuntimePtr; llvm::PointerType* Type::RuntimePtr;
void Type::init(llvm::LLVMContext& _context) void Type::init(llvm::LLVMContext& _context)
@ -33,7 +34,8 @@ void Type::init(llvm::LLVMContext& _context)
BytePtr = Byte->getPointerTo(); BytePtr = Byte->getPointerTo();
Void = llvm::Type::getVoidTy(_context); Void = llvm::Type::getVoidTy(_context);
MainReturn = llvm::Type::getInt32Ty(_context); MainReturn = llvm::Type::getInt32Ty(_context);
RuntimePtr = RuntimeManager::getRuntimeDataType()->getPointerTo(); RuntimeDataPtr = RuntimeManager::getRuntimeDataType()->getPointerTo();
RuntimePtr = RuntimeManager::getRuntimeType()->getPointerTo();
} }
llvm::ConstantInt* Constant::get(int64_t _n) llvm::ConstantInt* Constant::get(int64_t _n)

1
libevmjit/Type.h

@ -31,6 +31,7 @@ struct Type
/// Main function return type /// Main function return type
static llvm::IntegerType* MainReturn; static llvm::IntegerType* MainReturn;
static llvm::PointerType* RuntimeDataPtr;
static llvm::PointerType* RuntimePtr; static llvm::PointerType* RuntimePtr;
static void init(llvm::LLVMContext& _context); static void init(llvm::LLVMContext& _context);

Loading…
Cancel
Save