<div dir="rtl"><div dir="ltr">Hi R<span style="font-family:arial,sans-serif;font-size:12.800000190734863px">afael,</span></div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.800000190734863px"><br></span></div>

<div dir="ltr"><font face="arial, sans-serif">Isn't your other patch (thiscall methods and struct return) also needed for current MingW?</font></div><div dir="ltr"><font face="arial, sans-serif"><br></font></div><div dir="ltr">

<font face="arial, sans-serif">Yaron</font></div><div dir="ltr"><font face="arial, sans-serif"><br></font></div></div><div class="gmail_extra"><br><br><div class="gmail_quote"><div dir="ltr">2013/12/3 Rafael Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span></div>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Tue Dec  3 14:51:23 2013<br>
New Revision: 196312<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=196312&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=196312&view=rev</a><br>
Log:<br>
Fix mingw32 thiscall + sret.<br>
<br>
Unlike msvc, when handling a thiscall + sret gcc will<br>
* Put the sret in %ecx<br>
* Put the this pointer is (%esp)<br>
<br>
This fixes, for example, calling stringstream::str.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/X86/X86CallingConv.td<br>
    llvm/trunk/test/CodeGen/X86/win32_sret.ll<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86CallingConv.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CallingConv.td?rev=196312&r1=196311&r2=196312&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CallingConv.td?rev=196312&r1=196311&r2=196312&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86CallingConv.td (original)<br>
+++ llvm/trunk/lib/Target/X86/X86CallingConv.td Tue Dec  3 14:51:23 2013<br>
@@ -453,18 +453,34 @@ def CC_X86_32_FastCall : CallingConv<[<br>
   CCDelegateTo<CC_X86_32_Common><br>
 ]>;<br>
<br>
-def CC_X86_32_ThisCall : CallingConv<[<br>
+def CC_X86_32_ThisCall_Common : CallingConv<[<br>
+  // The first integer argument is passed in ECX<br>
+  CCIfType<[i32], CCAssignToReg<[ECX]>>,<br>
+<br>
+  // Otherwise, same as everything else.<br>
+  CCDelegateTo<CC_X86_32_Common><br>
+]>;<br>
+<br>
+def CC_X86_32_ThisCall_Mingw : CallingConv<[<br>
+  // Promote i8/i16 arguments to i32.<br>
+  CCIfType<[i8, i16], CCPromoteToType<i32>>,<br>
+<br>
+  CCDelegateTo<CC_X86_32_ThisCall_Common><br>
+]>;<br>
+<br>
+def CC_X86_32_ThisCall_Win : CallingConv<[<br>
   // Promote i8/i16 arguments to i32.<br>
   CCIfType<[i8, i16], CCPromoteToType<i32>>,<br>
<br>
   // Pass sret arguments indirectly through stack.<br>
   CCIfSRet<CCAssignToStack<4, 4>>,<br>
<br>
-  // The first integer argument is passed in ECX<br>
-  CCIfType<[i32], CCAssignToReg<[ECX]>>,<br>
+  CCDelegateTo<CC_X86_32_ThisCall_Common><br>
+]>;<br>
<br>
-  // Otherwise, same as everything else.<br>
-  CCDelegateTo<CC_X86_32_Common><br>
+def CC_X86_32_ThisCall : CallingConv<[<br>
+  CCIfSubtarget<"isTargetCygMing()", CCDelegateTo<CC_X86_32_ThisCall_Mingw>>,<br>
+  CCDelegateTo<CC_X86_32_ThisCall_Win><br>
 ]>;<br>
<br>
 def CC_X86_32_FastCC : CallingConv<[<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/win32_sret.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/win32_sret.ll?rev=196312&r1=196311&r2=196312&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/win32_sret.ll?rev=196312&r1=196311&r2=196312&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/win32_sret.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/win32_sret.ll Tue Dec  3 14:51:23 2013<br>
@@ -124,3 +124,31 @@ entry:<br>
 ; WIN32:      ret<br>
   ret void<br>
 }<br>
+<br>
+<br>
+%struct.test6 = type { i32, i32, i32 }<br>
+define void @test6_f(%struct.test6* %x) nounwind {<br>
+; WIN32-LABEL: _test6_f:<br>
+; MINGW_X86-LABEL: _test6_f:<br>
+<br>
+; The %x argument is moved to %ecx. It will be the this pointer.<br>
+; WIN32: movl    8(%ebp), %ecx<br>
+<br>
+; The %x argument is moved to (%esp). It will be the this pointer. With -O0<br>
+; we copy esp to ecx and use (ecx) instead of (esp).<br>
+; MINGW_X86: movl    8(%ebp), %eax<br>
+; MINGW_X86: movl    %eax, (%e{{([a-d]x)|(sp)}})<br>
+<br>
+; The sret pointer is (%esp)<br>
+; WIN32:          leal    8(%esp), %[[REG:e[a-d]x]]<br>
+; WIN32-NEXT:     movl    %[[REG]], (%e{{([a-d]x)|(sp)}})<br>
+<br>
+; The sret pointer is %ecx<br>
+; MINGW_X86-NEXT: leal    8(%esp), %ecx<br>
+; MINGW_X86-NEXT: calll   _test6_g<br>
+<br>
+  %tmp = alloca %struct.test6, align 4<br>
+  call x86_thiscallcc void @test6_g(%struct.test6* sret %tmp, %struct.test6* %x)<br>
+  ret void<br>
+}<br>
+declare x86_thiscallcc void @test6_g(%struct.test6* sret, %struct.test6*)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>