[llvm-commits] [llvm] r151123 - in /llvm/trunk: lib/Target/X86/X86CallingConv.td test/CodeGen/X86/thiscall-struct-return.ll
Timur Iskhodzhanov
timurrrr at google.com
Thu Mar 28 18:45:14 PDT 2013
2012/2/21 Aaron Ballman <aaron at aaronballman.com>:
> Author: aaronballman
> Date: Tue Feb 21 21:04:40 2012
> New Revision: 151123
>
> URL: http://llvm.org/viewvc/llvm-project?rev=151123&view=rev
> Log:
> Adding support for Microsoft's thiscall calling convention. LLVM side of the patch.
>
> Added:
> llvm/trunk/test/CodeGen/X86/thiscall-struct-return.ll
> Modified:
> llvm/trunk/lib/Target/X86/X86CallingConv.td
>
> Modified: llvm/trunk/lib/Target/X86/X86CallingConv.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CallingConv.td?rev=151123&r1=151122&r2=151123&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86CallingConv.td (original)
> +++ llvm/trunk/lib/Target/X86/X86CallingConv.td Tue Feb 21 21:04:40 2012
> @@ -331,8 +331,8 @@
> // Promote i8/i16 arguments to i32.
> CCIfType<[i8, i16], CCPromoteToType<i32>>,
>
> - // The 'nest' parameter, if any, is passed in EAX.
> - CCIfNest<CCAssignToReg<[EAX]>>,
> + // Pass sret arguments indirectly through EAX
> + CCIfSRet<CCAssignToReg<[EAX]>>,
>
> // The first integer argument is passed in ECX
> CCIfType<[i32], CCAssignToReg<[ECX]>>,
>
> Added: llvm/trunk/test/CodeGen/X86/thiscall-struct-return.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/thiscall-struct-return.ll?rev=151123&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/thiscall-struct-return.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/thiscall-struct-return.ll Tue Feb 21 21:04:40 2012
> @@ -0,0 +1,47 @@
Hi Aaron,
I was working on sret vs thiscall and I thought I've fixed it locally
but then noticed this test (which I find wrong, see below) still
passes for me.
> +; RUN: llc < %s -mtriple=i386-PC-Win32 | FileCheck %s
I'm afraid triples are case-sensitive :(
As least I get different |md5sum when running my local build with
-mtriple=i386-PC-Win32 and -mtriple=i386-pc-win32.
> +%class.C = type { i8 }
> +%struct.S = type { i32 }
> +%struct.M = type { i32, i32 }
> +
> +declare void @_ZN1CC1Ev(%class.C* %this) unnamed_addr nounwind align 2
> +declare x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* noalias sret %agg.result, %class.C* %this) nounwind align 2
> +declare x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* noalias sret %agg.result, %class.C* %this) nounwind align 2
> +
> +define void @testv() nounwind {
> +; CHECK: testv:
> +; CHECK: leal
> +; CHECK-NEXT: movl %esi, (%esp)
> +; CHECK-NEXT: calll _ZN1CC1Ev
> +; CHECK: leal 8(%esp), %eax
> +; CHECK-NEXT: movl %esi, %ecx
I believe this is wrong, the address of the structure should be passed
via stack.
> +; CHECK-NEXT: calll _ZNK1C5SmallEv
> +entry:
> + %c = alloca %class.C, align 1
> + %tmp = alloca %struct.S, align 4
> + call void @_ZN1CC1Ev(%class.C* %c)
> + ; This call should put the return structure as a pointer
> + ; into EAX instead of returning directly in EAX.
AFAICT, the value of EAX value after the call should match the top of
the stack before the call.
> The this
> + ; pointer should go into ECX
> + call x86_thiscallcc void @_ZNK1C5SmallEv(%struct.S* sret %tmp, %class.C* %c)
> + ret void
> +}
> +
> +define void @test2v() nounwind {
> +; CHECK: test2v:
> +; CHECK: leal
> +; CHECK-NEXT: movl %esi, (%esp)
> +; CHECK-NEXT: calll _ZN1CC1Ev
> +; CHECK: leal 8(%esp), %eax
> +; CHECK-NEXT: movl %esi, %ecx
> +; CHECK-NEXT: calll _ZNK1C6MediumEv
> +entry:
> + %c = alloca %class.C, align 1
> + %tmp = alloca %struct.M, align 4
> + call void @_ZN1CC1Ev(%class.C* %c)
> + ; This call should put the return structure as a pointer
> + ; into EAX instead of returning directly in EAX/EDX. The this
> + ; pointer should go into ECX
> + call x86_thiscallcc void @_ZNK1C6MediumEv(%struct.M* sret %tmp, %class.C* %c)
> + ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list