diff options
author | Lang Hames <lhames@gmail.com> | 2014-08-29 23:17:47 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-08-29 23:17:47 +0000 |
commit | e1287c01be7c0b0e3622dd2595adceaa12b3ceff (patch) | |
tree | 31d8a2573b179c7e9ddfde4b028999956ed0f3ef /llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | |
parent | 21361fb308fa283eeb8cd2ed27a981b276eeaa15 (diff) | |
download | bcm5719-llvm-e1287c01be7c0b0e3622dd2595adceaa12b3ceff.tar.gz bcm5719-llvm-e1287c01be7c0b0e3622dd2595adceaa12b3ceff.zip |
[MCJIT] Move endian-aware read/writes from RuntimeDyldMachO into
RuntimeDyldImpl.
These are platform independent, and moving them to the base class allows
RuntimeDyldChecker to use them too.
llvm-svn: 216801
Diffstat (limited to 'llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 7693fd5d0e7..537a683cd5f 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -395,6 +395,38 @@ unsigned RuntimeDyldImpl::computeSectionStubBufSize(ObjectImage &Obj, return StubBufSize; } +uint64_t RuntimeDyldImpl::readBytesUnaligned(uint8_t *Src, + unsigned Size) const { + uint64_t Result = 0; + uint8_t *Dst = reinterpret_cast<uint8_t*>(&Result); + + if (IsTargetLittleEndian == sys::IsLittleEndianHost) { + if (!sys::IsLittleEndianHost) + Dst += sizeof(Result) - Size; + memcpy(Dst, Src, Size); + } else { + Dst += Size - 1; + for (unsigned i = 0; i < Size; ++i) + *Dst-- = *Src++; + } + + return Result; +} + +void RuntimeDyldImpl::writeBytesUnaligned(uint64_t Value, uint8_t *Dst, + unsigned Size) const { + uint8_t *Src = reinterpret_cast<uint8_t*>(&Value); + if (IsTargetLittleEndian == sys::IsLittleEndianHost) { + if (!sys::IsLittleEndianHost) + Src += sizeof(Value) - Size; + memcpy(Dst, Src, Size); + } else { + Src += Size - 1; + for (unsigned i = 0; i < Size; ++i) + *Dst++ = *Src--; + } +} + void RuntimeDyldImpl::emitCommonSymbols(ObjectImage &Obj, const CommonSymbolMap &CommonSymbols, uint64_t TotalSize, |