[PATCH] D35242: [ARM, ELF] Don't shift movt relocation offsets

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 11 08:49:15 PDT 2017


LGTM.

This will allow a pretty massive cleanup, but that is probably better
done as a follow up patch.

Thanks!
Martin Storsjö via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:

> mstorsjo created this revision.
> Herald added subscribers: kristof.beyls, javed.absar, aemerson.
>
> For ELF, a movw+movt pair is handled as two separate relocations. If an offset should be applied to the symbol address, this offset is stored as an immediate in the instruction (as opposed to stored as an offset in the relocation itself).
>
> Even though the actual value stored in the movt immediate after linking is the top half of the value, we need to store the unshifted offset prior to linking. When the relocation is made during linking, the offset gets added to the target symbol value, and the upper half of the value is stored in the instruction.
>
> This makes sure that movw+movt with offset symbols get properly handled, in case the offset addition in the lower half should be carried over to the upper half.
>
> This makes the output from the additions to the test case match the output from GNU binutils.
>
> For COFF and MachO, the movw/movt relocations are handled as a pair, and the overflow from the lower half gets carried over to the movt, so they should keep the shifted offset just as before.
>
>
> https://reviews.llvm.org/D35242
>
> Files:
>   lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
>   test/MC/ARM/elf-movt.s
>
>
> Index: test/MC/ARM/elf-movt.s
> ===================================================================
> --- test/MC/ARM/elf-movt.s
> +++ test/MC/ARM/elf-movt.s
> @@ -14,19 +14,31 @@
>  	movw	r0, :lower16:GOT-(.LPC0_2+8)
>  	movt	r0, :upper16:GOT-(.LPC0_2+8)
>  .LPC0_2:
> +	movw	r0, :lower16:extern_symbol+1234
> +	movt	r0, :upper16:extern_symbol+1234
>  @ ASM:          movw    r0, :lower16:(GOT-(.LPC0_2+8))
>  @ ASM-NEXT:     movt    r0, :upper16:(GOT-(.LPC0_2+8))
> +@ ASM:          movw    r0, :lower16:(extern_symbol+1234)
> +@ ASM-NEXT:     movt    r0, :upper16:(extern_symbol+1234)
>  
>  @OBJ:      Disassembly of section .text:
>  @OBJ-NEXT: barf:
>  @OBJ-NEXT: 0:             f0 0f 0f e3     movw    r0, #65520
>  @OBJ-NEXT: 00000000:         R_ARM_MOVW_PREL_NC   GOT
>  @OBJ-NEXT: 4:             f4 0f 4f e3     movt    r0, #65524
>  @OBJ-NEXT: 00000004:         R_ARM_MOVT_PREL      GOT
> + at OBJ-NEXT: 8:             d2 04 00 e3     movw    r0, #1234
> + at OBJ-NEXT: 00000008:         R_ARM_MOVW_ABS_NC    extern_symbol
> + at OBJ-NEXT: c:             d2 04 40 e3     movt    r0, #1234
> + at OBJ-NEXT: 0000000c:         R_ARM_MOVT_ABS       extern_symbol
>  
>  @THUMB:      Disassembly of section .text:
>  @THUMB-NEXT: barf:
>  @THUMB-NEXT: 0:             4f f6 f0 70     movw    r0, #65520
>  @THUMB-NEXT: 00000000:         R_ARM_THM_MOVW_PREL_NC GOT
>  @THUMB-NEXT: 4:             cf f6 f4 70     movt    r0, #65524
>  @THUMB-NEXT: 00000004:         R_ARM_THM_MOVT_PREL    GOT
> + at THUMB-NEXT: 8:             40 f2 d2 40     movw    r0, #1234
> + at THUMB-NEXT: 00000008:         R_ARM_THM_MOVW_ABS_NC  extern_symbol
> + at THUMB-NEXT: c:             c0 f2 d2 40     movt    r0, #1234
> + at THUMB-NEXT: 0000000c:         R_ARM_THM_MOVT_ABS     extern_symbol
> Index: lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> ===================================================================
> --- lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> +++ lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> @@ -392,7 +392,7 @@
>    case FK_SecRel_4:
>      return Value;
>    case ARM::fixup_arm_movt_hi16:
> -    if (!IsPCRel)
> +    if (!IsPCRel && !STI->getTargetTriple().isOSBinFormatELF())
>        Value >>= 16;
>      LLVM_FALLTHROUGH;
>    case ARM::fixup_arm_movw_lo16: {
> @@ -404,7 +404,7 @@
>      return Value;
>    }
>    case ARM::fixup_t2_movt_hi16:
> -    if (!IsPCRel)
> +    if (!IsPCRel && !STI->getTargetTriple().isOSBinFormatELF())
>        Value >>= 16;
>      LLVM_FALLTHROUGH;
>    case ARM::fixup_t2_movw_lo16: {
>
>
> Index: test/MC/ARM/elf-movt.s
> ===================================================================
> --- test/MC/ARM/elf-movt.s
> +++ test/MC/ARM/elf-movt.s
> @@ -14,19 +14,31 @@
>  	movw	r0, :lower16:GOT-(.LPC0_2+8)
>  	movt	r0, :upper16:GOT-(.LPC0_2+8)
>  .LPC0_2:
> +	movw	r0, :lower16:extern_symbol+1234
> +	movt	r0, :upper16:extern_symbol+1234
>  @ ASM:          movw    r0, :lower16:(GOT-(.LPC0_2+8))
>  @ ASM-NEXT:     movt    r0, :upper16:(GOT-(.LPC0_2+8))
> +@ ASM:          movw    r0, :lower16:(extern_symbol+1234)
> +@ ASM-NEXT:     movt    r0, :upper16:(extern_symbol+1234)
>  
>  @OBJ:      Disassembly of section .text:
>  @OBJ-NEXT: barf:
>  @OBJ-NEXT: 0:             f0 0f 0f e3     movw    r0, #65520
>  @OBJ-NEXT: 00000000:         R_ARM_MOVW_PREL_NC   GOT
>  @OBJ-NEXT: 4:             f4 0f 4f e3     movt    r0, #65524
>  @OBJ-NEXT: 00000004:         R_ARM_MOVT_PREL      GOT
> + at OBJ-NEXT: 8:             d2 04 00 e3     movw    r0, #1234
> + at OBJ-NEXT: 00000008:         R_ARM_MOVW_ABS_NC    extern_symbol
> + at OBJ-NEXT: c:             d2 04 40 e3     movt    r0, #1234
> + at OBJ-NEXT: 0000000c:         R_ARM_MOVT_ABS       extern_symbol
>  
>  @THUMB:      Disassembly of section .text:
>  @THUMB-NEXT: barf:
>  @THUMB-NEXT: 0:             4f f6 f0 70     movw    r0, #65520
>  @THUMB-NEXT: 00000000:         R_ARM_THM_MOVW_PREL_NC GOT
>  @THUMB-NEXT: 4:             cf f6 f4 70     movt    r0, #65524
>  @THUMB-NEXT: 00000004:         R_ARM_THM_MOVT_PREL    GOT
> + at THUMB-NEXT: 8:             40 f2 d2 40     movw    r0, #1234
> + at THUMB-NEXT: 00000008:         R_ARM_THM_MOVW_ABS_NC  extern_symbol
> + at THUMB-NEXT: c:             c0 f2 d2 40     movt    r0, #1234
> + at THUMB-NEXT: 0000000c:         R_ARM_THM_MOVT_ABS     extern_symbol
> Index: lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> ===================================================================
> --- lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> +++ lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> @@ -392,7 +392,7 @@
>    case FK_SecRel_4:
>      return Value;
>    case ARM::fixup_arm_movt_hi16:
> -    if (!IsPCRel)
> +    if (!IsPCRel && !STI->getTargetTriple().isOSBinFormatELF())
>        Value >>= 16;
>      LLVM_FALLTHROUGH;
>    case ARM::fixup_arm_movw_lo16: {
> @@ -404,7 +404,7 @@
>      return Value;
>    }
>    case ARM::fixup_t2_movt_hi16:
> -    if (!IsPCRel)
> +    if (!IsPCRel && !STI->getTargetTriple().isOSBinFormatELF())
>        Value >>= 16;
>      LLVM_FALLTHROUGH;
>    case ARM::fixup_t2_movw_lo16: {
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list