<div dir="ltr">To implement <a href="http://llvm.org/bugs/show_bug.cgi?id=16959" target="_blank">http://llvm.org/PR16959</a>, I need to add a new field to global_ctors.<div><br></div><div>Static data members of class template instantiations can have initializers that must only run once on program startup.  Itanium solves this with guard variables and the emission of multiple initializers, only one of which actually initializes the data at runtime.</div>


<div><br></div><div>Microsoft solves this by using a COFF comdat feature called <span style="white-space:pre-wrap">IMAGE_COMDAT_SELECT_ASSOCIATIVE.  </span><span style="white-space:pre-wrap">The semantics are that the section with this attribute is only linked if the associated section is chosen for the final link.  Otherwise it is discarded.</span></div>


<div><span style="white-space:pre-wrap"><br></span></div><div><span style="white-space:pre-wrap">In this way, only one initializer is linked and only one entry is produced in the initializer array (.CRT$XCU).  </span><span style="white-space:pre-wrap">Everyone I've spoken with so far thinks this is basically awesome and is much cleaner than using guard variables.  :)</span></div>


<div><span style="white-space:pre-wrap"><br></span></div><div><span style="white-space:pre-wrap">I propose changing LangRef to make llvm.global_ctors and llvm.global_dtors be arrays of { i32, void()*, i8* }, where the last field is an optional pointer to a GlobalValue.  Old modules containing { i32, void()*} elements will also be accepted, and the missing third field will be assumed to be null.</span></div>

<div><br></div><div><span style="white-space:pre-wrap">When performing LTO, if there are multiple entries with the same associated global, only one of them will be kept in the linked module.  Similarly, on targets supporting this feature (COFF for the moment, but maybe ELF one day as an optimization), LLVM will emit the appropriate comdat bits so that the system linker behaves similarly.  On platforms lacking this support, the old behavior will be used, in which case guard variables are still necessary.</span></div>

<div><span style="white-space:pre-wrap"><br></span></div><div><span style="white-space:pre-wrap">This seems fairly uncontroversial, but let me know if anyone objects.  I'll try to send p</span><span style="white-space:pre-wrap">atches later this week.</span></div>


</div>