aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAntoni Boucher <bouanto@zoho.com>2024-01-10 17:13:20 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2024-01-10 17:13:20 -0500
commit8415bceea9d3ca86adc00ae8ad92deaec0457dd1 (patch)
tree6845246df6fa2c070e1cc9a01725a929644c6e19 /gcc
parent52e809d5cf345ce01fc81be716a57f5b6d5b4545 (diff)
downloadgcc-8415bceea9d3ca86adc00ae8ad92deaec0457dd1.zip
gcc-8415bceea9d3ca86adc00ae8ad92deaec0457dd1.tar.gz
gcc-8415bceea9d3ca86adc00ae8ad92deaec0457dd1.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ipa-fnsummary.cc1
-rw-r--r--gcc/ipa-icf.cc9
-rw-r--r--gcc/ipa-profile.cc10
-rw-r--r--gcc/ipa-prop.cc18
-rw-r--r--gcc/ipa-prop.h2
-rw-r--r--gcc/ipa-sra.cc12
-rw-r--r--gcc/ipa-utils.h7
-rw-r--r--gcc/testsuite/jit.dg/all-non-failing-tests.h4
-rw-r--r--gcc/testsuite/jit.dg/test-ggc-bugfix.c34
-rw-r--r--gcc/toplev.cc5
10 files changed, 102 insertions, 0 deletions
diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc
index ba1a2d8..74c9b4e 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 3d62d7b..29ed1f1 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 8880e86..5e89f67 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 12a2cab..bec0ebd 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 3daf5ce..9c78dc9 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 2fdc305..14c2a34 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 0282de4..d1da9c3 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 e762563..73ecd03 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 0000000..59eb374
--- /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 0c2994e..55636ff 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 ();