Hi!
On Sat, Apr 25, 2020 at 12:03:10PM +0200, Jakub Jelinek wrote:
> As reported by Iain and David, powerpc-darwin and powerpc-aix* have C++14
> vs. C++17 ABI incompatibilities which are not fixed by mere adding of
> cxx17_empty_base_field_p calls. Unlike the issues that were seen on other
> targets where the artificial empty base field affected function argument
> passing or returning of values, on these two targets the difference is
> during class layout, not afterwards (e.g.
> struct empty_base {};
> struct S : public empty_base { unsigned long long l[2]; };
> will have different __alignof__ (S) between C++14 and C++17 (or possibly
> with double instead of unsigned long long too)).
>
> The aim of the calls.c (cxx17_empty_base_field_p) was not to match random
> artificial fields with zero size, because they could be created by something
> else for some other reason, thus the DECL_SIZE is bitsize_zero but TYPE_SIZE
> is non-zero check. Unfortunately, during the class layout, the empty base
> fields have a different type, one which has zero size, so the predicate only
> works after the class is laid out completely.
>
> This patch adds a langhook, which will return true for those cases. It
> shouldn't be problematic with LTO, because lto1 should see only
> structures/classes that are already laid out, or if it does some structure
> layout, it won't be something that has C++17 empty base artificial fields.
Ah okay. Maybe this *whole* thing should have been a langhook?
> Tested with cross to powerpc-darwin12 on a simple testcase given from Iain,
> but otherwise untested.
> Iain/David, could you please test this on your targets?
The rs6000 part is fine (and the rest looks good, too). If Iain and
David agree of course :-)
Segher
> 2020-04-25 Jakub Jelinek <[email protected]>
>
> PR target/94707
> * langhooks.h (struct lang_hooks_for_decls): Add
> cxx17_empty_base_field_p member.
> * langhooks-def.h (LANG_HOOKS_CXX17_EMPTY_BASE_FIELD_P): Define.
> (LANG_HOOKS_DECLS): Use it.
> * calls.c (cxx17_empty_base_field_p): Use
> langhooks.decls.cxx17_empty_base_field_p.
> * config/rs6000/rs6000.c (rs6000_special_round_type_align,
> darwin_rs6000_special_round_type_align): Skip cxx17_empty_base_field_p
> fields.
> cp/
> * cp-objcp-common.h (cp_cxx17_empty_base_field_p): Declare.
> (LANG_HOOKS_CXX17_EMPTY_BASE_FIELD_P): Redefine.
> * class.c (cp_cxx17_empty_base_field_p): New function.