From patchwork Wed Apr 6 13:44:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xi Ruoyao X-Patchwork-Id: 52675 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B4AFB38515F3 for ; Wed, 6 Apr 2022 13:45:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B4AFB38515F3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1649252733; bh=IDDZxiRYEf3qWYWxqsgmE4EZyqcVqyY+2KOApZajySk=; h=Subject:To:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=oY0e/nQ2UK4LYkrNydj+05Y93KFrWxDa0q+mpqg815DD/WHAmj+8RxEMrKK/HDYGG oniraP344n2hEDX0iaLPXDFOhL4fPUkVrz96RaxFuACIW/Ev7/gfCmQWkh4FuXmZXM Qz6cuFa2cI5/MCd9QtQalvqOwJHEm2cr51CrKYY0= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mengyan1223.wang (mengyan1223.wang [89.208.246.23]) by sourceware.org (Postfix) with ESMTPS id 05B3F385E447; Wed, 6 Apr 2022 13:44:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 05B3F385E447 Received: from [IPv6:240e:358:1198:7700:dc73:854d:832e:4] (unknown [IPv6:240e:358:1198:7700:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature ECDSA (P-384)) (Client did not present a certificate) (Authenticated sender: xry111@mengyan1223.wang) by mengyan1223.wang (Postfix) with ESMTPSA id 1A2F8662CE; Wed, 6 Apr 2022 09:44:39 -0400 (EDT) Message-ID: <5a7f486da7458d9606e0ebbd87a097a3560bbb2b.camel@mengyan1223.wang> Subject: [PATCH v2] mips: Fix C++14 vs. C++17 ABI incompatibility on mips64 To: Jakub Jelinek Date: Wed, 06 Apr 2022 21:44:33 +0800 In-Reply-To: References: <4a202164da6a53b1f892dedb3e2d42ecd612e379.camel@mengyan1223.wang> User-Agent: Evolution 3.44.0 MIME-Version: 1.0 X-Spam-Status: No, score=-3038.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_NUMSUBJECT, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Xi Ruoyao via Gcc-patches From: Xi Ruoyao Reply-To: Xi Ruoyao Cc: Richard Sandiford , gcc-patches@gcc.gnu.org, Jakub Jelinek , YunQiang Su Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" v2: Add psABI warning and test. --- This fixes tmpdir-g++.dg-struct-layout-1/{t032,t059} failure. Clang++ also ignores C++17 empty bases in return values. gcc/ * config/mips/mips.cc (mips_fpr_return_fields): Ignore cxx17_empty_base_field_p fields and set an indicator. (mips_return_in_msb): Adjust for mips_fpr_return_fields change. (mips_function_value_1): Inform psABI change about C++ 17 empty bases. gcc/testsuite/ * g++.target/mips/cxx17_empty_base.C: New test. --- gcc/config/mips/mips.cc | 58 +++++++++++++++++-- .../g++.target/mips/cxx17_empty_base.C | 20 +++++++ 2 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.target/mips/cxx17_empty_base.C diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc index 079bb03968a..57ce0884951 100644 --- a/gcc/config/mips/mips.cc +++ b/gcc/config/mips/mips.cc @@ -6346,12 +6346,21 @@ mips_callee_copies (cumulative_args_t, const function_arg_info &arg) The C++ FE used to remove zero-width bit-fields in GCC 11 and earlier. To make a proper diagnostic, this function will set HAS_CXX_ZERO_WIDTH_BF to true once a C++ zero-width bit-field shows up, - and then ignore it. Then the caller can determine if this zero-width - bit-field will make a difference and emit a -Wpsabi inform. */ + and then ignore it. + + We had failed to ignore C++ 17 empty bases in GCC 7, 8, 9, 10, and 11. + This caused an ABI incompatibility between C++ 14 and C++ 17. This is + fixed now and to make a proper diagnostic, this function will set + HAS_CXX17_EMPTY_BASE to true once a C++ 17 empty base shows up, and + then ignore it. + + The caller should use the value of HAS_CXX17_EMPTY_BASE and/or + HAS_CXX_ZERO_WIDTH_BF to emit a proper -Wpsabi inform. */ static int mips_fpr_return_fields (const_tree valtype, tree *fields, - bool *has_cxx_zero_width_bf) + bool *has_cxx_zero_width_bf, + bool *has_cxx17_empty_base) { tree field; int i; @@ -6368,6 +6377,12 @@ mips_fpr_return_fields (const_tree valtype, tree *fields, if (TREE_CODE (field) != FIELD_DECL) continue; + if (cxx17_empty_base_field_p (field)) + { + *has_cxx17_empty_base = true; + continue; + } + if (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (field)) { *has_cxx_zero_width_bf = true; @@ -6403,8 +6418,13 @@ mips_return_in_msb (const_tree valtype) tree fields[2]; bool has_cxx_zero_width_bf = false; + + /* Its value is not used. */ + bool has_cxx17_empty_base = false; + return (mips_fpr_return_fields (valtype, fields, - &has_cxx_zero_width_bf) == 0 + &has_cxx_zero_width_bf, + &has_cxx17_empty_base) == 0 || has_cxx_zero_width_bf); } @@ -6501,11 +6521,18 @@ mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type, mode = promote_function_mode (valtype, mode, &unsigned_p, func, 1); bool has_cxx_zero_width_bf = false; + bool has_cxx17_empty_base = false; int use_fpr = mips_fpr_return_fields (valtype, fields, - &has_cxx_zero_width_bf); + &has_cxx_zero_width_bf, + &has_cxx17_empty_base); + + /* If has_cxx_zero_width_bf and has_cxx17_empty_base are both + true, it *happens* that there is no ABI change. So we won't + inform in this case. */ if (TARGET_HARD_FLOAT && warn_psabi && has_cxx_zero_width_bf + && !has_cxx17_empty_base && use_fpr != 0) { static unsigned last_reported_type_uid; @@ -6527,6 +6554,27 @@ mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type, if (has_cxx_zero_width_bf) use_fpr = 0; + if (TARGET_HARD_FLOAT + && warn_psabi + && use_fpr != 0 + && has_cxx17_empty_base) + { + static unsigned last_reported_type_uid; + unsigned uid = TYPE_UID (TYPE_MAIN_VARIANT (valtype)); + if (uid != last_reported_type_uid) + { + static const char *url + = CHANGES_ROOT_URL + "gcc-12/changes.html#mips_cxx17_empty_bases"; + inform (input_location, + "the ABI for returning a value with C++ 17 empty " + "bases but otherwise an aggregate with only one or " + "two floating-point fields was changed in GCC " + "%{12.1%}", url); + last_reported_type_uid = uid; + } + } + /* Handle structures whose fields are returned in $f0/$f2. */ switch (use_fpr) { diff --git a/gcc/testsuite/g++.target/mips/cxx17_empty_base.C b/gcc/testsuite/g++.target/mips/cxx17_empty_base.C new file mode 100644 index 00000000000..da6d54b95d9 --- /dev/null +++ b/gcc/testsuite/g++.target/mips/cxx17_empty_base.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// { dg-options "-O2 -std=c++17 -mabi=64 -mhard-float" } +// { dg-final { scan-assembler "\\\$f0" } } + +struct empty {}; + +struct foo : empty +{ + double a; + double b; +}; + +struct foo +make_foo(void) // { dg-message "the ABI for returning a value with C\\\+\\\+ 17 empty bases but otherwise an aggregate with only one or two floating-point fields was changed in GCC 12.1" } +{ + struct foo ret; + ret.a = 114; + ret.b = 514; + return ret; +}