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 GB to 7.64 GB) on the
first machine. On the second machine, it reduces it by 125 MB (1.94%,
from 6.31 GB to 6.19 GB).
hm, can't we leave it as uint64_t and have the uint32_t be automatically promoted?