summaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86CallingConv.td
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-12-03 20:51:23 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-12-03 20:51:23 +0000
commit21a9fd247ef20f03f6ac8d61daa20d44e39c11b5 (patch)
tree5730f8e5ab66234d76853cff3fa8a84e7ca68ee8 /lib/Target/X86/X86CallingConv.td
parent3916f6c45a2bda2e6733a03dc3df67e63187f3eb (diff)
downloadllvm-21a9fd247ef20f03f6ac8d61daa20d44e39c11b5.tar.gz
llvm-21a9fd247ef20f03f6ac8d61daa20d44e39c11b5.tar.bz2
llvm-21a9fd247ef20f03f6ac8d61daa20d44e39c11b5.tar.xz
Fix mingw32 thiscall + sret.
Unlike msvc, when handling a thiscall + sret gcc will * Put the sret in %ecx * Put the this pointer is (%esp) This fixes, for example, calling stringstream::str. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196312 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86CallingConv.td')
-rw-r--r--lib/Target/X86/X86CallingConv.td26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/Target/X86/X86CallingConv.td b/lib/Target/X86/X86CallingConv.td
index a78b5c0a79..fdc1140d59 100644
--- a/lib/Target/X86/X86CallingConv.td
+++ b/lib/Target/X86/X86CallingConv.td
@@ -453,18 +453,34 @@ def CC_X86_32_FastCall : CallingConv<[
CCDelegateTo<CC_X86_32_Common>
]>;
-def CC_X86_32_ThisCall : CallingConv<[
+def CC_X86_32_ThisCall_Common : CallingConv<[
+ // The first integer argument is passed in ECX
+ CCIfType<[i32], CCAssignToReg<[ECX]>>,
+
+ // Otherwise, same as everything else.
+ CCDelegateTo<CC_X86_32_Common>
+]>;
+
+def CC_X86_32_ThisCall_Mingw : CallingConv<[
+ // Promote i8/i16 arguments to i32.
+ CCIfType<[i8, i16], CCPromoteToType<i32>>,
+
+ CCDelegateTo<CC_X86_32_ThisCall_Common>
+]>;
+
+def CC_X86_32_ThisCall_Win : CallingConv<[
// Promote i8/i16 arguments to i32.
CCIfType<[i8, i16], CCPromoteToType<i32>>,
// Pass sret arguments indirectly through stack.
CCIfSRet<CCAssignToStack<4, 4>>,
- // The first integer argument is passed in ECX
- CCIfType<[i32], CCAssignToReg<[ECX]>>,
+ CCDelegateTo<CC_X86_32_ThisCall_Common>
+]>;
- // Otherwise, same as everything else.
- CCDelegateTo<CC_X86_32_Common>
+def CC_X86_32_ThisCall : CallingConv<[
+ CCIfSubtarget<"isTargetCygMing()", CCDelegateTo<CC_X86_32_ThisCall_Mingw>>,
+ CCDelegateTo<CC_X86_32_ThisCall_Win>
]>;
def CC_X86_32_FastCC : CallingConv<[