[llvm] r217325 - [MCJIT] Fix a bug RuntimeDyldImpl's read/writeBytesUnaligned methods.
Lang Hames
lhames at gmail.com
Sat Sep 6 19:05:27 PDT 2014
Author: lhames
Date: Sat Sep 6 21:05:26 2014
New Revision: 217325
URL: http://llvm.org/viewvc/llvm-project?rev=217325&view=rev
Log:
[MCJIT] Fix a bug RuntimeDyldImpl's read/writeBytesUnaligned methods.
The previous implementation was writing to the high-bytes of integers on BE
targets (when run on LE hosts).
http://llvm.org/PR20640
Modified:
llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=217325&r1=217324&r2=217325&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Sat Sep 6 21:05:26 2014
@@ -398,32 +398,30 @@ unsigned RuntimeDyldImpl::computeSection
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++;
- }
+ if (IsTargetLittleEndian) {
+ Src += Size - 1;
+ while (Size--)
+ Result = (Result << 8) | *Src--;
+ } else
+ while (Size--)
+ Result = (Result << 8) | *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);
+ if (IsTargetLittleEndian) {
+ while (Size--) {
+ *Dst++ = Value & 0xFF;
+ Value >>= 8;
+ }
} else {
- Src += Size - 1;
- for (unsigned i = 0; i < Size; ++i)
- *Dst++ = *Src--;
+ Dst += Size - 1;
+ while (Size--) {
+ *Dst-- = Value & 0xFF;
+ Value >>= 8;
+ }
}
}
More information about the llvm-commits
mailing list