Earlier in LLD's evolution, I tried to create the illusion that
subsections were indistinguishable from "top-level" sections. Thus, even
though the subsections shared many common field values, I hid those
common values away in a private Shared struct (see D105305). More
recently, however, @gkm added a public Section struct in D113241 that
served as an explicit way to store values that are common to an entire
set of subsections (aka InputSections). Now that we have another "common
value" struct, Shared has been rendered redundant. All its fields can
be moved into Section instead, and the pointer to Shared can be replaced
with a pointer to Section.
This Section pointer also has the advantage of letting us inspect other
subsections easily, simplifying the implementation of D118798: [lld-macho] Include address offsets in error messages.
P.S. I do think that having both Section and InputSection makes for
a slightly confusing naming scheme. I considered renaming InputSection
to Subsection, but that would break the symmetry with OutputSection.
It would also make us deviate from LLD-ELF's naming scheme.
This change is perf-neutral on my 3.2 GHz 16-Core Intel Xeon W machine:
base diff difference (95% CI) sys_time 1.258 ± 0.031 1.248 ± 0.023 [ -1.6% .. +0.1%] user_time 3.659 ± 0.047 3.658 ± 0.041 [ -0.5% .. +0.4%] wall_time 4.640 ± 0.085 4.625 ± 0.063 [ -1.0% .. +0.3%] samples 49 61
There's also no stat sig change in RSS (as measured by time -l):
base diff difference (95% CI) time 998038627.097 ± 13567305.958 1003327715.556 ± 15210451.236 [ -0.2% .. +1.2%] samples 31 36
what would we call this Subsection if InputSection were to be renamed?