The linkage/visibility of __profn_* variables are derived
from the profiled functions.
extern_weak => linkonce available_externally => linkonce_odr internal => private extern => private _ => unchanged
The linkage/visibility of __profc_*/__profd_* variables are derived from
__profn_* with linkage/visibility wrestling for Windows.
The changes can be folded to the following without changing semantics.
if (TT.isOSBinFormatCOFF() && !NeedComdat) { Linkage = GlobalValue::InternalLinkage; Visibility = GlobalValue::DefaultVisibility; }
That said, I think we can just delete the code block.
An extern/internal function will now use private __profc_*/__profd_*
variables, instead of internal ones. This saves some symbol table entries.
A non-comdat {linkonce,weak}_odr function will now use hidden external
__profc_*/__profd_* variables instead of internal ones. There is potential
object file size increase because such symbols need /INCLUDE: directives.
However such non-comdat functions are rare (note that non-comdat weak
definitions don't prevent duplicate definition error).
@rnk The behavior change of this patch is here: previously this is 0 (similar to the PROFILE1 case). It is now 2 (like ELF) because the counter is weak and resolves to the %t0.o copy.
I think this doesn't matter because (1) the new behavior matches ELF (2) weak overriding weak is a mingw extension, not supported by link.exe.