RFC: Update Intel386, x86-64 and IA MCU psABIs for passing/returning empty struct
H.J. Lu via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 26 06:49:27 PST 2016
On Tue, Feb 23, 2016 at 5:14 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Tue, Feb 23, 2016 at 8:28 AM, H.J. Lu <hjl.tools at gmail.com> wrote:
>> On Tue, Feb 23, 2016 at 8:15 AM, Michael Matz <matz at suse.de> wrote:
>>> On Tue, 23 Feb 2016, H.J. Lu wrote:
>>>> I thought
>>>> An empty type is a type where it and all of its subobjects (recursively)
>>>> are of class, structure, union, or array type.
>>>> struct empty
>>>> empty () = default;
>>> Why would that be excluded? There are no subobjects, hence all of them
>>> are of class, structure, union or array type, hence this is an empty type.
>>> (And that's good, it indeed looks quite empty to me). Even if you would
>>> add a non-trivial copy ctor, making this thing not trivially copyable
>>> anymore, it would still be empty. Hence, given your proposed language in
>>> the psABI, without reference to any other ABI (in particular not to the
>>> Itanium C++ ABI), you would then need to pass it without registers. That
>>> can't be done, and that's exactly why I find that wording incomplete. It
>>> needs implicit references to other languages ABIs to work.
>> It is clear to me now. Let's go with
>> An empty type is a type where it and all of its subobjects (recursively)
>> are of class, structure, union, or array type. No memory slot nor
>> register should be used to pass or return an object of empty type that's
>> trivially copyable.
>> Any comments?
> Yes. "trivially copyable" is the wrong restriction. See
> http://mentorembedded.github.io/cxx-abi/abi.html#normal-call for the
> actual Itanium C++ ABI rule.
I looked it up. " trivially copyable" is covered by C++ ABI.
> It's also completely nonsensical to mention this as a special case in
> relation to empty types. The special case applies to all function
> parameters, irrespective of whether they're empty -- this rule applies
> *long* before you consider whether the type is empty. For instance, in
> the x86-64 psABI, this should go right at the start of section 2.2.3
> ("Parameter Passing and Returning Values"). But please don't add it
> there -- it's completely redundant, as section 5.1 already says that
> the Itanium C++ ABI is used, so it's not necessary to duplicate rules
> from there.
Here is the final wording:
An empty type is a type where it and all of its subobjects (recursively)
are of class, structure, union, or array type. No memory slot nor register
should be used to pass or return an object of empty type.
Footnote: Array of empty type can only passed by reference in C and C++.
Michael, can you put it in x86-64 psABI? I will update i386 and IA MCU
More information about the cfe-commits