COFF: Implement string tail merging.
authorPeter Collingbourne <peter@pcc.me.uk>
Thu, 15 Mar 2018 21:14:02 +0000 (21:14 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Thu, 15 Mar 2018 21:14:02 +0000 (21:14 +0000)
commitf1a11f87a04672d1b0d8e355ece1516a40477362
treeb8461d85cd50d8880cd5c2224185a9d1819964bc
parent435b0991156363022223e8ff480fbb66b6bb257d
COFF: Implement string tail merging.

In COFF, duplicate string literals are merged by placing them in a
comdat whose leader symbol name contains a specific prefix followed
by the hash and partial contents of the string literal. This gives
us an easy way to identify sections containing string literals in
the linker: check for leader symbol names with the given prefix.

Any sections that are identified in this way as containing string
literals may be tail merged. We do so using the StringTableBuilder
class, which is also used to tail merge string literals in the ELF
linker. Tail merging is enabled only if ICF is enabled, as this
provides a signal as to whether the user cares about binary size.

Differential Revision: https://reviews.llvm.org/D44504

llvm-svn: 327668
lld/COFF/Chunks.cpp
lld/COFF/Chunks.h
lld/COFF/ICF.cpp
lld/COFF/InputFiles.cpp
lld/COFF/InputFiles.h
lld/COFF/Writer.cpp
lld/test/COFF/string-tail-merge.s [new file with mode: 0644]