diff --git a/lld/ELF/Arch/ARM.cpp b/lld/ELF/Arch/ARM.cpp index 7d2953ddf64f0..e667fdc0633c5 100644 --- a/lld/ELF/Arch/ARM.cpp +++ b/lld/ELF/Arch/ARM.cpp @@ -663,12 +663,12 @@ void ARM::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const { case R_ARM_THM_JUMP8: // We do a 9 bit check because val is right-shifted by 1 bit. checkInt(ctx, loc, val, 9, rel); - write16(ctx, loc, (read32(ctx, loc) & 0xff00) | ((val >> 1) & 0x00ff)); + write16(ctx, loc, (read16(ctx, loc) & 0xff00) | ((val >> 1) & 0x00ff)); break; case R_ARM_THM_JUMP11: // We do a 12 bit check because val is right-shifted by 1 bit. checkInt(ctx, loc, val, 12, rel); - write16(ctx, loc, (read32(ctx, loc) & 0xf800) | ((val >> 1) & 0x07ff)); + write16(ctx, loc, (read16(ctx, loc) & 0xf800) | ((val >> 1) & 0x07ff)); break; case R_ARM_THM_JUMP19: // Encoding T3: Val = S:J2:J1:imm6:imm11:0 diff --git a/lld/test/ELF/arm-thumb-jump8-11.s b/lld/test/ELF/arm-thumb-jump8-11.s new file mode 100644 index 0000000000000..ed54f3c0cc945 --- /dev/null +++ b/lld/test/ELF/arm-thumb-jump8-11.s @@ -0,0 +1,32 @@ +# REQUIRES: arm + +# RUN: llvm-mc -triple thumbv6m-arm-eabi --filetype=obj %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-objdump -d %t --no-show-raw-insn | FileCheck %s --check-prefixes=CHECK,CHECK-LE + +# RUN: llvm-mc -triple thumbebv6m-arm-eabi --filetype=obj %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-objdump -d %t --no-show-raw-insn | FileCheck %s --check-prefixes=CHECK,CHECK-BE + +# CHECK-LE: file format elf32-littlearm +# CHECK-BE: file format elf32-bigarm + +# CHECK: Disassembly of section .text: + +# CHECK-LABEL: [[#%x,TARGET:]] : +# CHECK-NEXT: [[#TARGET]]: bx lr + +# CHECK-LABEL: <_start>: +# CHECK-NEXT: b 0x[[#TARGET]] +# CHECK-NEXT: beq 0x[[#TARGET]] + + .thumb + .section .text.1, "ax", %progbits +target: + bx lr + + .section .text.2, "ax", %progbits + .globl _start +_start: + b.n target // R_ARM_THM_JUMP11 + beq.n target // R_ARM_THM_JUMP8