From ced66106ce9e10fe1348d4bb24e9d1a2d64274df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Yhuel?= Date: Fri, 14 Nov 2025 15:57:17 +0100 Subject: [PATCH 1/2] [llvm][ARM] Allow MOVT and MOVW on the offset between two labels In this case, the value is a constant, not an addend to a relocation. So the "Relocation Not In Range" error must not be triggered. Regression from PR #112877 Fixes #132322 --- llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp | 2 +- llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp index f8196e460ae9c..02a7b1a3d0919 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp @@ -428,7 +428,7 @@ unsigned ARMAsmBackend::adjustFixupValue(const MCAssembler &Asm, // signed 16bit range. if ((Kind == ARM::fixup_arm_movw_lo16 || Kind == ARM::fixup_arm_movt_hi16 || Kind == ARM::fixup_t2_movw_lo16 || Kind == ARM::fixup_t2_movt_hi16) && - (Addend < minIntN(16) || Addend > maxIntN(16))) { + !Target.isAbsolute() && (Addend < minIntN(16) || Addend > maxIntN(16))) { Ctx.reportError(Fixup.getLoc(), "Relocation Not In Range"); return 0; } diff --git a/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s b/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s new file mode 100644 index 0000000000000..ed888a0a4aaae --- /dev/null +++ b/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s @@ -0,0 +1,14 @@ +@RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s 2>&1 | FileCheck %s + + .text +a: + movw r1, #:lower16:b - a + 65536 + movt r1, #:upper16:b - a + 65536 +b: + +@CHECK-NOT: error: Relocation Not In Range +@CHECK-NOT: movw r1, #:lower16:b - a + 65536 +@CHECK-NOT: ^ +@CHECK-NOT: error: Relocation Not In Range +@CHECK-NOT: movt r1, #:upper16:b - a + 65536 +@CHECK-NOT: ^ From 693ac07ef8cbf36ad120ebc87260ce54bb4cfaa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Yhuel?= Date: Tue, 18 Nov 2025 11:10:04 +0100 Subject: [PATCH 2/2] fixup! [llvm][ARM] Allow MOVT and MOVW on the offset between two labels --- llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp | 2 +- llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp index 02a7b1a3d0919..cc21844b26350 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp @@ -428,7 +428,7 @@ unsigned ARMAsmBackend::adjustFixupValue(const MCAssembler &Asm, // signed 16bit range. if ((Kind == ARM::fixup_arm_movw_lo16 || Kind == ARM::fixup_arm_movt_hi16 || Kind == ARM::fixup_t2_movw_lo16 || Kind == ARM::fixup_t2_movt_hi16) && - !Target.isAbsolute() && (Addend < minIntN(16) || Addend > maxIntN(16))) { + !IsResolved && (Addend < minIntN(16) || Addend > maxIntN(16))) { Ctx.reportError(Fixup.getLoc(), "Relocation Not In Range"); return 0; } diff --git a/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s b/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s index ed888a0a4aaae..21239504bd46c 100644 --- a/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s +++ b/llvm/test/MC/ARM/arm-movt-movw-absolute-pass.s @@ -1,14 +1,9 @@ -@RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s 2>&1 | FileCheck %s +@RUN: llvm-mc -triple armv7-eabi -filetype obj %s -o - | llvm-objdump -d --triple armv7-eabi - | FileCheck %s - .text a: movw r1, #:lower16:b - a + 65536 movt r1, #:upper16:b - a + 65536 b: -@CHECK-NOT: error: Relocation Not In Range -@CHECK-NOT: movw r1, #:lower16:b - a + 65536 -@CHECK-NOT: ^ -@CHECK-NOT: error: Relocation Not In Range -@CHECK-NOT: movt r1, #:upper16:b - a + 65536 -@CHECK-NOT: ^ +@CHECK: 0: e3001008 movw r1, #0x8 +@CHECK: 4: e3401001 movt r1, #0x1