It turns out that the debug info describing the Sema class is an
appreciable percentage of the total object file size of objects in Sema.
By adding a key function, clang is able to optimize the debug info size
by emitting a forward declaration in TUs that do not define the key
On Windows, with clang-cl, these are the total object file sizes before
and after this change when compiling with optimizations and debug info:
before: 335,012 KB after: 278,116 KB delta: -56,896 KB percent: -17.0%
The effect on link time was negligible, despite having ~56MB less input.
On Linux, with clang, these are the same sizes using DWARF -g and
before: 603,756 KB after: 515,340 KB delta: -88,416 KB percent: -14.6%
I didn't use type units, DWARF-5, fission, or any other special flags.