In SanitizerCoverage, the metadata sections (__sancov_guards,
__sancov_cntrs, __sancov_bools) are referenced by functions. After
inlining, such a __sancov_* section can be referenced by more than one
functions, but its sh_link still refers to the original function's section.
(Note: a SHF_LINK_ORDER section referenced by a section other than its linked-to
section violates the invariant.)
If the original function's section is discarded (e.g. LTO internalization +
ld.lld --gc-sections), ld.lld may report a sh_link points to discarded section error.
This above reasoning means that !associated is not appropriate to be called by
an inlinable function. Non-interposable functions are inline candidates, so we
have to drop !associated. A __sancov_pcs is not referenced by other sections
but is expected to parallel a metadata section, so we have to make sure the two
sections are retained or discarded at the same time. A section group does the
trick. (Note: we have a module ctor, so getUniqueModuleId guarantees to
return a non-empty string, and GetOrCreateFunctionComdat guarantees to return
For interposable functions, we could keep using !associated, but
LTO can change the linkage to internal and allow such functions to be inlinable,
so we have to drop !associated, too. To not interfere with section
group resolution, we need to use the noduplicates variant (section group flag 0).
(This allows us to get rid of the ModuleID parameter.)
In -fno-pie and -fpie code (mostly dso_local), instrumented interposable
functions have WeakAny/LinkOnceAny linkages, which are rare. So the
section group header overload should be low.
This patch does not change the object file output for COFF (where !associated is ignored).