[llvm-branch-commits] [lld] release/22.x: [lld][Hexagon] Fix findMaskR8 missing duplex support (#183936) (PR #184646)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Mar 4 09:20:20 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-hexagon
@llvm/pr-subscribers-lld
Author: None (llvmbot)
<details>
<summary>Changes</summary>
Backport 9105d9c24949d8cf9b740cb874027351e7230e70
Requested by: @<!-- -->androm3da
---
Full diff: https://github.com/llvm/llvm-project/pull/184646.diff
2 Files Affected:
- (modified) lld/ELF/Arch/Hexagon.cpp (+2)
- (added) lld/test/ELF/hexagon-duplex-relocs.s (+40)
``````````diff
diff --git a/lld/ELF/Arch/Hexagon.cpp b/lld/ELF/Arch/Hexagon.cpp
index d6495e12668d7..09dee664589b2 100644
--- a/lld/ELF/Arch/Hexagon.cpp
+++ b/lld/ELF/Arch/Hexagon.cpp
@@ -217,6 +217,8 @@ static uint32_t findMaskR6(Ctx &ctx, uint32_t insn) {
}
static uint32_t findMaskR8(uint32_t insn) {
+ if (isDuplex(insn))
+ return 0x03f00000;
if ((0xff000000 & insn) == 0xde000000)
return 0x00e020e8;
if ((0xff000000 & insn) == 0x3c000000)
diff --git a/lld/test/ELF/hexagon-duplex-relocs.s b/lld/test/ELF/hexagon-duplex-relocs.s
new file mode 100644
index 0000000000000..8d7705517cb34
--- /dev/null
+++ b/lld/test/ELF/hexagon-duplex-relocs.s
@@ -0,0 +1,40 @@
+# REQUIRES: hexagon
+# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %s -o %t.o
+# RUN: llvm-readobj -r %t.o | FileCheck --check-prefix=RELOC %s
+# RUN: ld.lld %t.o -o %t
+# RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %t | FileCheck %s
+
+## Test R_HEX_8_X relocation on duplex instructions (SA1_addi).
+## findMaskR8() must use the duplex mask 0x03f00000 when parse bits [15:14]
+## are zero. Pair a non-duplex form with a duplex form using the same symbol
+## and verify both resolve to the same address.
+##
+## Duplex paths for the other findMask functions are already covered:
+## findMaskR6: hexagon.s (R_HEX_6_X duplex)
+## findMaskR11: hexagon-tls-ie.s (R_HEX_TPREL_11_X duplex)
+## findMaskR16: hexagon-shared.s (R_HEX_GOT_16_X duplex)
+
+ .globl _start, target
+ .type _start, @function
+_start:
+
+# Non-duplex reference (R_HEX_16_X, via findMaskR16)
+# RELOC: R_HEX_32_6_X target 0x0
+# RELOC-NEXT: R_HEX_16_X target 0x0
+# CHECK: { immext(#
+# CHECK-NEXT: r0 = add(r0,##[[ADDR:0x[0-9a-f]+]]) }
+ r0 = add(r0, ##target)
+
+# Duplex form (R_HEX_8_X, via findMaskR8)
+# RELOC-NEXT: R_HEX_32_6_X target 0x0
+# RELOC-NEXT: R_HEX_8_X target 0x0
+# CHECK-NEXT: { immext(#
+# CHECK-NEXT: r0 = add(r0,##[[ADDR]]); memw(r1+#0x0) = r2 }
+ { r0 = add(r0, ##target)
+ memw(r1+#0) = r2 }
+
+ jumpr r31
+
+target:
+ nop
+ jumpr r31
``````````
</details>
https://github.com/llvm/llvm-project/pull/184646
More information about the llvm-branch-commits
mailing list