<div dir="ltr">On Mon, Sep 2, 2013 at 5:18 AM, Duncan Sands <span dir="ltr"><<a href="mailto:baldrick@free.fr" target="_blank">baldrick@free.fr</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi Reid,<br>
<br>
On 26/08/13 23:43, Reid Kleckner wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
To implement <a href="http://llvm.org/PR16959" target="_blank">http://llvm.org/PR16959</a><br>
<<a href="http://llvm.org/bugs/show_bug.cgi?id=16959" target="_blank">http://llvm.org/bugs/show_<u></u>bug.cgi?id=16959</a>>, I need to add a new field to<div class="im"><br>
global_ctors.<br>
<br>
Static data members of class template instantiations can have initializers that<br>
must only run once on program startup.  Itanium solves this with guard variables<br>
and the emission of multiple initializers, only one of which actually<br>
initializes the data at runtime.<br>
<br>
Microsoft solves this by using a COFF comdat feature called<br>
IMAGE_COMDAT_SELECT_<u></u>ASSOCIATIVE. The semantics are that the section with this<br>
attribute is only linked if the associated section is chosen for the final link.<br>
Otherwise it is discarded.<br>
<br>
In this way, only one initializer is linked and only one entry is produced in<br>
the initializer array (.CRT$XCU). Everyone I've spoken with so far thinks this<br>
is basically awesome and is much cleaner than using guard variables. :)<br>
<br>
I propose changing LangRef to make llvm.global_ctors and llvm.global_dtors be<br>
arrays of { i32, void()*, i8* }, where the last field is an optional pointer to<br>
a GlobalValue. Old modules containing { i32, void()*} elements will also be<br>
accepted, and the missing third field will be assumed to be null.<br>
<br>
When performing LTO, if there are multiple entries with the same associated<br>
global, only one of them will be kept in the linked module.<br>
</div></blockquote>
<br>
will two different globals have different initialization functions too, or will<br>
the same function be reused for many different globals?<br></blockquote><div><br></div><div>I'm not sure I follow.  Do you mean, are initialization functions reused for two globals in the same TU?</div><div><br></div>
<div>Even today, every global with a dynamic initializer gets its own void() initialization function.  We don't use a single function to initialize everything.</div><div><br></div><div>We need to enforce an ordering on initializers in a single TU, so we have a function (usually _GLOBAL_I_a) which calls each stub in turn.  After inlining, most stubs are probably eliminated.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Thanks, Duncan.<br>
<br>
 Similarly, on<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">
targets supporting this feature (COFF for the moment, but maybe ELF one day as<br>
an optimization), LLVM will emit the appropriate comdat bits so that the system<br>
linker behaves similarly. On platforms lacking this support, the old behavior<br>
will be used, in which case guard variables are still necessary.<br>
<br>
This seems fairly uncontroversial, but let me know if anyone objects. I'll try<br>
to send patches later this week.<br>
<br>
<br></div>
______________________________<u></u>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvmdev</a><br>
<br>
</blockquote>
<br>
______________________________<u></u>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvmdev</a><br>
</blockquote></div><br></div></div>