aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2025-03-20 12:57:15 -0400
committerJason Merrill <jason@redhat.com>2025-03-21 12:45:00 -0400
commitab716829da7c885b97ac2649c7c0ff5c7703ffa5 (patch)
treed0f4781ba0443ad7fad309a8c8a3f7b0d81b5ccf
parent94fa9f4d27bac577ecab43379a31fa28b146d6d9 (diff)
downloadgcc-ab716829da7c885b97ac2649c7c0ff5c7703ffa5.zip
gcc-ab716829da7c885b97ac2649c7c0ff5c7703ffa5.tar.gz
gcc-ab716829da7c885b97ac2649c7c0ff5c7703ffa5.tar.bz2
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.
-rw-r--r--gcc/multiple_target.cc6
-rw-r--r--gcc/testsuite/g++.target/i386/mangling-alias1.C16
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc
index d8becf4..d25277c 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 0000000..70264e2
--- /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();