ipa: target clone and mangling alias [PR114992]

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.

	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.
This commit is contained in:
Jason Merrill 2025-03-20 12:57:15 -04:00
parent 94fa9f4d27
commit ab716829da
2 changed files with 21 additions and 1 deletions

View file

@ -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 ();

View file

@ -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();