summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2014-08-29 23:17:47 +0000
committerLang Hames <lhames@gmail.com>2014-08-29 23:17:47 +0000
commite1287c01be7c0b0e3622dd2595adceaa12b3ceff (patch)
tree31d8a2573b179c7e9ddfde4b028999956ed0f3ef /llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
parent21361fb308fa283eeb8cd2ed27a981b276eeaa15 (diff)
downloadbcm5719-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.cpp32
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,
OpenPOWER on IntegriCloud