Safe ICF: Pointer Safe and Unwinding Aware Identical Code Folding in Gold
Venue
GCC Developers Summit (2010)
Publication Year
2010
Authors
Sriraman Tallam, Cary Coutant, Ian Lance Taylor, Xinliang David Li, Chris Demetriou
BibTeX
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.
