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

Lu Weining via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 27 22:17:43 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);
----------------
SixWeining wrote:

We discussed with developers of ld's loongarch port, but they think the check is necessary in ld and lld don't need to align with it.

How about adding an assertion here as a compromise?

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


More information about the llvm-commits mailing list