This removes an abuse of ELF linker behaviors while keeping Mach-O/COFF linker
behaviors unchanged.
ELF: when module_ctor is in a comdat, this patch removes reliance on a linker
abuse (an SHT_INIT_ARRAY in a section group retains the whole group) by using
SHF_GNU_RETAIN. No linker behavior difference when module_ctor is not in a comdat.
Mach-O: module_ctor gets N_NO_DEAD_STRIP. No linker behavior difference
because module_ctor is already referenced by a S_MOD_INIT_FUNC_POINTERS
section (GC root).
PE/COFF: no-op. SanitizerCoverage already appends module_ctor to llvm.used.
Other sanitizers: llvm.used for local linkage is not implemented in
TargetLoweringObjectFileCOFF::emitLinkerDirectives (once implemented or
switched to a non-local linkage, COFF can use module_ctor in comdat (i.e.
generalize ELF-specific rL301586)).
There is no object file size difference.
I think module_ctor should have linkonce_odr hidden linkage/visibility.
This will
- make COFF deduplication work
- drop the reliance on the comdat lowering behavior on ELF (internal module_ctor should not be deduplicated, so rGc4b4253f7c63de8452eabf0105d87a17ff47748f doesn't actually conform to LangRef).
I'll investigate it in another patch.
why we don't need this one?