On Sat, Nov 13, 2010 at 1:12 AM, John McCall <[email protected]> wrote:
>
> On Nov 12, 2010, at 7:52 PM, Michael Spencer wrote:
>
>> On Fri, Nov 12, 2010 at 10:14 PM, John McCall <[email protected]> wrote:
>>> On Oct 18, 2010, at 11:54 PM, Michael Spencer wrote:
>>>> The Microsoft ABI requires that structs passed by value as "expanded"
>>>> arguments maintain padding. This patch implements this and fixes
>>>> <http://llvm.org/bugs/show_bug.cgi?id=8398>.
>>>
>>> Sorry this has taken so long.  Can you explain how this approach is 
>>> different from just not passing the struct as expanded at all, i.e. passing 
>>> it byval?
>>>
>>> John.
>>
>> I thought byval was a pointer thing, would it work in this case?
>
> As I understand it, byval arguments are passed in memory by copying the 
> pointed-to object into the appropriate position in the arguments, which is 
> pretty much exactly what you want.  I think the pointer-is-secretly-a-struct 
> thing is just a throwback to before we had first-class aggregates.
>
> I'm also pretty sure that expansion won't work because it screws up 
> register-passing CCs, of which there are several we need to support on MS 
> platforms.  For example:
>
>  struct A { int x; double d; };
>  void __fastcall foo(struct A, void *, void *);  // the pointers should be 
> passed in registers, not the int and the padding pseudo-argument.
>
> John.

OK, so the actual problem is in X86_32ABIInfo::classifyArgumentType.
It should not be expanding small structs with padding, or any struct
at all when using fastcc.

- Michael Spencer

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

Reply via email to