[PATCH] D113818: [MachO] Shrink reloc from 32 bytes to 24 bytes

Shoaib Meenai via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 12 16:23:39 PST 2021


smeenai created this revision.
Herald added a reviewer: gkm.
Herald added a project: lld-macho.
Herald added a reviewer: lld-macho.
smeenai requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

The `r_address` field of `relocation_info` is only 4 bytes, so our
offset field (which is the `r_address` field adjusted for subsection
splitting) also only needs to be 4 bytes. This reduces the structure
size from 32 bytes to 24 bytes.

Combined with https://reviews.llvm.org/D113813, this is a minor perf
improvement for linking an internal app, tested on two machines:

             smol-relocs     baseline        difference (95% CI)
  sys_time   7.367 ± 0.138   7.543 ± 0.157   [  +0.9% ..   +3.8%]
  user_time  21.843 ± 0.351  21.861 ± 0.450  [  -1.3% ..   +1.4%]
  wall_time  20.301 ± 0.307  20.556 ± 0.324  [  +0.1% ..   +2.4%]
  samples    16              16
  
             smol-relocs     baseline        difference (95% CI)
  sys_time   2.923 ± 0.050   2.992 ± 0.018   [  +1.4% ..   +3.4%]
  user_time  10.345 ± 0.039  10.448 ± 0.023  [  +0.8% ..   +1.2%]
  wall_time  12.068 ± 0.071  12.229 ± 0.021  [  +1.0% ..   +1.7%]
  samples    15              12

More importantly though, this change by itself reduces our maximum
resident set size by 220 MB (2.75%, from 7.85 MB to 7.64 MB) on the
first machine. On the second machine, it reduces it by 125 MB (1.94%,
from 6.31 GB to 6.19 GB).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D113818

Files:
  lld/MachO/InputFiles.cpp
  lld/MachO/Relocations.h


Index: lld/MachO/Relocations.h
===================================================================
--- lld/MachO/Relocations.h
+++ lld/MachO/Relocations.h
@@ -56,13 +56,16 @@
   uint8_t length = 0;
   // The offset from the start of the subsection that this relocation belongs
   // to.
-  uint64_t offset = 0;
+  uint32_t offset = 0;
   // Adding this offset to the address of the referent symbol or subsection
   // gives the destination that this relocation refers to.
   int64_t addend = 0;
   llvm::PointerUnion<Symbol *, InputSection *> referent = nullptr;
 };
 
+static_assert(sizeof(void *) != 8 || sizeof(Reloc) == 24,
+              "Try to minimize Reloc's size; we create many instances");
+
 bool validateSymbolRelocation(const Symbol *, const InputSection *,
                               const Reloc &);
 
Index: lld/MachO/InputFiles.cpp
===================================================================
--- lld/MachO/InputFiles.cpp
+++ lld/MachO/InputFiles.cpp
@@ -351,8 +351,8 @@
 // any subsection splitting has occurred). It will be updated to represent the
 // same location as an offset relative to the start of the containing
 // subsection.
-static InputSection *findContainingSubsection(SubsectionMap &map,
-                                              uint64_t *offset) {
+template <class T>
+static InputSection *findContainingSubsection(SubsectionMap &map, T *offset) {
   auto it = std::prev(llvm::upper_bound(
       map, *offset, [](uint64_t value, SubsectionEntry subsecEntry) {
         return value < subsecEntry.offset;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D113818.386982.patch
Type: text/x-patch
Size: 1558 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211113/42f1d296/attachment.bin>


More information about the llvm-commits mailing list