[llvm] r284789 - Fix cross-endianness RuntimeDyld relocation for ARM

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 21 18:18:04 PDT 2016


Thanks Keno!

- Lang.

On Thu, Oct 20, 2016 at 3:15 PM, Keno Fischer via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: kfischer
> Date: Thu Oct 20 17:15:56 2016
> New Revision: 284789
>
> URL: http://llvm.org/viewvc/llvm-project?rev=284789&view=rev
> Log:
> Fix cross-endianness RuntimeDyld relocation for ARM
>
> rL284780 fixed the PREL31 relocation and added a test for it. Being
> the first such test for ARM relocations, it exposed incorrect endianness
> assumptions (causing buildbot failures on big-endian hosts). Fix that by
> using the same helpers used for the x86 case.
>
> Modified:
>     llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=284789&
> r1=284788&r2=284789&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
> (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp Thu Oct
> 20 17:15:56 2016
> @@ -465,12 +465,13 @@ void RuntimeDyldELF::resolveARMRelocatio
>      break;
>      // Write a 31bit signed offset
>    case ELF::R_ARM_PREL31:
> -    *TargetPtr &= 0x80000000;
> -    *TargetPtr |= (Value - FinalAddress) & ~0x80000000;
> +    support::ulittle32_t::ref{TargetPtr} =
> +        (support::ulittle32_t::ref{TargetPtr} & 0x80000000) |
> +        ((Value - FinalAddress) & ~0x80000000);
>      break;
>    case ELF::R_ARM_TARGET1:
>    case ELF::R_ARM_ABS32:
> -    *TargetPtr = Value;
> +    support::ulittle32_t::ref{TargetPtr} = Value;
>      break;
>      // Write first 16 bit of 32 bit value to the mov instruction.
>      // Last 4 bit should be shifted.
> @@ -480,9 +481,9 @@ void RuntimeDyldELF::resolveARMRelocatio
>        Value = Value & 0xFFFF;
>      else if (Type == ELF::R_ARM_MOVT_ABS)
>        Value = (Value >> 16) & 0xFFFF;
> -    *TargetPtr &= ~0x000F0FFF;
> -    *TargetPtr |= Value & 0xFFF;
> -    *TargetPtr |= ((Value >> 12) & 0xF) << 16;
> +    support::ulittle32_t::ref{TargetPtr} =
> +        (support::ulittle32_t::ref{TargetPtr} & ~0x000F0FFF) | (Value &
> 0xFFF) |
> +        (((Value >> 12) & 0xF) << 16);
>      break;
>      // Write 24 bit relative value to the branch instruction.
>    case ELF::R_ARM_PC24: // Fall through.
> @@ -490,9 +491,9 @@ void RuntimeDyldELF::resolveARMRelocatio
>    case ELF::R_ARM_JUMP24:
>      int32_t RelValue = static_cast<int32_t>(Value - FinalAddress - 8);
>      RelValue = (RelValue & 0x03FFFFFC) >> 2;
> -    assert((*TargetPtr & 0xFFFFFF) == 0xFFFFFE);
> -    *TargetPtr &= 0xFF000000;
> -    *TargetPtr |= RelValue;
> +    assert((support::ulittle32_t::ref{TargetPtr} & 0xFFFFFF) ==
> 0xFFFFFE);
> +    support::ulittle32_t::ref{TargetPtr} =
> +        (support::ulittle32_t::ref{TargetPtr} & 0xFF000000) | RelValue;
>      break;
>    }
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161021/05c9d1a6/attachment.html>


More information about the llvm-commits mailing list