From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id 7076E384B823; Thu, 1 Apr 2021 11:38:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7076E384B823 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r10-9651] c++, abi: Fix abi_tag attribute handling [PR98481] X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: 368875572b6b6be75d7cc162797d07e779194fb1 X-Git-Newrev: 892024d4af83b258801ff7484bf28f0cf1a1a999 Message-Id: <20210401113816.7076E384B823@sourceware.org> Date: Thu, 1 Apr 2021 11:38:16 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Apr 2021 11:38:16 -0000 https://gcc.gnu.org/g:892024d4af83b258801ff7484bf28f0cf1a1a999 commit r10-9651-g892024d4af83b258801ff7484bf28f0cf1a1a999 Author: Jakub Jelinek Date: Thu Apr 1 09:59:47 2021 +0200 c++, abi: Fix abi_tag attribute handling [PR98481] In GCC10 cp_walk_subtrees has been changed to walk template arguments. As the following testcase, that changed the mangling of some functions. I believe the previous behavior that find_abi_tags_r doesn't recurse into template args has been the correct one, but setting *walk_subtrees = 0 for the types and handling the types subtree walking manually in find_abi_tags_r looks too hard, there are a lot of subtrees and details what should and shouldn't be walked, both in tree.c (walk_type_fields there, which is static) and in cp_walk_subtrees itself. The following patch abuses the fact that *walk_subtrees is an int to tell cp_walk_subtrees it shouldn't walk the template args. But we don't want to introduce an ABI change in the middle of the GCC 10 cycle, so the GCC 10 version of this patch introduces ABI v15 for the fix, which will be available but not default in GCC 10.3. Co-authored-by: Jason Merrill gcc/cp/ChangeLog: PR c++/98481 * class.c (find_abi_tags_r): Set *walk_subtrees to 2 instead of 1 for types. (mark_abi_tags_r): Likewise. * tree.c (cp_walk_subtrees): If *walk_subtrees_p is 2, look through typedefs. gcc/testsuite/ChangeLog: PR c++/98481 * g++.dg/abi/abi-tag24.C: New test. * g++.dg/abi/abi-tag24a.C: New test. * g++.dg/abi/macro0.C: Adjust expected value. gcc/ChangeLog: PR c++/98481 * common.opt (fabi-version): Default to 14. gcc/c-family/ChangeLog: PR c++/98481 * c-opts.c (c_common_post_options): Bump latest_abi_version. Diff: --- gcc/c-family/c-opts.c | 2 +- gcc/common.opt | 5 ++++- gcc/cp/class.c | 8 ++++++++ gcc/cp/tree.c | 14 ++++++++++++-- gcc/testsuite/g++.dg/abi/abi-tag24.C | 18 ++++++++++++++++++ gcc/testsuite/g++.dg/abi/abi-tag24a.C | 18 ++++++++++++++++++ gcc/testsuite/g++.dg/abi/macro0.C | 2 +- 7 files changed, 62 insertions(+), 5 deletions(-) diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index 58ba0948e79..c51d6d34726 100644 --- a/gcc/c-family/c-opts.c +++ b/gcc/c-family/c-opts.c @@ -943,7 +943,7 @@ c_common_post_options (const char **pfilename) /* Change flag_abi_version to be the actual current ABI level, for the benefit of c_cpp_builtins, and to make comparison simpler. */ - const int latest_abi_version = 14; + const int latest_abi_version = 15; /* Generate compatibility aliases for ABI v11 (7.1) by default. */ const int abi_compat_default = 11; diff --git a/gcc/common.opt b/gcc/common.opt index 9cc47b16cac..ec5235c3a41 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -956,10 +956,13 @@ Driver Undocumented ; 14: Corrects the mangling of nullptr expression. ; Default in G++ 10. ; +; 15: Corrects G++ 10 ABI tag regression [PR98481]. +; Available, but not default, in G++ 10.3. +; ; Additional positive integers will be assigned as new versions of ; the ABI become the default version of the ABI. fabi-version= -Common Joined RejectNegative UInteger Var(flag_abi_version) Init(0) +Common Joined RejectNegative UInteger Var(flag_abi_version) Init(14) The version of the C++ ABI in use. faggressive-loop-optimizations diff --git a/gcc/cp/class.c b/gcc/cp/class.c index ed8f9527929..c0101130ba3 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1450,6 +1450,10 @@ mark_or_check_tags (tree t, tree *tp, abi_tag_data *p, bool val) static tree find_abi_tags_r (tree *tp, int *walk_subtrees, void *data) { + if (TYPE_P (*tp) && *walk_subtrees == 1 && flag_abi_version != 14) + /* Tell cp_walk_subtrees to look though typedefs. [PR98481] */ + *walk_subtrees = 2; + if (!OVERLOAD_TYPE_P (*tp)) return NULL_TREE; @@ -1470,6 +1474,10 @@ find_abi_tags_r (tree *tp, int *walk_subtrees, void *data) static tree mark_abi_tags_r (tree *tp, int *walk_subtrees, void *data) { + if (TYPE_P (*tp) && *walk_subtrees == 1 && flag_abi_version != 14) + /* Tell cp_walk_subtrees to look though typedefs. */ + *walk_subtrees = 2; + if (!OVERLOAD_TYPE_P (*tp)) return NULL_TREE; diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index b36ca4eddc0..10b818d1370 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -5055,8 +5055,18 @@ cp_walk_subtrees (tree *tp, int *walk_subtrees_p, walk_tree_fn func, while (0) if (TYPE_P (*tp)) - /* Walk into template args without looking through typedefs. */ - if (tree ti = TYPE_TEMPLATE_INFO_MAYBE_ALIAS (*tp)) + /* If *WALK_SUBTREES_P is 1, we're interested in the syntactic form of + the argument, so don't look through typedefs, but do walk into + template arguments for alias templates (and non-typedefed classes). + + If *WALK_SUBTREES_P > 1, we're interested in type identity or + equivalence, so look through typedefs, ignoring template arguments for + alias templates, and walk into template args of classes. + + See find_abi_tags_r for an example of setting *WALK_SUBTREES_P to 2 + when that's the behavior the walk_tree_fn wants. */ + if (tree ti = (*walk_subtrees_p > 1 ? TYPE_TEMPLATE_INFO (*tp) + : TYPE_TEMPLATE_INFO_MAYBE_ALIAS (*tp))) WALK_SUBTREE (TI_ARGS (ti)); /* Not one of the easy cases. We must explicitly go through the diff --git a/gcc/testsuite/g++.dg/abi/abi-tag24.C b/gcc/testsuite/g++.dg/abi/abi-tag24.C new file mode 100644 index 00000000000..2c5c542bfcd --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/abi-tag24.C @@ -0,0 +1,18 @@ +// PR c++/98481 +// { dg-do compile { target c++11 } } +// { dg-additional-options -fabi-version=0 } +inline namespace N __attribute ((__abi_tag__ ("myabi"))) +{ + struct A {}; +} +template +struct B { typedef int size_type; }; +struct S1 { B::size_type foo () const { return 1; } }; +struct S2 { B::size_type foo () const; }; +int S2::foo () const { return 2; } +int (S1::*f1) () const = &S1::foo; +int (S2::*f2) () const = &S2::foo; + +// { dg-final { scan-assembler "_ZNK2S13fooEv" } } +// { dg-final { scan-assembler "_ZNK2S23fooEv" } } +// { dg-final { scan-assembler-not "_ZNK2S13fooB5myabiEv" } } diff --git a/gcc/testsuite/g++.dg/abi/abi-tag24a.C b/gcc/testsuite/g++.dg/abi/abi-tag24a.C new file mode 100644 index 00000000000..83f930dfdde --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/abi-tag24a.C @@ -0,0 +1,18 @@ +// PR c++/98481 +// { dg-do compile { target c++11 } } +// { dg-additional-options -fabi-version=14 } +inline namespace N __attribute ((__abi_tag__ ("myabi"))) +{ + struct A {}; +} +template +struct B { typedef int size_type; }; +struct S1 { B::size_type foo () const { return 1; } }; +struct S2 { B::size_type foo () const; }; +int S2::foo () const { return 2; } +int (S1::*f1) () const = &S1::foo; +int (S2::*f2) () const = &S2::foo; + +// { dg-final { scan-assembler-not "_ZNK2S13fooEv" } } +// { dg-final { scan-assembler "_ZNK2S23fooEv" } } +// { dg-final { scan-assembler "_ZNK2S13fooB5myabiEv" } } diff --git a/gcc/testsuite/g++.dg/abi/macro0.C b/gcc/testsuite/g++.dg/abi/macro0.C index 08106004c4d..7c3c17051ed 100644 --- a/gcc/testsuite/g++.dg/abi/macro0.C +++ b/gcc/testsuite/g++.dg/abi/macro0.C @@ -1,6 +1,6 @@ // This testcase will need to be kept in sync with c_common_post_options. // { dg-options "-fabi-version=0" } -#if __GXX_ABI_VERSION != 1014 +#if __GXX_ABI_VERSION != 1015 #error "Incorrect value of __GXX_ABI_VERSION" #endif