> I see now that I was mislead by the assertion message which should probably
> be "Attribute ByVal should not apply to function return values!".  I thought
> you were not allowing this attribute on any parameter of a function.  By the
> way, do you catch the case in which a parameter is marked both sret and byval?
I don't. Good catch.

> I see, thanks for this information.  However this seems to be more or
> less exactly the scheme I was suggesting: an explicit copy of the struct
> is made in the IR (done by the caller).  In the IR the copy is passed to
> the callee via a pointer which is marked byval.  In the x86_64 code
> generator the byval parameter is changed from a pointer to the copy
> into whatever special form is required (I didn't understand exactly
> how it is supposed to be passed: as an offset from the stack frame?
> If so the stack pointer is subtracted from the pointer to the copy,
> and the difference is passed).

You still have the problem that the caller must generate the copy into
the correct place in the stack frame. That is why I think this is a
all or nothing situation. We can have the FE handle the stack frame or
the backend. Using a mix will create a lot of dependencies between
them.

> > > (4) it conceptually unifies the treatment of ByVal and StructReturn 
> > > parameters.
> >
> > Which might not be generic enough. I can imagine a ABI were two
> > passing structures to a function is handled in a different way then
> > returning structures.
>
> It unifies them at the IR level not at the codegen level.
>
> Anyway, I have to say that my suggested scheme seems similar to your idea of 
> passing
> the stack pointer as an explicit argument.
>
> Finally, in order for my scheme to generate efficient code it needs to be 
> possible to
> eliminate pointless copies.  These occur for example on a platform where a 
> by-copy struct
> which is two words in size is supposed to be passed in two particular 
> registers.  At the
> codegen level the explicit copy in the IR (presumably a memcpy) will be 
> lowered to explicit
> stores (to the stack) for a struct of this size.  The target will lower the 
> byval call to a
> load of the required registers from the stack followed by the call.  How to 
> eliminate storing
> the values to the stack and then reading them out again?  As far as I know 
> LLVM codegen
> will not eliminate stack stores and reads even if they could in theory be 
> turned into
> stores to and reads from a virtual register.  I guess this is why Chris noted 
> elsewhere
> that eliminating pointless copies is hard...
>
> Ciao,
>
> Duncan.
>

Cheers,
-- 
Rafael Avila de Espindola

Google Ireland Ltd.
Gordon House
Barrow Street
Dublin 4
Ireland

Registered in Dublin, Ireland
Registration Number: 368047
_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to