[llvm-branch-commits] [lld] [lld][Hexagon] Fix R_HEX_B22_PCREL range checks (#115925) (PR #116906)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Nov 19 18:38:34 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld-elf
Author: Brian Cain (androm3da)
<details>
<summary>Changes</summary>
Range checks for R_HEX_B22_PCREL did not account for the fact that offset is measured in instructions, not bytes.
Add a test for all range-checked relocations.
---
Full diff: https://github.com/llvm/llvm-project/pull/116906.diff
3 Files Affected:
- (modified) lld/ELF/Arch/Hexagon.cpp (+1-1)
- (modified) lld/test/ELF/hexagon-jump-error.s (+1-1)
- (modified) lld/test/ELF/hexagon.s (+40-1)
``````````diff
diff --git a/lld/ELF/Arch/Hexagon.cpp b/lld/ELF/Arch/Hexagon.cpp
index 56cf96fd177042..8bcd28309f8b38 100644
--- a/lld/ELF/Arch/Hexagon.cpp
+++ b/lld/ELF/Arch/Hexagon.cpp
@@ -329,7 +329,7 @@ void Hexagon::relocate(uint8_t *loc, const Relocation &rel,
case R_HEX_B22_PCREL:
case R_HEX_GD_PLT_B22_PCREL:
case R_HEX_PLT_B22_PCREL:
- checkInt(loc, val, 22, rel);
+ checkInt(loc, val, 24, rel);
or32le(loc, applyMask(0x1ff3ffe, val >> 2));
break;
case R_HEX_B22_PCREL_X:
diff --git a/lld/test/ELF/hexagon-jump-error.s b/lld/test/ELF/hexagon-jump-error.s
index fec873827e573d..53860b5daf2b16 100644
--- a/lld/test/ELF/hexagon-jump-error.s
+++ b/lld/test/ELF/hexagon-jump-error.s
@@ -25,7 +25,7 @@ if (p0) jump #1f
.section b15, "ax"
1:
-# CHECK: relocation R_HEX_B22_PCREL out of range: 8388612 is not in [-2097152, 2097151]
+# CHECK: relocation R_HEX_B22_PCREL out of range: 8388612 is not in [-8388608, 8388607]
jump #1f
.space (1<<23)
.section b22, "ax"
diff --git a/lld/test/ELF/hexagon.s b/lld/test/ELF/hexagon.s
index 8ef9b8eead8f19..b1576fb47d81af 100644
--- a/lld/test/ELF/hexagon.s
+++ b/lld/test/ELF/hexagon.s
@@ -1,7 +1,9 @@
# REQUIRES: hexagon
# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %s -o %t.o
# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %S/Inputs/hexagon.s -o %t1.o
-# RUN: ld.lld %t.o %t1.o -o %t
+# RUN: ld.lld %t.o %t1.o -o %t --Ttext=0x200b4 --section-start=b_1000000=0x1000000 \
+# RUN: --section-start=b_1000400=0x1000400 --section-start=b_1004000=0x1004000 \
+# RUN: --section-start=b_1010000=0x1010000 --section-start=b_1800000=0x1800000
# RUN: llvm-objdump --no-print-imm-hex -d %t | FileCheck %s
# Note: 131584 == 0x20200
@@ -221,3 +223,40 @@ r0 = memw(r1+##_start)
memw(r0+##_start) = r1
# CHECK: memw(r0+##131644) = r1
+
+
+## Tests for maximum branch ranges reachable without trampolines.
+
+.section b_1000000, "ax"
+## The nop makes sure the first jump is within range.
+nop
+{ r0 = #0; jump #b_1000400 } // R_HEX_B9_PCREL
+if (r0==#0) jump:t #b_1004000 // R_HEX_B13_PCREL
+if (p0) jump #b_1010000 // R_HEX_B15_PCREL
+jump #b_1800000 // R_HEX_B22_PCREL
+
+.section b_1000400, "ax"
+nop
+
+.section b_1004000, "ax"
+nop
+
+.section b_1010000, "ax"
+nop
+
+.section b_1800000, "ax"
+nop
+
+## Make sure we got the right relocations.
+# RUN: llvm-readelf -r %t.o | FileCheck %s --check-prefix=REL
+# REL: R_HEX_B9_PCREL 00000000 b_1000400
+# REL: R_HEX_B13_PCREL 00000000 b_1004000
+# REL: R_HEX_B15_PCREL 00000000 b_1010000
+# REL: R_HEX_B22_PCREL 00000000 b_1800000
+
+# CHECK: 01000000 <b_1000000>:
+# CHECK-NEXT: 1000000: {{.*}} { nop }
+# CHECK-NEXT: 1000004: {{.*}} { r0 = #0 ; jump 0x1000400 }
+# CHECK-NEXT: 1000008: {{.*}} { if (r0==#0) jump:t 0x1004000 }
+# CHECK-NEXT: 100000c: {{.*}} { if (p0) jump:nt 0x1010000 }
+# CHECK-NEXT: 1000010: {{.*}} { jump 0x1800000 }
``````````
</details>
https://github.com/llvm/llvm-project/pull/116906
More information about the llvm-branch-commits
mailing list