ICF was not able to merge equivalent sections because of relocations to sections ineligible for ICF that use alternative symbols, e.g. symbol aliases or section relative relocations. Merging in this scenario has been enabled by giving the sections that are ineligible for ICF a unique ID, i.e. an equivalence class of their own. This approach also provides another benefit as it improves the hashing that is used to perform the initial equivalance grouping for ICF. This is because the ICF ineligible sections can now contribute a unique value towards the hashes instead of the same value of zero. This has been seen to reduce link time with ICF by ~68% for objects compiled with -fprofile-instr-generate. In order to facilitate this use of a unique ID, the existing inconsistent approach to the setting of the InputSection eqClass in ICF has been changed so that there is a clear distinction between the eqClass values of ICF eligible sections and those of the ineligible sections that have a unique ID. This inconsistency could have caused incorrect equivalence class equality in the past, although it appears that no issues were encountered in actual use. Differential Revision: https://reviews.llvm.org/D88830
45 lines
1003 B
ArmAsm
45 lines
1003 B
ArmAsm
# REQUIRES: x86
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
|
|
# RUN: ld.lld %t.o -o /dev/null --keep-unique fu --icf=all --print-icf-sections | FileCheck %s
|
|
|
|
## Check that ICF is able to merge equivalent sections with relocations to
|
|
## different symbols, e.g. aliases, that refer to the same section which is
|
|
## ineligible for ICF.
|
|
|
|
# CHECK: selected section {{.*}}:(.text.f1)
|
|
# CHECK: removing identical section {{.*}}:(.text.f2)
|
|
# CHECK: removing identical section {{.*}}:(.text.f3)
|
|
# CHECK: selected section {{.*}}:(.text.f4)
|
|
# CHECK: removing identical section {{.*}}:(.text.f5)
|
|
|
|
.globl d, d_alias, fu, f1, f2, f3, f4, f5
|
|
|
|
.section .data.d,"aw",@progbits
|
|
d:
|
|
d_alias:
|
|
.long 42
|
|
|
|
.section .text.fu,"ax",@progbits
|
|
fu:
|
|
nop
|
|
|
|
.section .text.f1,"ax",@progbits
|
|
f1:
|
|
.quad d
|
|
|
|
.section .text.f2,"ax",@progbits
|
|
f2:
|
|
.quad d_alias
|
|
|
|
.section .text.f3,"ax",@progbits
|
|
f3:
|
|
.quad .data.d
|
|
|
|
.section .text.f4,"ax",@progbits
|
|
f4:
|
|
.quad fu
|
|
|
|
.section .text.f5,"ax",@progbits
|
|
f5:
|
|
.quad .text.fu
|