[gcc r14-7117] libgccjit: Fix GGC segfault when using -flto

David Malcolm dmalcolm@gcc.gnu.org
Wed Jan 10 22:18:57 GMT 2024


https://gcc.gnu.org/g:8415bceea9d3ca86adc00ae8ad92deaec0457dd1

commit r14-7117-g8415bceea9d3ca86adc00ae8ad92deaec0457dd1
Author: Antoni Boucher <bouanto@zoho.com>
Date:   Wed Jan 10 17:13:20 2024 -0500

    libgccjit: Fix GGC segfault when using -flto
    
    gcc/ChangeLog:
            PR jit/111396
            * ipa-fnsummary.cc (ipa_fnsummary_cc_finalize): Call
            ipa_free_size_summary.
            * ipa-icf.cc (ipa_icf_cc_finalize): New function.
            * ipa-profile.cc (ipa_profile_cc_finalize): New function.
            * ipa-prop.cc (ipa_prop_cc_finalize): New function.
            * ipa-prop.h (ipa_prop_cc_finalize): New function.
            * ipa-sra.cc (ipa_sra_cc_finalize): New function.
            * ipa-utils.h (ipa_profile_cc_finalize, ipa_icf_cc_finalize,
            ipa_sra_cc_finalize): New functions.
            * toplev.cc (toplev::finalize): Call ipa_icf_cc_finalize,
            ipa_prop_cc_finalize, ipa_profile_cc_finalize and
            ipa_sra_cc_finalize
            Include ipa-utils.h.
    
    gcc/testsuite/ChangeLog:
            PR jit/111396
            * jit.dg/all-non-failing-tests.h: Add note about test-ggc-bugfix.
            * jit.dg/test-ggc-bugfix.c: New test.

Diff:
---
 gcc/ipa-fnsummary.cc                         |  1 +
 gcc/ipa-icf.cc                               |  9 ++++++++
 gcc/ipa-profile.cc                           | 10 ++++++++
 gcc/ipa-prop.cc                              | 18 +++++++++++++++
 gcc/ipa-prop.h                               |  2 ++
 gcc/ipa-sra.cc                               | 12 ++++++++++
 gcc/ipa-utils.h                              |  7 ++++++
 gcc/testsuite/jit.dg/all-non-failing-tests.h |  4 ++++
 gcc/testsuite/jit.dg/test-ggc-bugfix.c       | 34 ++++++++++++++++++++++++++++
 gcc/toplev.cc                                |  5 ++++
 10 files changed, 102 insertions(+)

diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc
index ba1a2d819e8..74c9b4e1d1e 100644
--- a/gcc/ipa-fnsummary.cc
+++ b/gcc/ipa-fnsummary.cc
@@ -5090,4 +5090,5 @@ void
 ipa_fnsummary_cc_finalize (void)
 {
   ipa_free_fn_summary ();
+  ipa_free_size_summary ();
 }
diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc
index 3d62d7b6791..29ed1f1e4c1 100644
--- a/gcc/ipa-icf.cc
+++ b/gcc/ipa-icf.cc
@@ -3663,3 +3663,12 @@ make_pass_ipa_icf (gcc::context *ctxt)
 {
   return new ipa_icf::pass_ipa_icf (ctxt);
 }
+
+/* Reset all state within ipa-icf.cc so that we can rerun the compiler
+   within the same process.  For use by toplev::finalize.  */
+
+void
+ipa_icf_cc_finalize (void)
+{
+  ipa_icf::optimizer = NULL;
+}
diff --git a/gcc/ipa-profile.cc b/gcc/ipa-profile.cc
index 8880e86d189..5e89f677c3e 100644
--- a/gcc/ipa-profile.cc
+++ b/gcc/ipa-profile.cc
@@ -1065,3 +1065,13 @@ make_pass_ipa_profile (gcc::context *ctxt)
 {
   return new pass_ipa_profile (ctxt);
 }
+
+/* Reset all state within ipa-profile.cc so that we can rerun the compiler
+   within the same process.  For use by toplev::finalize.  */
+
+void
+ipa_profile_cc_finalize (void)
+{
+  delete call_sums;
+  call_sums = NULL;
+}
diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index 12a2cab9f51..bec0ebd210c 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -5988,5 +5988,23 @@ ipa_return_value_range (Value_Range &range, tree decl)
   return true;
 }
 
+/* Reset all state within ipa-prop.cc so that we can rerun the compiler
+   within the same process.  For use by toplev::finalize.  */
+
+void
+ipa_prop_cc_finalize (void)
+{
+  if (function_insertion_hook_holder)
+    symtab->remove_cgraph_insertion_hook (function_insertion_hook_holder);
+  function_insertion_hook_holder = NULL;
+
+  if (ipa_edge_args_sum)
+    ggc_delete (ipa_edge_args_sum);
+  ipa_edge_args_sum = NULL;
+
+  if (ipa_node_params_sum)
+    ggc_delete (ipa_node_params_sum);
+  ipa_node_params_sum = NULL;
+}
 
 #include "gt-ipa-prop.h"
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 3daf5ceeca7..9c78dc9f486 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -1255,6 +1255,8 @@ tree ipcp_get_aggregate_const (struct function *func, tree parm, bool by_ref,
 bool unadjusted_ptr_and_unit_offset (tree op, tree *ret,
 				     poly_int64 *offset_ret);
 
+void ipa_prop_cc_finalize (void);
+
 /* From tree-sra.cc:  */
 tree build_ref_for_offset (location_t, tree, poly_int64, bool, tree,
 			   gimple_stmt_iterator *, bool);
diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc
index 2fdc305c89c..14c2a344e6d 100644
--- a/gcc/ipa-sra.cc
+++ b/gcc/ipa-sra.cc
@@ -4707,5 +4707,17 @@ make_pass_ipa_sra (gcc::context *ctxt)
   return new pass_ipa_sra (ctxt);
 }
 
+/* Reset all state within ipa-sra.cc so that we can rerun the compiler
+   within the same process.  For use by toplev::finalize.  */
+
+void
+ipa_sra_cc_finalize (void)
+{
+  if (func_sums)
+    ggc_delete (func_sums);
+  func_sums = NULL;
+  delete call_sums;
+  call_sums = NULL;
+}
 
 #include "gt-ipa-sra.h"
diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h
index 0282de4582a..d1da9c31e09 100644
--- a/gcc/ipa-utils.h
+++ b/gcc/ipa-utils.h
@@ -57,6 +57,13 @@ bool ipa_make_function_pure (cgraph_node *, bool, bool);
 
 /* In ipa-profile.cc  */
 bool ipa_propagate_frequency (struct cgraph_node *node);
+void ipa_profile_cc_finalize (void);
+
+/* In ipa-icf.cc  */
+void ipa_icf_cc_finalize (void);
+
+/* In ipa-sra.cc  */
+void ipa_sra_cc_finalize (void);
 
 /* In ipa-devirt.cc  */
 
diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h b/gcc/testsuite/jit.dg/all-non-failing-tests.h
index e762563f9bd..73ecd0329a0 100644
--- a/gcc/testsuite/jit.dg/all-non-failing-tests.h
+++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h
@@ -377,6 +377,10 @@
 #undef create_code
 #undef verify_code
 
+/* test-ggc-bugfix.c: We don't use this once, since the use of
+   gcc_jit_context_add_command_line_option and
+   gcc_jit_context_add_driver_option affects the whole context.  */
+
 /* Now expose the individual testcases as instances of this struct.  */
 
 struct testcase
diff --git a/gcc/testsuite/jit.dg/test-ggc-bugfix.c b/gcc/testsuite/jit.dg/test-ggc-bugfix.c
new file mode 100644
index 00000000000..59eb374af8b
--- /dev/null
+++ b/gcc/testsuite/jit.dg/test-ggc-bugfix.c
@@ -0,0 +1,34 @@
+/* { dg-do compile { target x86_64-*-* } } */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "libgccjit.h"
+
+#include "harness.h"
+
+void
+create_code (gcc_jit_context *ctxt, void *user_data)
+{
+  gcc_jit_context_add_command_line_option (ctxt, "-flto");
+  gcc_jit_context_add_driver_option (ctxt, "-nostdlib");
+
+  gcc_jit_type *type_int = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
+  gcc_jit_param *params_for_func_main[0] = {
+  };
+  gcc_jit_function *func_main =
+    gcc_jit_context_new_function (ctxt, NULL, GCC_JIT_FUNCTION_EXPORTED,
+                                  type_int, "main", 0, params_for_func_main,
+                                  0);
+  gcc_jit_block *block_start =
+    gcc_jit_function_new_block (func_main, "start");
+  gcc_jit_rvalue *rvalue__int_42 =
+    gcc_jit_context_new_rvalue_from_int (ctxt, type_int, 42);
+  gcc_jit_block_end_with_return (block_start, NULL, rvalue__int_42);
+}
+
+void
+verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
+{
+  CHECK_NON_NULL (result);
+}
diff --git a/gcc/toplev.cc b/gcc/toplev.cc
index 0c2994e85a3..55636ff6e80 100644
--- a/gcc/toplev.cc
+++ b/gcc/toplev.cc
@@ -75,6 +75,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "symbol-summary.h"
 #include "tree-vrp.h"
 #include "ipa-prop.h"
+#include "ipa-utils.h"
 #include "gcse.h"
 #include "omp-offload.h"
 #include "edit-context.h"
@@ -2359,7 +2360,11 @@ toplev::finalize (void)
   ipa_fnsummary_cc_finalize ();
   ipa_modref_cc_finalize ();
   ipa_edge_modifications_finalize ();
+  ipa_icf_cc_finalize ();
 
+  ipa_prop_cc_finalize ();
+  ipa_profile_cc_finalize ();
+  ipa_sra_cc_finalize ();
   cgraph_cc_finalize ();
   cgraphunit_cc_finalize ();
   symtab_thunks_cc_finalize ();


More information about the Gcc-cvs mailing list