[lld] [lld][LoongArch] Relax call36/tail36: R_LARCH_CALL36 (PR #123576)

WÁNG Xuěruì via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 5 22:13:05 PST 2025


================
@@ -830,6 +832,37 @@ static void relaxPCHi20Lo12(Ctx &ctx, const InputSection &sec, size_t i,
   remove = 4;
 }
 
+// Relax code sequence.
+// From:
+//   pcaddu18i $ra, %call36(foo)
+//   jirl $ra, $ra, 0
+// To:
+//   b/bl foo
+static void relaxCall36(Ctx &ctx, const InputSection &sec, size_t i,
+                        uint64_t loc, Relocation &r, uint32_t &remove) {
+  const uint64_t dest =
+      (r.expr == R_PLT_PC ? r.sym->getPltVA(ctx) : r.sym->getVA(ctx)) +
+      r.addend;
+
+  const int64_t displace = dest - loc;
+  // Check if the displace aligns 4 bytes or exceeds the range of b[l].
+  if ((displace & 0x3) != 0 || !isInt<28>(displace))
+    return;
+
+  const uint32_t nextInsn = read32le(sec.content().data() + r.offset + 4);
----------------
xen0n wrote:

Sorry for the late reply -- I didn't realize "assertion" is just `assert` before.

But now debug builds of `lld` will error out on malformed `R_LARCH_CALL36` underlying data -- this doesn't align with `ld.bfd` either because it will simply skip relaxing this piece instead of dying, so I fear the assertion may do more harm than good :shrug:

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


More information about the llvm-commits mailing list