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).
Consider leaving a brief note explaining how __attribute__((noinline)) inline affects linkonce_odr -- this may look confusing to some readers.