X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FExecutionEngine%2FRuntimeDyld%2FRuntimeDyldChecker.cpp;h=72aae96e0c636d6f0b8990b191e3f8149c453bf6;hp=3fa89c615088ea0cd01ed9147ef820970f1ef13e;hb=644e3c077cd31f57e37833c3b2044b2facbb56d8;hpb=70d2d3cd4519893bff442b14d09883e03565f2a1 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++; }