[llvm] r217325 - [MCJIT] Fix a bug RuntimeDyldImpl's read/writeBytesUnaligned methods.
David Blaikie
dblaikie at gmail.com
Sun Sep 7 21:10:52 PDT 2014
On Sat, Sep 6, 2014 at 7:05 PM, Lang Hames <lhames at gmail.com> wrote:
> 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).
>
Not testable? (curious what limitations of your new test infrastructure (or
curiosities of this issue) make it not applicable to testing this bug)
& any nice way to factor the (admittedly minor) duplication in each of
these codepaths? (could have a function that takes the increment (1 or -1),
non-type template parameter if necessary, but it looks simple/inlinable?)
>
> 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;
> + }
> }
> }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140907/36f001ee/attachment.html>
More information about the llvm-commits
mailing list