<div dir="ltr">On Mon, Jul 29, 2013 at 9:40 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"><div class="im">On 29/07/13 15:30, Anton Korobeynikov 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"><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">
<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">
object in place on the stack or at least call its copy constructor.<br>
</blockquote>
<br>
<br>
what does GCC do?<br>
</blockquote>
Nothing. It does not support MSVC ABI.<br>
</blockquote>
<br></div>
Maybe we shouldn't either :)  So the ABI requires the struct to be pushed on the<br>
stack by the caller along with the other parameters, and what's more it requires<br>
the caller to execute some code on that copy, in place on the stack, before<br>
performing the call.  Is that right?<br></blockquote><div><br></div><div>Just calling the copy ctor is the bare minimum needed to support the ABI.  cl.exe uses a more efficient lowering that evaluates the arguments right to left directly into the outgoing argument stack slots.  It lowers following call to bar to something like:</div>
<div><br></div><div>struct A {int x; int y;};</div><div>A foo();</div><div>void bar(int, A, int);</div><div>...</div><div>bar(0xdead, foo(), 0xbeef);</div><div><br></div><div>x86_32 pseudo intel asm:</div><div><br></div><div>
push 0xdead</div><div>sub esp, 8</div><div>push esp  # sret arg for foo</div><div>call foo</div><div>add esp, 4 # clear sret arg</div><div>push 0xbeef</div><div>call bar</div><div>add 16 # clear args</div><div><br></div><div>
With the current proposal, LLVM would generate code that adjusts the stack once to begin the call, and once more to end it.  Initially, it would do a blind SP restore, but that can be optimized to a constant SP adjustment.  Arguments will still be evaluated left to right and will be stored into the special alloca outgoing argument slots.</div>
</div></div></div>