Browse Source

Pass return data pointer using callData field

cl-refactor
Paweł Bylica 10 years ago
parent
commit
8b72dd603f
  1. 12
      libevmjit/Runtime.cpp
  2. 1
      libevmjit/RuntimeData.h
  3. 7
      libevmjit/RuntimeManager.cpp

12
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<size_t>(m_data.elems[RuntimeData::ReturnDataOffset].a);
auto data = m_data.callData;
auto size = static_cast<size_t>(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};
}
}

1
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
};

7
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);

Loading…
Cancel
Save