diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -131,9 +131,14 @@ // SampleFDO is used, if a function doesn't have sample, it could be very // cold or it could be a new function never being sampled. Those functions // will be kept in the ".text.unknown" section. + // ".text.split." holds symbols which are split out from functions in other + // input sections. For example, with -fsplit-machine-functions, placing the + // cold parts in .text.split instead of .text.unlikely mitigates against poor + // profile inaccuracy. Techniques such as hugepage remapping can make + // conservative decisions at the section granularity. if (config->zKeepTextSectionPrefix) for (StringRef v : {".text.hot.", ".text.unknown.", ".text.unlikely.", - ".text.startup.", ".text.exit."}) + ".text.startup.", ".text.exit.", ".text.split."}) if (isSectionPrefix(v, s->name)) return v.drop_back(); diff --git a/lld/test/ELF/text-section-prefix.s b/lld/test/ELF/text-section-prefix.s --- a/lld/test/ELF/text-section-prefix.s +++ b/lld/test/ELF/text-section-prefix.s @@ -15,9 +15,10 @@ # KEEP: [ 1] .text # KEEP-NEXT: [ 2] .text.hot # KEEP-NEXT: [ 3] .text.unknown -# KEEP-NEXT: [ 4] .text.startup -# KEEP-NEXT: [ 5] .text.exit -# KEEP-NEXT: [ 6] .text.unlikely +# KEEP-NEXT: [ 4] .text.split +# KEEP-NEXT: [ 5] .text.startup +# KEEP-NEXT: [ 6] .text.exit +# KEEP-NEXT: [ 7] .text.unlikely # NOKEEP: [ 1] .text # NOKEEP-NOT: .text @@ -32,6 +33,7 @@ # SCRIPT-NEXT: .text.f # SCRIPT-NEXT: .text.hot.f_hot # SCRIPT-NEXT: .text.unknown.f_unknown +# SCRIPT-NEXT: .text.split.f_split # SCRIPT-NEXT: .text.startup.f_startup # SCRIPT-NEXT: .text.exit.f_exit # SCRIPT-NEXT: .text.unlikely.f_unlikely @@ -49,6 +51,9 @@ .section .text.unknown.f_unknown,"ax" nop +.section .text.split.f_split,"ax" + nop + .section .text.startup.f_startup,"ax" nop