On Wed, Feb 15, 2012 at 8:51 PM, Eli Friedman <[email protected]> wrote:
>
> Index: lib/Target/X86/X86CallingConv.td
> ===================================================================
> --- lib/Target/X86/X86CallingConv.td    (revision 150629)
> +++ lib/Target/X86/X86CallingConv.td    (working copy)
> @@ -333,6 +333,9 @@
>
>   // The 'nest' parameter, if any, is passed in EAX.
>   CCIfNest<CCAssignToReg<[EAX]>>,
> +
> +  // Do not pass the sret argument in ECX
> +  CCIfSRet<CCDelegateTo<CC_X86_32_Common>>,
>
>   // The first integer argument is passed in ECX
>   CCIfType<[i32], CCAssignToReg<[ECX]>>,
>
> You say "*all* byval struct returns for thiscall methods are passed
> through the hidden pointer in EAX", but your patch puts the sret
> argument on the stack, if I'm not mistaken...

The caller allocates space on the stack and puts the pointer to it in
EAX, the callee then uses that pointer to fill out the return value,
and before returning it needs to ensure that EAX points to what the
caller passed in.

So should I be using CCPassIndirect<i32> instead to accomplish this?
And what should I do about the "nest" parameter wanting to be in EAX?
Should I move that to another reg instead?

As always, thanks for the help!

~Aaron

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to