Publication Data
Safe ICF: Pointer Safe and Unwinding Aware Identical Code Folding in Gold
Abstract: We have found that large C++ applications and shared
libraries tend to have many functions whose code is identical with another function. As
much as 10% of the code could theoretically be eliminated by merging such identical
functions into a single copy. This optimization, Identical Code Folding (ICF), has been
implemented in the gold linker. At link time, ICF detects functions with identical
object code and merges them into a single copy. ICF can be unsafe, however, as it can
change the run-time behaviour of code that relies on each function having a unique
address. To address this, ICF can be used in a safe mode where it identifies and folds
functions whose addresses are guaranteed not to have been used in comparison
operations. Further, profiling and debugging binaries with merged functions can be
confusing, as the PC values of merged functions cannot be always disambiguated to point
to the correct function. To address this, we propose a new call table format for the
DWARF debugging information to allow tools like the debugger and profiler to
disambiguate PC values of merged functions correctly by examining the call chain.
Detailed experiments on the x86 platform show that ICF can reduce the text size of a
selection of Google binaries, whose average text size is 64 MB, by about 6%. Also, the
code size savings of ICF with the safe option is almost as good as the code savings
obtained without the safe option. Further, experiments also show that the run-time
performance of the optimized binaries on the x86 platform does not change.
