[lld] [llvm] [LLD][AArch64] Make adrp+ldr relaxation per-symbol all-or-nothing (PR #208396)

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 9 09:04:52 PDT 2026


================
@@ -1022,10 +1016,38 @@ bool AArch64Relaxer::tryRelaxAdrpLdr(const Relocation &adrpRel,
   if (val != llvm::SignExtend64(val, 33))
     return false;
 
+  return true;
+}
+
+bool AArch64Relaxer::tryRelaxAdrpLdr(const Relocation &adrpRel,
+                                     const Relocation &ldrRel, uint64_t secAddr,
+                                     uint8_t *buf) const {
+  // When the definition of sym is not preemptible then we may
+  // be able to relax
+  // ADRP xn, :got: sym
+  // LDR xn, [ xn :got_lo12: sym]
+  // to
+  // ADRP xn, sym
+  // ADD xn, xn, :lo_12: sym
+
+  if (!ctx.arg.relax || adrpRel.type != R_AARCH64_ADR_GOT_PAGE ||
+      ldrRel.type != R_AARCH64_LD64_GOT_LO12_NC)
+    return false;
+
+  Symbol *sym = adrpRel.sym;
+  if (unsafeToRelaxAdrpLdr.contains(sym))
+    return false;
+
+  assert(isLegalAdrpLdrRelaxationCandidate(adrpRel, ldrRel, secAddr, buf) &&
+         "Should have been marked as unsafe");
+
+  uint32_t adrpInstr = read32le(buf + adrpRel.offset);
+  uint32_t adrpDestReg = adrpInstr & 0x1f;
+
----------------
MaskRay wrote:

The prevailing style is quite stale; no need for a blank line here

https://github.com/llvm/llvm-project/pull/208396


More information about the llvm-commits mailing list