[lld-macho] Optimize rebase opcode generation
authorDaniel Bertalan <dani@danielbertalan.dev>
Wed, 20 Jul 2022 08:09:58 +0000 (10:09 +0200)
committerDaniel Bertalan <dani@danielbertalan.dev>
Thu, 21 Jul 2022 08:00:39 +0000 (10:00 +0200)
commit54e18b23972a3fb1756bd30729102034d376dda4
tree2e472c9eebe009c2792c26690495843a192fa906
parent08db089124a49f0f97a1a6db9d1a85e5886d1eb7
[lld-macho] Optimize rebase opcode generation

This commit reduces the size of the emitted rebase sections by
generating the REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB and
REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB opcodes.

With this change, chromium_framework's rebase section is a 40% smaller
197 kilobytes, down from the previous 320 kB. That is 6 kB smaller than
what ld64 produces for the same input.

Performance figures from my M1 Mac mini:

x before
+ after

    N           Min           Max        Median           Avg        Stddev
x  10     4.2269349     4.3300061     4.2689675     4.2690016   0.031151669
+  10      4.219331     4.2914009     4.2398136     4.2448277   0.023817308
No difference proven at 95.0% confidence

Differential Revision: https://reviews.llvm.org/D130180
lld/MachO/SyntheticSections.cpp
lld/test/MachO/rebase-opcodes.s