@@ -1,3 +1,14 @@
+2014-05-08 David Malcolm <dmalcolm@redhat.com>
+
+ * params.c (global_init_params): Require that params_finished be
+ false, rather than being idempotent, in favor of purging all state
+ between toplev invocations, since in a release build
+ init_ggc_heuristics calls set_param_value_internal, and the
+ latter assumes that params_finished is true.
+ (params_c_finalize): New.
+ * params.h (params_c_finalize): New.
+ * toplev.c (toplev::finalize): Call params_c_finalize.
+
2014-03-24 Tom Tromey <tromey@redhat.com>
* toplev.c (general_init): Initialize input_location.
@@ -69,9 +69,8 @@ add_params (const param_info params[], size_t n)
void
global_init_params (void)
{
- /* Make param initialization be idempotent. */
- if (params_finished)
- return;
+ gcc_assert (!params_finished);
+
add_params (lang_independent_params, LAST_PARAM);
targetm_common.option_default_params ();
}
@@ -85,6 +84,17 @@ finish_params (void)
params_finished = true;
}
+/* Reset all state in params.c. */
+
+void
+params_c_finalize (void)
+{
+ XDELETEVEC (compiler_params);
+ compiler_params = NULL;
+ num_compiler_params = 0;
+ params_finished = false;
+}
+
/* Set the value of the parameter given by NUM to VALUE in PARAMS and
PARAMS_SET. If EXPLICIT_P, this is being set by the user;
otherwise it is being set implicitly by the compiler. */
@@ -113,6 +113,10 @@ extern void global_init_params (void);
set. */
extern void finish_params (void);
+/* Reset all state in params.c */
+
+extern void params_c_finalize (void);
+
/* Return the default value of parameter NUM. */
extern int default_param_value (compiler_param num);
@@ -2015,6 +2015,7 @@ toplev::finalize (void)
gcse_c_finalize ();
ipa_c_finalize ();
ipa_reference_c_finalize ();
+ params_c_finalize ();
predict_c_finalize ();
symtab_c_finalize ();
varpool_c_finalize ();