[PATCH] D149735: [lld][RISCV][NFC] Simplify symbol value calculation in relax

Job Noorman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 3 02:57:33 PDT 2023


jobnoorman created this revision.
jobnoorman added a reviewer: MaskRay.
Herald added subscribers: asb, luke, pmatos, VincentWu, vkmr, frasercrmck, evandro, luismarques, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, simoncook, johnrusso, rbar, arichardson, emaste.
Herald added a project: All.
jobnoorman requested review of this revision.
Herald added subscribers: llvm-commits, pcwang-thead, eopXD.
Herald added a project: LLVM.

The `valueDelta` map was used to calculate the symbol value deltas from
the previous iteration. Since the symbol values themselves are also
updated every iteration, the following invariant holds:

  sa[i].offset == sa[i].d->value + valueDelta[sa[i].d]

Note that `sa[i].offset` contains the original value of `sa[i].d` and is
never changed.

This means that the current way of updating symbol values can be
rewritten to not need the `valueDelta` map:

  sa[i].d->value -= delta - valueDelta.find(sa[i].d)->second;
  <=> (replace invariant)
  sa[i].d->value -= delta - (sa[i].offset - sa[i].d->value);
  <=>
  sa[i].d->value = sa[i].d->value - (delta - (sa[i].offset - sa[i].d->value));
  <=>
  sa[i].d->value = sa[i].d->value - delta + sa[i].offset - sa[i].d->value;
  <=>
  sa[i].d->value = sa[i].offset - delta;

This patch implements this simplification. I believe this improves the
readability of the code as it took me quite some time to understand the
use of `valueDelta`. It might also have a slight performance benefit as
it removes one iteration over all relocations every relax iteration.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D149735

Files:
  lld/ELF/Arch/RISCV.cpp


Index: lld/ELF/Arch/RISCV.cpp
===================================================================
--- lld/ELF/Arch/RISCV.cpp
+++ lld/ELF/Arch/RISCV.cpp
@@ -662,23 +662,8 @@
   const uint64_t secAddr = sec.getVA();
   auto &aux = *sec.relaxAux;
   bool changed = false;
-
-  // Get st_value delta for symbols relative to this section from the previous
-  // iteration.
-  DenseMap<const Defined *, uint64_t> valueDelta;
   ArrayRef<SymbolAnchor> sa = ArrayRef(aux.anchors);
   uint32_t delta = 0;
-  for (auto [i, r] : llvm::enumerate(sec.relocs())) {
-    for (; sa.size() && sa[0].offset <= r.offset; sa = sa.slice(1))
-      if (!sa[0].end)
-        valueDelta[sa[0].d] = delta;
-    delta = aux.relocDeltas[i];
-  }
-  for (const SymbolAnchor &sa : sa)
-    if (!sa.end)
-      valueDelta[sa.d] = delta;
-  sa = ArrayRef(aux.anchors);
-  delta = 0;
 
   std::fill_n(aux.relocTypes.get(), sec.relocs().size(), R_RISCV_NONE);
   aux.writes.clear();
@@ -725,7 +710,7 @@
       if (sa[0].end)
         sa[0].d->size = sa[0].offset - delta - sa[0].d->value;
       else
-        sa[0].d->value -= delta - valueDelta.find(sa[0].d)->second;
+        sa[0].d->value = sa[0].offset - delta;
     }
     delta += remove;
     if (delta != cur) {
@@ -738,7 +723,7 @@
     if (a.end)
       a.d->size = a.offset - delta - a.d->value;
     else
-      a.d->value -= delta - valueDelta.find(a.d)->second;
+      a.d->value = a.offset - delta;
   }
   // Inform assignAddresses that the size has changed.
   if (!isUInt<16>(delta))


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D149735.519021.patch
Type: text/x-patch
Size: 1520 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230503/456a5d92/attachment-0001.bin>


More information about the llvm-commits mailing list