From 969f1b54a32890e6f7bf6a53750931edb09f0ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Thu, 4 Dec 2014 14:37:07 +0100 Subject: [PATCH] The way runtime data is passed to jit'ed contract changed --- libevmjit/ExecutionEngine.cpp | 2 +- libevmjit/Runtime.h | 2 +- libevmjit/RuntimeManager.cpp | 58 ++++++++++++++++++++++++++--------- libevmjit/RuntimeManager.h | 3 ++ libevmjit/Type.cpp | 4 ++- libevmjit/Type.h | 1 + 6 files changed, 52 insertions(+), 18 deletions(-) diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index 64cb250f79..5236d1d367 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -88,7 +88,7 @@ int ExecutionEngine::run(std::unique_ptr _module, RuntimeData* _da 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(result.IntVal.getZExtValue()); auto executionEndTime = std::chrono::high_resolution_clock::now(); diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index ace169e007..11a995785f 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -38,7 +38,7 @@ public: Runtime(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; } MemoryImpl& getMemory() { return m_memory; } diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index 58fbd5a206..2d80ad1312 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -22,10 +22,25 @@ llvm::StructType* RuntimeManager::getRuntimeDataType() { llvm::Type* elems[] = { - llvm::ArrayType::get(Type::Word, RuntimeData::_size), - Type::BytePtr, - Type::BytePtr, - Type::BytePtr + llvm::ArrayType::get(Type::Word, RuntimeData::_size), // i256[] + Type::BytePtr, // callData + Type::BytePtr // code + }; + 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"); } @@ -59,26 +74,39 @@ llvm::Twine getName(RuntimeData::Index _index) 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); // Export data auto mainFunc = getMainFunction(); - llvm::Value* dataPtr = &mainFunc->getArgumentList().back(); - m_builder.CreateStore(dataPtr, m_dataPtr); + llvm::Value* rtPtr = &mainFunc->getArgumentList().back(); + 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() { - if (auto mainFunc = getMainFunction()) - return mainFunc->arg_begin()->getNextNode(); // Runtime is the second parameter of main function - return m_builder.CreateLoad(m_dataPtr, "rt"); + // 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_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* 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) @@ -126,19 +154,19 @@ llvm::Value* RuntimeManager::get(Instruction _inst) llvm::Value* RuntimeManager::getCallData() { - auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 1, "calldataPtr"); + auto ptr = getBuilder().CreateStructGEP(getDataPtr(), 1, "calldataPtr"); return getBuilder().CreateLoad(ptr, "calldata"); } llvm::Value* RuntimeManager::getCode() { - auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 2, "codePtr"); + auto ptr = getBuilder().CreateStructGEP(getDataPtr(), 2, "codePtr"); return getBuilder().CreateLoad(ptr, "code"); } llvm::Value* RuntimeManager::getJmpBuf() { - auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 3, "jmpbufPtr"); + auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 2, "jmpbufPtr"); return getBuilder().CreateLoad(ptr, "jmpbuf"); } @@ -150,7 +178,7 @@ llvm::Value* RuntimeManager::getGas() void RuntimeManager::setGas(llvm::Value* _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); } diff --git a/libevmjit/RuntimeManager.h b/libevmjit/RuntimeManager.h index 1231d9885c..32f7786d76 100644 --- a/libevmjit/RuntimeManager.h +++ b/libevmjit/RuntimeManager.h @@ -18,6 +18,7 @@ public: RuntimeManager(llvm::IRBuilder<>& _builder); llvm::Value* getRuntimePtr(); + llvm::Value* getDataPtr(); llvm::Value* get(RuntimeData::Index _index); llvm::Value* get(Instruction _inst); @@ -30,6 +31,7 @@ public: void raiseException(ReturnCode _returnCode); + static llvm::StructType* getRuntimeType(); static llvm::StructType* getRuntimeDataType(); private: @@ -37,6 +39,7 @@ private: void set(RuntimeData::Index _index, llvm::Value* _value); llvm::Value* getJmpBuf(); + llvm::GlobalVariable* m_rtPtr = nullptr; llvm::GlobalVariable* m_dataPtr = nullptr; llvm::Function* m_longjmp = nullptr; }; diff --git a/libevmjit/Type.cpp b/libevmjit/Type.cpp index c34be45d58..4053028605 100644 --- a/libevmjit/Type.cpp +++ b/libevmjit/Type.cpp @@ -20,6 +20,7 @@ llvm::IntegerType* Type::Byte; llvm::PointerType* Type::BytePtr; llvm::Type* Type::Void; llvm::IntegerType* Type::MainReturn; +llvm::PointerType* Type::RuntimeDataPtr; llvm::PointerType* Type::RuntimePtr; void Type::init(llvm::LLVMContext& _context) @@ -33,7 +34,8 @@ void Type::init(llvm::LLVMContext& _context) BytePtr = Byte->getPointerTo(); Void = llvm::Type::getVoidTy(_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) diff --git a/libevmjit/Type.h b/libevmjit/Type.h index d0534bd75c..393b72c5c1 100644 --- a/libevmjit/Type.h +++ b/libevmjit/Type.h @@ -31,6 +31,7 @@ struct Type /// Main function return type static llvm::IntegerType* MainReturn; + static llvm::PointerType* RuntimeDataPtr; static llvm::PointerType* RuntimePtr; static void init(llvm::LLVMContext& _context);