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 bytes_ref Runtime::getReturnData() const
{ {
// TODO: Handle large indexes auto data = m_data.callData;
auto offset = static_cast<size_t>(m_data.elems[RuntimeData::ReturnDataOffset].a);
auto size = static_cast<size_t>(m_data.callDataSize); auto size = static_cast<size_t>(m_data.callDataSize);
assert(offset + size <= m_memory.size() || size == 0); if (data < m_memory.data() || data >= m_memory.data() + m_memory.size() || size == 0)
if (offset + size > m_memory.size()) {
assert(size == 0); // data can be an invalid pointer only if size is 0
return {}; return {};
}
auto dataBeg = m_memory.data() + offset; return bytes_ref{data, size};
return bytes_ref{dataBeg, size};
} }
} }

1
libevmjit/RuntimeData.h

@ -27,7 +27,6 @@ struct RuntimeData
_size, _size,
ReturnDataOffset = CallValue, // Reuse 2 fields for return data reference
SuicideDestAddress = Address, ///< Suicide balance destination address 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) 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); auto ptr = getBuilder().CreateStructGEP(getDataPtr(), 4);
assert(ptr->getType() == Type::Size->getPointerTo()); assert(ptr->getType() == Type::Size->getPointerTo());
assert(_size->getType() == Type::Word); assert(_size->getType() == Type::Word);

Loading…
Cancel
Save