From: Lang Hames Date: Wed, 27 Aug 2014 17:41:06 +0000 (+0000) Subject: [MCJIT] More endianness fixes for RuntimeDyldMachO. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=644e3c077cd31f57e37833c3b2044b2facbb56d8 [MCJIT] More endianness fixes for RuntimeDyldMachO. http://llvm.org/PR20640 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216567 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp index 3fa89c61508..72aae96e0c6 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp @@ -703,15 +703,18 @@ uint64_t RuntimeDyldCheckerImpl::readMemoryAtAddr(uint64_t SrcAddr, unsigned Size) const { uintptr_t PtrSizedAddr = static_cast(SrcAddr); assert(PtrSizedAddr == SrcAddr && "Linker memory pointer out-of-range."); - uint8_t *Src = reinterpret_cast(PtrSizedAddr); uint64_t Result = 0; + uint8_t *Src = reinterpret_cast(PtrSizedAddr); + uint8_t *Dst = reinterpret_cast(&Result); // If host and target endianness match use memcpy, otherwise copy in reverse // order. - if (getRTDyld().IsTargetLittleEndian == sys::IsLittleEndianHost) - memcpy(&Result, Src, Size); - else { - uint8_t *Dst = reinterpret_cast(&Result) + Size - 1; + if (getRTDyld().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++; } diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp index 35736a4df2c..9e4d3ac82af 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp @@ -29,10 +29,21 @@ namespace llvm { int64_t RuntimeDyldMachO::memcpyAddend(const RelocationEntry &RE) const { const SectionEntry &Section = Sections[RE.SectionID]; - uint8_t *LocalAddress = Section.Address + RE.Offset; unsigned NumBytes = 1 << RE.Size; int64_t Addend = 0; - memcpy(&Addend, LocalAddress, NumBytes); + uint8_t *LocalAddress = Section.Address + RE.Offset; + uint8_t *Dst = reinterpret_cast(&Addend); + + if (IsTargetLittleEndian == sys::IsLittleEndianHost) { + if (!sys::IsLittleEndianHost) + Dst += sizeof(Addend) - NumBytes; + memcpy(Dst, LocalAddress, NumBytes); + } else { + Dst += NumBytes - 1; + for (unsigned i = 0; i < NumBytes; ++i) + *Dst-- = *LocalAddress++; + } + return Addend; } @@ -113,13 +124,15 @@ void RuntimeDyldMachO::dumpRelocationToResolve(const RelocationEntry &RE, bool RuntimeDyldMachO::writeBytesUnaligned(uint8_t *Dst, uint64_t Value, unsigned Size) { - + uint8_t *Src = reinterpret_cast(&Value); // If host and target endianness match use memcpy, otherwise copy in reverse // order. - if (IsTargetLittleEndian == sys::IsLittleEndianHost) - memcpy(Dst, &Value, Size); - else { - uint8_t *Src = reinterpret_cast(&Value) + Size - 1; + 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--; }