Hi.
When calling delete_function_version, we should also clear
version_info_node once it can be seen GGC collect.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
Ready to be installed?
Thanks,
Martin
gcc/ChangeLog:
2019-11-05 Martin Liska
PR c++/92354
* cgraph.c (delete_function_version): Clear global
variable version_info_node if equal to deleted
function.
gcc/testsuite/ChangeLog:
2019-11-05 Martin Liska
PR c++/92354
* g++.target/i386/pr92354.C: New test.
---
gcc/cgraph.c| 3 +++
gcc/testsuite/g++.target/i386/pr92354.C | 8
2 files changed, 11 insertions(+)
create mode 100644 gcc/testsuite/g++.target/i386/pr92354.C
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 699209654f8..896a3fcf275 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -197,6 +197,9 @@ delete_function_version (cgraph_function_version_info *decl_v)
if (decl_v == NULL)
return;
+ if (version_info_node == decl_v)
+version_info_node = NULL;
+
if (decl_v->prev != NULL)
decl_v->prev->next = decl_v->next;
diff --git a/gcc/testsuite/g++.target/i386/pr92354.C b/gcc/testsuite/g++.target/i386/pr92354.C
new file mode 100644
index 000..0f48fb72899
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr92354.C
@@ -0,0 +1,8 @@
+/* PR c++/92354 */
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "--param ggc-min-heapsize=0" } */
+
+__attribute__ ((target ("default"))) void f ();
+__attribute__ ((target ("sse"))) void f ();
+__attribute__ ((target ("default"))) void f ();