[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