llvm.org GIT mirror llvm / 847573b
[ARM, ELF] Don't shift movt relocation offsets 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. Differential Revision: https://reviews.llvm.org/D35242 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307713 91177308-0d34-0410-b5e6-96231b3b80d8 Martin Storsjo 3 years ago
2 changed file(s) with 14 addition(s) and 2 deletion(s). Raw diff Collapse all Expand all
391391 case FK_SecRel_4:
392392 return Value;
393393 case ARM::fixup_arm_movt_hi16:
394 if (!IsPCRel)
394 if (!IsPCRel && !STI->getTargetTriple().isOSBinFormatELF())
395395 Value >>= 16;
396396 LLVM_FALLTHROUGH;
397397 case ARM::fixup_arm_movw_lo16: {
403403 return Value;
404404 }
405405 case ARM::fixup_t2_movt_hi16:
406 if (!IsPCRel)
406 if (!IsPCRel && !STI->getTargetTriple().isOSBinFormatELF())
407407 Value >>= 16;
408408 LLVM_FALLTHROUGH;
409409 case ARM::fixup_t2_movw_lo16: {
1313 movw r0, :lower16:GOT-(.LPC0_2+8)
1414 movt r0, :upper16:GOT-(.LPC0_2+8)
1515 .LPC0_2:
16 movw r0, :lower16:extern_symbol+1234
17 movt r0, :upper16:extern_symbol+1234
1618 @ ASM: movw r0, :lower16:(GOT-(.LPC0_2+8))
1719 @ ASM-NEXT: movt r0, :upper16:(GOT-(.LPC0_2+8))
20 @ ASM: movw r0, :lower16:(extern_symbol+1234)
21 @ ASM-NEXT: movt r0, :upper16:(extern_symbol+1234)
1822
1923 @OBJ: Disassembly of section .text:
2024 @OBJ-NEXT: barf:
2226 @OBJ-NEXT: 00000000: R_ARM_MOVW_PREL_NC GOT
2327 @OBJ-NEXT: 4: f4 0f 4f e3 movt r0, #65524
2428 @OBJ-NEXT: 00000004: R_ARM_MOVT_PREL GOT
29 @OBJ-NEXT: 8: d2 04 00 e3 movw r0, #1234
30 @OBJ-NEXT: 00000008: R_ARM_MOVW_ABS_NC extern_symbol
31 @OBJ-NEXT: c: d2 04 40 e3 movt r0, #1234
32 @OBJ-NEXT: 0000000c: R_ARM_MOVT_ABS extern_symbol
2533
2634 @THUMB: Disassembly of section .text:
2735 @THUMB-NEXT: barf:
2937 @THUMB-NEXT: 00000000: R_ARM_THM_MOVW_PREL_NC GOT
3038 @THUMB-NEXT: 4: cf f6 f4 70 movt r0, #65524
3139 @THUMB-NEXT: 00000004: R_ARM_THM_MOVT_PREL GOT
40 @THUMB-NEXT: 8: 40 f2 d2 40 movw r0, #1234
41 @THUMB-NEXT: 00000008: R_ARM_THM_MOVW_ABS_NC extern_symbol
42 @THUMB-NEXT: c: c0 f2 d2 40 movt r0, #1234
43 @THUMB-NEXT: 0000000c: R_ARM_THM_MOVT_ABS extern_symbol