From 713b33ee4260dd549da63ace7af4b722fa460a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 30 Dec 2014 18:41:18 +0100 Subject: [PATCH] Remove global private memory pointers --- libevmjit/Memory.cpp | 28 ++++++++++++++-------------- libevmjit/Memory.h | 3 --- libevmjit/Runtime.h | 2 ++ libevmjit/RuntimeManager.cpp | 4 +++- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 74e21cbfe0..95e38d4a8f 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -33,12 +33,6 @@ Memory::Memory(RuntimeManager& _runtimeManager, GasMeter& _gasMeter): m_memDump = llvm::Function::Create(dumpTy, llvm::GlobalValue::LinkageTypes::ExternalLinkage, "evmccrt_memory_dump", module); - m_data = new llvm::GlobalVariable(*module, Type::BytePtr, false, llvm::GlobalVariable::PrivateLinkage, llvm::UndefValue::get(Type::BytePtr), "mem.data"); - m_data->setUnnamedAddr(true); // Address is not important - - m_size = new llvm::GlobalVariable(*module, Type::Word, false, llvm::GlobalVariable::PrivateLinkage, Constant::get(0), "mem.size"); - m_size->setUnnamedAddr(true); // Address is not important - llvm::Type* resizeArgs[] = {Type::RuntimePtr, Type::WordPtr}; m_resize = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, resizeArgs, false), llvm::Function::ExternalLinkage, "mem_resize", module); llvm::AttrBuilder attrBuilder; @@ -80,7 +74,9 @@ llvm::Function* Memory::createRequireFunc(GasMeter& _gasMeter) auto uaddRes = m_builder.CreateCall2(uaddWO, offset, size, "res"); auto sizeRequired = m_builder.CreateExtractValue(uaddRes, 0, "sizeReq"); auto overflow1 = m_builder.CreateExtractValue(uaddRes, 1, "overflow1"); - auto currSize = m_builder.CreateLoad(m_size, "currSize"); + auto rtPtr = getRuntimeManager().getRuntimePtr(); + auto sizePtr = m_builder.CreateStructGEP(rtPtr, 4); + auto currSize = m_builder.CreateLoad(sizePtr, "currSize"); auto tooSmall = m_builder.CreateICmpULE(currSize, sizeRequired, "tooSmall"); auto resizeNeeded = m_builder.CreateOr(tooSmall, overflow1, "resizeNeeded"); m_builder.CreateCondBr(resizeNeeded, resizeBB, returnBB); // OPT branch weights? @@ -99,9 +95,10 @@ llvm::Function* Memory::createRequireFunc(GasMeter& _gasMeter) auto newWords = m_builder.CreateSub(wordsRequired, words, "addtionalWords"); _gasMeter.countMemory(newWords); // Resize - m_builder.CreateStore(sizeRequired, m_size); - auto newData = m_builder.CreateCall2(m_resize, rt, m_size, "newData"); - m_builder.CreateStore(newData, m_data); + m_builder.CreateStore(sizeRequired, sizePtr); + auto newData = m_builder.CreateCall2(m_resize, rt, sizePtr, "newData"); + auto dataPtr = m_builder.CreateStructGEP(rtPtr, 3); + m_builder.CreateStore(newData, dataPtr); m_builder.CreateBr(returnBB); // BB "Return" @@ -171,18 +168,21 @@ void Memory::storeByte(llvm::Value* _addr, llvm::Value* _word) llvm::Value* Memory::getData() { - return m_builder.CreateLoad(m_data); + auto rtPtr = getRuntimeManager().getRuntimePtr(); + auto dataPtr = m_builder.CreateStructGEP(rtPtr, 3); + return m_builder.CreateLoad(dataPtr, "data"); } llvm::Value* Memory::getSize() { - return m_builder.CreateLoad(m_size); + auto rtPtr = getRuntimeManager().getRuntimePtr(); + auto sizePtr = m_builder.CreateStructGEP(rtPtr, 4); + return m_builder.CreateLoad(sizePtr, "size"); } llvm::Value* Memory::getBytePtr(llvm::Value* _index) { - auto data = m_builder.CreateLoad(m_data, "data"); - return m_builder.CreateGEP(data, _index, "ptr"); + return m_builder.CreateGEP(getData(), _index, "ptr"); } void Memory::require(llvm::Value* _offset, llvm::Value* _size) diff --git a/libevmjit/Memory.h b/libevmjit/Memory.h index 85b0cb8335..c99f1583f5 100644 --- a/libevmjit/Memory.h +++ b/libevmjit/Memory.h @@ -33,9 +33,6 @@ private: llvm::Function* createFunc(bool _isStore, llvm::Type* _type, GasMeter& _gasMeter); llvm::Function* createRequireFunc(GasMeter& _gasMeter); - llvm::GlobalVariable* m_data; - llvm::GlobalVariable* m_size; - llvm::Function* m_resize; llvm::Function* m_require; llvm::Function* m_loadWord; diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 25da2475a4..e11dac3197 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -49,6 +49,8 @@ private: RuntimeData& m_data; ///< Pointer to data. Expected by compiled contract. Env& m_env; ///< Pointer to environment proxy. Expected by compiled contract. jmp_buf_ref m_currJmpBuf; ///< Pointer to jump buffer. Expected by compiled contract. + byte* m_memoryData = nullptr; + i256 m_memorySize = {}; jmp_buf_ref m_prevJmpBuf; std::jmp_buf m_jmpBuf; StackImpl m_stack; diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index b324da6419..e07adbe658 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -40,7 +40,9 @@ llvm::StructType* RuntimeManager::getRuntimeType() { Type::RuntimeDataPtr, // data Type::EnvPtr, // Env* - Type::BytePtr // jmpbuf + Type::BytePtr, // jmpbuf + Type::BytePtr, // memory data + Type::Word, // memory size }; type = llvm::StructType::create(elems, "Runtime"); }