diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-12-03 20:51:23 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-12-03 20:51:23 +0000 |
commit | 21a9fd247ef20f03f6ac8d61daa20d44e39c11b5 (patch) | |
tree | 5730f8e5ab66234d76853cff3fa8a84e7ca68ee8 /lib/Target/X86/X86CallingConv.td | |
parent | 3916f6c45a2bda2e6733a03dc3df67e63187f3eb (diff) | |
download | llvm-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.td | 26 |
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<[ |