On Thu, 14 Dec 2023, Jason Merrill wrote:

> On 12/14/23 16:08, Patrick Palka wrote:
> > On Thu, 14 Dec 2023, Jason Merrill wrote:
> > 
> > > On 12/14/23 14:17, Patrick Palka wrote:
> > > > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
> > > > trunk?  Do we want to condition this on abi_check (19)?
> > > 
> > > I think we do, sadly.
> > 
> > Sounds good, like so?  Bootstrap and regtest in progress.
> > 
> > -- >8 --
> > 
> > Subject: [PATCH] c++: abi_tag attribute on templates [PR109715]
> > 
> > As with other declaration attributes, we need to look through
> > TEMPLATE_DECL when looking up the abi_tag attribute.
> > 
> >     PR c++/109715
> > 
> > gcc/cp/ChangeLog:
> > 
> >     * mangle.cc (get_abi_tags): Look through TEMPLATE_DECL.
> > 
> > gcc/testsuite/ChangeLog:
> > 
> >     * g++.dg/abi/abi-tag25.C: New test.
> >     * g++.dg/abi/abi-tag25a.C: New test.
> > ---
> >   gcc/cp/mangle.cc                      |  6 ++++++
> >   gcc/testsuite/g++.dg/abi/abi-tag25.C  | 17 +++++++++++++++++
> >   gcc/testsuite/g++.dg/abi/abi-tag25a.C | 11 +++++++++++
> >   3 files changed, 34 insertions(+)
> >   create mode 100644 gcc/testsuite/g++.dg/abi/abi-tag25.C
> >   create mode 100644 gcc/testsuite/g++.dg/abi/abi-tag25a.C
> > 
> > diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
> > index 0684f0e6038..e3383df1836 100644
> > --- a/gcc/cp/mangle.cc
> > +++ b/gcc/cp/mangle.cc
> > @@ -530,6 +530,12 @@ get_abi_tags (tree t)
> >     if (DECL_P (t) && DECL_DECLARES_TYPE_P (t))
> >       t = TREE_TYPE (t);
> >   +  if (TREE_CODE (t) == TEMPLATE_DECL
> > +      && DECL_TEMPLATE_RESULT (t)
> > +      /* We used to ignore abi_tag on function and variable templates.  */
> > +      && abi_check (19))
> > +    t = DECL_TEMPLATE_RESULT (t);
> 
> Generally I try to call abi_check only when we know that there's something
> that will change the mangling, so here only if the template has ABI tags.  I
> suppose the only downside is a second mangling that produces the same name and
> gets ignored in mangle_decl so we don't need to be too strict about it, but it
> shouldn't be too hard to do that here?

D'oh, good point..  Otherwise IIUC we'd wastefully mangle most function
and variable templates (and perhaps their instantiations) twice when ABI
checks are enabled.

So like the following then?  Implemented using a recurse call but
we could easily implement it without recursion if anything.

-- >8 --

We need to look through TEMPLATE_DECL when looking up the abi_tag
attribute (as with other function and variable declaration attributes).

        PR c++/109715

gcc/cp/ChangeLog:

        * mangle.cc (get_abi_tags): Strip TEMPLATE_DECL before looking
        up the abi_tag attribute.

gcc/testsuite/ChangeLog:

        * g++.dg/abi/abi-tag25.C: New test.
        * g++.dg/abi/abi-tag25a.C: New test.
---
 gcc/cp/mangle.cc                      | 10 ++++++++++
 gcc/testsuite/g++.dg/abi/abi-tag25.C  | 17 +++++++++++++++++
 gcc/testsuite/g++.dg/abi/abi-tag25a.C | 11 +++++++++++
 3 files changed, 38 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/abi/abi-tag25.C
 create mode 100644 gcc/testsuite/g++.dg/abi/abi-tag25a.C

diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
index 0684f0e6038..365d470f46e 100644
--- a/gcc/cp/mangle.cc
+++ b/gcc/cp/mangle.cc
@@ -530,6 +530,16 @@ get_abi_tags (tree t)
   if (DECL_P (t) && DECL_DECLARES_TYPE_P (t))
     t = TREE_TYPE (t);
 
+  if (TREE_CODE (t) == TEMPLATE_DECL && DECL_TEMPLATE_RESULT (t))
+    {
+      tree tags = get_abi_tags (DECL_TEMPLATE_RESULT (t));
+      /* We used to overlook abi_tag on function and variable templates.  */
+      if (tags && abi_check (19))
+       return tags;
+      else
+       return NULL_TREE;
+    }
+
   tree attrs;
   if (TYPE_P (t))
     attrs = TYPE_ATTRIBUTES (t);
diff --git a/gcc/testsuite/g++.dg/abi/abi-tag25.C 
b/gcc/testsuite/g++.dg/abi/abi-tag25.C
new file mode 100644
index 00000000000..9847f0dccc8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/abi-tag25.C
@@ -0,0 +1,17 @@
+// PR c++/109715
+// { dg-do compile { target c++11 } }
+
+template<class T>
+[[gnu::abi_tag("foo")]] void fun() { }
+
+template void fun<int>();
+
+#if __cpp_variable_templates
+template<class T>
+[[gnu::abi_tag("foo")]] int var = 0;
+
+template int var<int>;
+#endif
+
+// { dg-final { scan-assembler "_Z3funB3fooIiEvv" } }
+// { dg-final { scan-assembler "_Z3varB3fooIiE" { target c++14 } } }
diff --git a/gcc/testsuite/g++.dg/abi/abi-tag25a.C 
b/gcc/testsuite/g++.dg/abi/abi-tag25a.C
new file mode 100644
index 00000000000..9499b5614cd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/abi-tag25a.C
@@ -0,0 +1,11 @@
+// PR c++/109715
+// { dg-do compile { target c++11 } }
+// { dg-additional-options "-fabi-version=18 -fabi-compat-version=18 -Wabi=0" }
+
+#include "abi-tag25.C"
+
+// { dg-warning "mangled name" "" { target *-*-* } 5 }
+// { dg-warning "mangled name" "" { target *-*-* } 11 }
+
+// { dg-final { scan-assembler "_Z3funIiEvv" } }
+// { dg-final { scan-assembler "_Z3varIiE" { target c++14 } } }
-- 
2.43.0.76.g1a87c842ec

Reply via email to