[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