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 <mli...@suse.cz> 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 <mli...@suse.cz> 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 00000000000..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 ();