> On Thu, 20 Mar 2025, Jason Merrill wrote:
> 
> > Tested x86_64-pc-linux-gnu.  OK for trunk and backports?
> > 
> > -- 8< --
> > 
> > Since the mangling of the second lambda changed (previously we counted all
> > lambdas, now we only count lambdas with the same signature), we
> > generate_mangling_alias for handler<lambda2> for backward compatibility.
> > Since handler is COMDAT, resolve_alias puts the alias in the same comdat
> > group as handler itself.  Then create_dispatcher_calls tries to add the
> > alias to the same comdat group as the dispatcher, but it's already in a
> > same_comdat_group, so we ICE.
> > 
> > It seems like we're just missing a remove_from_same_comdat_group before
> > add_to_same_comdat_group.
> 
> LGTM, let's see if Honza has any comments.
This is OK, thanks!
And thanks for the explanation - I would definitely need a white to
understnad why someone would ever want to change same codat group of a
symbol for sane reasons...

Honza
> 
> Richard.
> 
> >     PR c++/114992
> > 
> > gcc/ChangeLog:
> > 
> >     * multiple_target.cc (create_dispatcher_calls):
> >     remove_from_same_comdat_group before add_to_same_comdat_group.
> > 
> > gcc/testsuite/ChangeLog:
> > 
> >     * g++.target/i386/mangling-alias1.C: New test.
> > ---
> >  gcc/multiple_target.cc                          |  6 +++++-
> >  gcc/testsuite/g++.target/i386/mangling-alias1.C | 16 ++++++++++++++++
> >  2 files changed, 21 insertions(+), 1 deletion(-)
> >  create mode 100644 gcc/testsuite/g++.target/i386/mangling-alias1.C
> > 
> > diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc
> > index d8becf4d9a9..d25277c0a93 100644
> > --- a/gcc/multiple_target.cc
> > +++ b/gcc/multiple_target.cc
> > @@ -155,7 +155,11 @@ create_dispatcher_calls (struct cgraph_node *node)
> >           symtab_node *source = ref->referring;
> >           source->create_reference (inode, IPA_REF_ALIAS);
> >           if (inode->get_comdat_group ())
> > -           source->add_to_same_comdat_group (inode);
> > +           {
> > +             if (source->same_comdat_group)
> > +               source->remove_from_same_comdat_group ();
> > +             source->add_to_same_comdat_group (inode);
> > +           }
> >         }
> >       else
> >         gcc_unreachable ();
> > diff --git a/gcc/testsuite/g++.target/i386/mangling-alias1.C 
> > b/gcc/testsuite/g++.target/i386/mangling-alias1.C
> > new file mode 100644
> > index 00000000000..70264e2b64e
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.target/i386/mangling-alias1.C
> > @@ -0,0 +1,16 @@
> > +// PR c++/114992
> > +// { dg-do compile { target { c++11 && x86_64-*-* } } }
> > +// { dg-require-ifunc }
> > +
> > +template <typename Callable>
> > +__attribute__((target_clones("avx2", "default")))
> > +void handler(Callable) {}
> > +
> > +inline int func()
> > +{
> > +  auto l1 = [](int) {}; // different lambda signature
> > +  handler([]() {}); // so this one needs a mangling alias
> > +  return 42;
> > +}
> > +
> > +int g = func();
> > 
> > base-commit: 56145ae79b89b823f306c2c241f6a1fe5d604816
> > 
> 
> -- 
> Richard Biener <rguent...@suse.de>
> SUSE Software Solutions Germany GmbH,
> Frankenstrasse 146, 90461 Nuernberg, Germany;
> GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to