[llvm-branch-commits] [lld] release/22.x: [LLD] [COFF] Fix handling of immediates in ARM64_SECREL_HIGH12A (#200060) (PR #200128)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu May 28 01:18:28 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld-coff
Author: llvmbot
<details>
<summary>Changes</summary>
Backport 5c95f6a859394757b92b0d63ff90b9175056deb6
Requested by: @<!-- -->mstorsjo
---
Full diff: https://github.com/llvm/llvm-project/pull/200128.diff
2 Files Affected:
- (modified) lld/COFF/Chunks.cpp (+6-3)
- (modified) lld/test/COFF/arm64-relocs-imports.test (+5-5)
``````````diff
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp
index 409491d4a1f89..efc9ff113e623 100644
--- a/lld/COFF/Chunks.cpp
+++ b/lld/COFF/Chunks.cpp
@@ -300,13 +300,16 @@ static void applySecRelHigh12A(const SectionChunk *sec, uint8_t *off,
OutputSection *os, uint64_t s) {
if (!checkSecRel(sec, os))
return;
- uint64_t secRel = (s - os->getRVA()) >> 12;
- if (0xfff < secRel) {
+ uint32_t orig = read32le(off);
+ uint64_t imm = (orig >> 10) & 0xFFF;
+ orig &= ~(0xFFF << 10);
+ imm = (s + imm - os->getRVA()) >> 12;
+ if (0xfff < imm) {
error("overflow in SECREL_HIGH12A relocation in section: " +
sec->getSectionName());
return;
}
- applyArm64Imm(off, secRel & 0xfff, 0);
+ write32le(off, orig | (imm << 10));
}
static void applySecRelLdr(const SectionChunk *sec, uint8_t *off,
diff --git a/lld/test/COFF/arm64-relocs-imports.test b/lld/test/COFF/arm64-relocs-imports.test
index da2fd1f941d8a..c048a570674c7 100644
--- a/lld/test/COFF/arm64-relocs-imports.test
+++ b/lld/test/COFF/arm64-relocs-imports.test
@@ -39,8 +39,8 @@
# BEFORE: 74: 00000000 udf #0
# BEFORE: 78: 00000001 udf #1
# BEFORE: 7c: 00000001 udf #1
-# BEFORE: 80: 91000000 add x0, x0, #0
-# BEFORE: 84: 91400000 add x0, x0, #0, lsl #12
+# BEFORE: 80: 913c0000 add x0, x0, #3840
+# BEFORE: 84: 917c0000 add x0, x0, #3840, lsl #12
# BEFORE: 88: f9400000 ldr x0, [x0]
# BEFORE: 8c: 00000001 udf #1
# BEFORE: 90: 30091a20 adr x0, 0x123d5
@@ -83,8 +83,8 @@
# AFTER: 140001074: 00000001 udf #1
# AFTER: 140001078: 00002009 udf #8201
# AFTER: 14000107c: 00000009 udf #9
-# AFTER: 140001080: 910e2000 add x0, x0, #904
-# AFTER: 140001084: 91400400 add x0, x0, #1, lsl #12
+# AFTER: 140001080: 910a2000 add x0, x0, #648
+# AFTER: 140001084: 91400800 add x0, x0, #2, lsl #12
# AFTER: 140001088: f941c400 ldr x0, [x0, #904]
# AFTER: 14000108c: 00000003 udf #3
# AFTER: 140001090: 300995e0 adr x0, 0x14001434d
@@ -104,7 +104,7 @@ sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 4
- SectionData: FE0F1FF80000009000080091000000940001403900014079000140B9000140F90001003900010079000100B9000100F90001403D0001407D000140BD000140FD0001C03D0001003D0001007D000100BD000100FD0001803D000540F9201A01B000FC4FF9E0031F2AFE0741F8C0035FD6080000000000000001000000010000000000009100004091000040f901000000201a093001000054000000360100000002008090
+ SectionData: FE0F1FF80000009000080091000000940001403900014079000140B9000140F90001003900010079000100B9000100F90001403D0001407D000140BD000140FD0001C03D0001003D0001007D000100BD000100FD0001803D000540F9201A01B000FC4FF9E0031F2AFE0741F8C0035FD60800000000000000010000000100000000003C9100007C91000040f901000000201a093001000054000000360100000002008090
Relocations:
- VirtualAddress: 4
SymbolName: .Lstr
``````````
</details>
https://github.com/llvm/llvm-project/pull/200128
More information about the llvm-branch-commits
mailing list