mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 12:46:44 +00:00
The way runtime data is passed to jit'ed contract changed
This commit is contained in:
parent
b8e0ad1fd4
commit
969f1b54a3
6 changed files with 52 additions and 18 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in a new issue