From c3a34659036b55fa36a5355fdd67133f427eeb2d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 22 Apr 2020 16:44:42 +0200 Subject: calls: Introduce cxx17_empty_base_field_p [PR94383] As multiple targets are affected apparently, I believe at least aarch64, arm, powerpc64le, s390{,x} and ia64, I think we should have a middle-end predicate for this, so that if we need to tweak it, we can do it in one spot. 2020-04-22 Jakub Jelinek PR target/94383 * calls.h (cxx17_empty_base_field_p): Declare. * calls.c (cxx17_empty_base_field_p): Define. --- gcc/calls.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'gcc/calls.c') diff --git a/gcc/calls.c b/gcc/calls.c index 5bd9227..9ac7f94 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -6261,5 +6261,23 @@ must_pass_va_arg_in_stack (tree type) return targetm.calls.must_pass_in_stack (arg); } +/* Return true if FIELD is the C++17 empty base field that should + be ignored for ABI calling convention decisions in order to + maintain ABI compatibility between C++14 and earlier, which doesn't + add this FIELD to classes with empty bases, and C++17 and later + which does. */ + +bool +cxx17_empty_base_field_p (const_tree field) +{ + return (TREE_CODE (field) == FIELD_DECL + && DECL_ARTIFICIAL (field) + && RECORD_OR_UNION_TYPE_P (TREE_TYPE (field)) + && DECL_SIZE (field) + && integer_zerop (DECL_SIZE (field)) + && TYPE_SIZE (TREE_TYPE (field)) + && !integer_zerop (TYPE_SIZE (TREE_TYPE (field)))); +} + /* Tell the garbage collector about GTY markers in this source file. */ #include "gt-calls.h" -- cgit v1.1