[lld-macho] Implement ICF
authorGreg McGary <gkm@fb.com>
Wed, 19 May 2021 16:58:17 +0000 (09:58 -0700)
committerGreg McGary <gkm@fb.com>
Thu, 17 Jun 2021 17:07:44 +0000 (10:07 -0700)
commitf27e4548fc42876f66dac260ca3b6df0d5fd5fd6
tree63c653e399fe01a267b278c27b2edae121f446eb
parent734d688fbce8a453aa61764b9b5a43b26455dc0d
[lld-macho] Implement ICF

ICF = Identical C(ode|OMDAT) Folding

This is the LLD ELF/COFF algorithm, adapted for MachO. So far, only `-icf all` is supported. In order to support `-icf safe`, we will need to port address-significance tables (`.addrsig` directives) to MachO, which will come in later diffs.

`check-{llvm,clang,lld}` have 0 regressions for `lld -icf all` vs. baseline ld64.

We only run ICF on `__TEXT,__text` for reasons explained in the block comment in `ConcatOutputSection.cpp`.

Here is the perf impact for linking `chromium_framekwork` on a Mac Pro (16-core Xeon W) for the non-ICF case vs. pre-ICF:
```
    N           Min           Max        Median           Avg        Stddev
x  20          4.27          4.44          4.34         4.349   0.043029977
+  20          4.37          4.46         4.405        4.4115   0.025188761
Difference at 95.0% confidence
        0.0625 +/- 0.0225658
        1.43711% +/- 0.518873%
        (Student's t, pooled s = 0.0352566)
```

Reviewed By: #lld-macho, int3

Differential Revision: https://reviews.llvm.org/D103292
20 files changed:
lld/MachO/CMakeLists.txt
lld/MachO/ConcatOutputSection.cpp
lld/MachO/ConcatOutputSection.h
lld/MachO/Config.h
lld/MachO/Driver.cpp
lld/MachO/ICF.cpp [new file with mode: 0644]
lld/MachO/ICF.h [new file with mode: 0644]
lld/MachO/InputFiles.cpp
lld/MachO/InputSection.cpp
lld/MachO/InputSection.h
lld/MachO/Options.td
lld/MachO/Symbols.cpp
lld/MachO/SyntheticSections.cpp
lld/MachO/UnwindInfoSection.cpp
lld/MachO/UnwindInfoSection.h
lld/MachO/Writer.cpp
lld/test/MachO/Inputs/MacOSX.sdk/usr/lib/libSystem.tbd
lld/test/MachO/icf-options.s [new file with mode: 0644]
lld/test/MachO/icf-scale.s [new file with mode: 0644]
lld/test/MachO/icf.s [new file with mode: 0644]