On Mon, 17 Nov 2025 at 16:03 -0800, Yuxuan Chen wrote:
Implement the trivial_abi attribute for GCC to fix ABI compatibility issues with Clang. Currently, GCC silently ignores this attribute, causing call convention mismatches when linking GCC-compiled code with Clang-compiled object files that use trivial_abi types.This attribute allows types to be treated as trivial for ABI purposes, enabling pass in registers instead of invisible references. PR c++/107187 V3 changes from v2: - Handling cases where bases can be dependent. - gcc/testsuite/g++.dg/cpp0x/attr-trivial_abi_syntax.C now uses the same test as Clang to ensure no difference in semantics. V2 changes from v1: - Addressing code review comments. - Registered cleanup in callee for trivial abi. Added test `gcc/testsuite/g++.dg/abi/invisiref3a.C` - Added doc in `gcc/doc/extend.texi`. Pretty much the same as in Clang's attributes documentation.
From 1ed8f7b49c1f676a4f8b1b331ff7eac140ebaa4b Mon Sep 17 00:00:00 2001 From: Yuxuan Chen <[email protected]> Date: Tue, 7 Oct 2025 14:17:35 -0700 Subject: [PATCH] c++: Add support for [[gnu::trivial_abi]] attribute [PR107187] Changes from v2: - Handling cases where bases can be dependent. - gcc/testsuite/g++.dg/cpp0x/attr-trivial_abi_syntax.C now uses the same test as Clang to ensure no difference in semantics. Changes from v1: - Addressing code review comments. - Registered cleanup in callee for trivial abi. Added test `gcc/testsuite/g++.dg/abi/invisiref3a.C` - Added doc in `gcc/doc/extend.texi`. Pretty much the same as in Clang's attributes documentation. Implement the trivial_abi attribute for GCC to fix ABI compatibility issues with Clang. Currently, GCC silently ignores this attribute, causing call convention mismatches when linking GCC-compiled code with Clang-compiled object files that use trivial_abi types. This attribute allows types to be treated as trivial for ABI purposes, enabling pass in registers instead of invisible references. PR c++/107187 gcc/cp/ChangeLog: * cp-tree.h (struct lang_type): Add has_trivial_abi flag. * tree.cc (trivially_relocatable_type_p): Check for trivial_abi attribute. (handle_trivial_abi_attribute): Implement attribute validation. (cxx_gnu_attributes): Add trivial_abi entry. * class.cc (finish_struct_bits): Respect trivial_for_calls_p. * decl.cc (store_parm_decls): Register cleanups for trivial_abi parameters. * pt.cc (instantiate_class_template): Propagate CLASSTYPE_HAS_TRIVIAL_ABI in template instantiation. * module.cc (trees_out::lang_type_bools, trees_in::lang_type_bools): Serialize has_trivial_abi. Signed-off-by: Yuxuan Chen <[email protected]> --- gcc/cp/ChangeLog | 16 ++ gcc/cp/class.cc | 25 ++- gcc/cp/cp-tree.h | 12 +- gcc/cp/decl.cc | 17 ++ gcc/cp/module.cc | 2 + gcc/cp/pt.cc | 1 + gcc/cp/tree.cc | 143 +++++++++++++++- gcc/doc/extend.texi | 69 ++++++++ gcc/testsuite/g++.dg/abi/invisiref3.C | 28 +++ gcc/testsuite/g++.dg/abi/invisiref3a.C | 26 +++ .../g++.dg/cpp0x/attr-trivial_abi1.C | 48 ++++++ .../g++.dg/cpp0x/attr-trivial_abi2.C | 70 ++++++++ .../g++.dg/cpp0x/attr-trivial_abi3.C | 61 +++++++ .../g++.dg/cpp0x/attr-trivial_abi4.C | 75 ++++++++ .../g++.dg/cpp0x/attr-trivial_abi5.C | 83 +++++++++ .../g++.dg/cpp0x/attr-trivial_abi_syntax.C | 161 ++++++++++++++++++ 16 files changed, 826 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/g++.dg/abi/invisiref3.C create mode 100644 gcc/testsuite/g++.dg/abi/invisiref3a.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/attr-trivial_abi1.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/attr-trivial_abi2.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/attr-trivial_abi3.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/attr-trivial_abi4.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/attr-trivial_abi5.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/attr-trivial_abi_syntax.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 95b471d4984..e18c0812f56 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,19 @@ +2025-11-05 Yuxuan Chen <[email protected]> + + PR c++/107187 + * cp-tree.h (struct lang_type): Add has_trivial_abi flag. + * tree.cc (trivially_relocatable_type_p): Check for + trivial_abi attribute. + (handle_trivial_abi_attribute): Implement attribute validation. + (cxx_gnu_attributes): Add trivial_abi entry. + * class.cc (finish_struct_bits): Respect trivial_for_calls_p. + * decl.cc (store_parm_decls): Register cleanups for trivial_abi + parameters. + * pt.cc (instantiate_class_template): Propagate + CLASSTYPE_HAS_TRIVIAL_ABI in template instantiation. + * module.cc (trees_out::lang_type_bools, trees_in::lang_type_bools): + Serialize has_trivial_abi. +
Please do not edit ChangeLog files, they are automatically generated from the Git commit history. If you edit the file by hand and include that in your patch, it makes it impossible to automatically apply the patch using 'git am' or 'b4 shazam', because the context doesn't match. You already included the ChangeLog entry in your git commit message, which is the correct thing to do. If the patch gets pushed to git then that ChangeLog entry will be copied from the commit log into the actual ChangeLog file.
