<span style="background-color:transparent">On Wed, Nov 2, 2011 at 3:14 PM, John McCall </span><span dir="ltr" style="background-color:transparent"><<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>></span><span style="background-color:transparent"> wrote:</span><br>


<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div><div>On Nov 2, 2011, at 2:33 PM, Jan Voung wrote:</div>


<blockquote type="cite"><div><span style="background-color:rgb(255, 255, 255);font-family:arial, helvetica, sans-serif">re: passing c++ objects with copy constructors/destructors, there are multiple ABIs for doing this (e.g., the gcc way, msvc way).</span></div>


</blockquote><div><br></div></div><div>There are?  How does MSVC do it that's not just passing a pointer to a temporary?  Is the callee responsible for copying into a temporary or something?  I can't imagine how that would work.</div>


<div><br></div></div></div></blockquote><div> </div><div>I don't have good documentation on it, but there is a description of it: <a href="http://llvm.org/bugs/show_bug.cgi?id=5064" style="background-color:transparent" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=5064</a>. The temp copy is part of the argument stack, and the constructors are run with that arg stack slot as "this".</div>


<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div><blockquote type="cite"><div><span style="background-color:rgb(255, 255, 255);font-family:arial, helvetica, sans-serif"> </span><span style="background-color:rgb(255, 255, 255);font-family:arial, helvetica, sans-serif">Is there a reason that the</span><span style="background-color:rgb(255, 255, 255);font-family:arial, helvetica, sans-serif"> DefaultABIInfo's classifyArgumentType doesn't match either of the existing ABIs? It both makes a temp copy the gcc way, AND marks pointers as "byval". All of the </span><span style="background-color:rgb(255, 255, 255);font-family:arial, helvetica, sans-serif">other ABIs (x86, arm, mips) which would check and do:</span></div>





<div><span style="background-color:rgb(255, 255, 255);font-family:arial, helvetica, sans-serif"><br></span></div><div><span style="background-color:rgb(255, 255, 255);font-family:arial, helvetica, sans-serif"><div>    if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty))</div>





<div>      return ABIArgInfo::getIndirect(0, /*ByVal=*/false);</div><div><br></div><div>to only have one temp copy. So, should the default not mark "byval"?</div></span></div></blockquote><div><br></div></div>Yes, you're right, the default should not mark byval.</div>


<span><font color="#888888"><div><br></div><div>John.</div></font></span></div></blockquote></div><br><div>Change to default attached. </div>