diff --git a/libevmjit/Runtime.cpp b/libevmjit/Runtime.cpp index 1f2e786b6..71ec944da 100644 --- a/libevmjit/Runtime.cpp +++ b/libevmjit/Runtime.cpp @@ -20,16 +20,16 @@ Runtime::Runtime(RuntimeData* _data, Env* _env) : bytes_ref Runtime::getReturnData() const { - // TODO: Handle large indexes - auto offset = static_cast(m_data.elems[RuntimeData::ReturnDataOffset].a); + auto data = m_data.callData; auto size = static_cast(m_data.callDataSize); - assert(offset + size <= m_memory.size() || size == 0); - if (offset + size > m_memory.size()) + if (data < m_memory.data() || data >= m_memory.data() + m_memory.size() || size == 0) + { + assert(size == 0); // data can be an invalid pointer only if size is 0 return {}; + } - auto dataBeg = m_memory.data() + offset; - return bytes_ref{dataBeg, size}; + return bytes_ref{data, size}; } } diff --git a/libevmjit/RuntimeData.h b/libevmjit/RuntimeData.h index 3b128f317..7c33b1ec6 100644 --- a/libevmjit/RuntimeData.h +++ b/libevmjit/RuntimeData.h @@ -27,7 +27,6 @@ struct RuntimeData _size, - ReturnDataOffset = CallValue, // Reuse 2 fields for return data reference SuicideDestAddress = Address, ///< Suicide balance destination address }; diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index 75802593f..c979c793e 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -127,7 +127,12 @@ void RuntimeManager::set(RuntimeData::Index _index, llvm::Value* _value) void RuntimeManager::registerReturnData(llvm::Value* _offset, llvm::Value* _size) { - set(RuntimeData::ReturnDataOffset, _offset); + auto memPtr = getBuilder().CreateStructGEP(getRuntimePtr(), 3); + auto mem = getBuilder().CreateLoad(memPtr, "memory"); + auto returnDataPtr = getBuilder().CreateGEP(mem, _offset); + auto callDataPtr = getBuilder().CreateStructGEP(getDataPtr(), 1); + getBuilder().CreateStore(returnDataPtr, callDataPtr); + auto ptr = getBuilder().CreateStructGEP(getDataPtr(), 4); assert(ptr->getType() == Type::Size->getPointerTo()); assert(_size->getType() == Type::Word);