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
Thu Feb 11 02:53:44 PST 2016


On Thu, Feb 11, 2016 at 2:47 AM, Matthijs van Duin
<matthijsvanduin at gmail.com> wrote:
> On 8 February 2016 at 22:40, H.J. Lu <hjl.tools at gmail.com> wrote:
>> "empty type".  An empty type is either an array of empty types or a
>> class type where every member is of empty type.
>
> Note that the term "empty type" is commonly used in type theory to
> denote a (or the) type with no values.  The closest thing C has would be
> an empty enum when using -fstrict-enums.  (Declaring it as return type
> implies [[noreturn]] or undefined behaviour.)
>
> A type with a unique value (such as void or an empty struct) is usually
> known as a unit type.
>
> BTW, being standard layout is not sufficient (nor required afaict) for
> zero-register passing of a unit type.  The requirement you need is
> trivially-copyable.  Example:
>
>         #include <map>
>         #include <iostream>
>         #include <type_traits>
>
>         using namespace std;
>
>         class EmptyInt {
>                 static map< const EmptyInt *, int > values;
>
>         public:
>                 EmptyInt() = default;
>                 EmptyInt( int x ) {  values[this] = x;  }
>                 ~EmptyInt() {  values.erase(this);  }
>
>                 operator int () const {  return values[this];  }
>         };
>
>         typeof( EmptyInt::values ) EmptyInt::values;
>
>         EmptyInt foo() {
>                 return 42;
>         }
>
>         int main() {
>                 cout << is_standard_layout<EmptyInt>{} << endl;
>                 cout << foo() << endl;
>                 return 0;
>         }

My current proposal is

1. "class type".  A class type is a structure, union or C++ class.
2. "empty type".  An empty type is Plain Old Data (POD) for the
   purposes of layout, and.a type where it and all of its subobjects
   are of class or array type.

> This evil contraption satisfies all POD-requirements except for not
> being trivially-copyable.  On the other hand taking this example from
> http://en.cppreference.com/w/cpp/concept/StandardLayoutType
>
>         struct Q {};
>         struct S : Q {};
>         struct T : Q {};
>         struct U : S, T {};     // not a standard-layout class
>
> Even though U is not standard-layout, it is trivially-copyable and I see
> no reason to allocate a register to pass it.
>

Since this isn't Plain Old Data (POD) for the purposes of layout, it
isn't covered by my proposal for psABI.  I leave this to C++ ABI.


-- 
H.J.


More information about the cfe-commits mailing list