Add gcc_assert that &global_options are not dirty modified.
gcc/ChangeLog: 2020-03-20 Martin Liska <mliska@suse.cz> PR tree-optimization/92860 * optc-save-gen.awk: Generate new function cl_optimization_compare. * opth-gen.awk: Generate declaration of the function. gcc/c-family/ChangeLog: 2020-03-20 Martin Liska <mliska@suse.cz> PR tree-optimization/92860 * c-attribs.c (handle_optimize_attribute): Save global options and compare it after parsing of function attribute. * c-pragma.c (opt_stack::saved_global_options): New field. (handle_pragma_push_options): Save global_options. (handle_pragma_pop_options): Compare them after pop.
This commit is contained in:
parent
771e60dd07
commit
dc6d15eaa2
@ -4452,6 +4452,13 @@ handle_optimize_attribute (tree *node, tree name, tree args,
|
||||
|
||||
/* If we previously had some optimization options, use them as the
|
||||
default. */
|
||||
gcc_options *saved_global_options = NULL;
|
||||
if (flag_checking)
|
||||
{
|
||||
saved_global_options = XNEW (gcc_options);
|
||||
*saved_global_options = global_options;
|
||||
}
|
||||
|
||||
if (old_opts)
|
||||
cl_optimization_restore (&global_options,
|
||||
TREE_OPTIMIZATION (old_opts));
|
||||
@ -4463,6 +4470,11 @@ handle_optimize_attribute (tree *node, tree name, tree args,
|
||||
|
||||
/* Restore current options. */
|
||||
cl_optimization_restore (&global_options, &cur_opts);
|
||||
if (saved_global_options != NULL)
|
||||
{
|
||||
cl_optimization_compare (saved_global_options, &global_options);
|
||||
free (saved_global_options);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL_TREE;
|
||||
|
@ -1003,6 +1003,7 @@ struct GTY(()) opt_stack {
|
||||
tree target_strings;
|
||||
tree optimize_binary;
|
||||
tree optimize_strings;
|
||||
gcc_options * GTY ((skip)) saved_global_options;
|
||||
};
|
||||
|
||||
static GTY(()) struct opt_stack * options_stack;
|
||||
@ -1028,6 +1029,11 @@ handle_pragma_push_options (cpp_reader *ARG_UNUSED(dummy))
|
||||
options_stack = p;
|
||||
|
||||
/* Save optimization and target flags in binary format. */
|
||||
if (flag_checking)
|
||||
{
|
||||
p->saved_global_options = XNEW (gcc_options);
|
||||
*p->saved_global_options = global_options;
|
||||
}
|
||||
p->optimize_binary = build_optimization_node (&global_options);
|
||||
p->target_binary = build_target_option_node (&global_options);
|
||||
|
||||
@ -1079,6 +1085,11 @@ handle_pragma_pop_options (cpp_reader *ARG_UNUSED(dummy))
|
||||
p->optimize_binary);
|
||||
optimization_current_node = p->optimize_binary;
|
||||
}
|
||||
if (flag_checking)
|
||||
{
|
||||
cl_optimization_compare (p->saved_global_options, &global_options);
|
||||
free (p->saved_global_options);
|
||||
}
|
||||
|
||||
current_target_pragma = p->target_strings;
|
||||
current_optimize_pragma = p->optimize_strings;
|
||||
|
@ -945,5 +945,30 @@ for (i = 0; i < n_opt_val; i++) {
|
||||
print " free (const_cast <char *>(ptr->" name"));";
|
||||
}
|
||||
}
|
||||
print "}";
|
||||
|
||||
print "void";
|
||||
print "cl_optimization_compare (gcc_options *ptr1, gcc_options *ptr2)"
|
||||
print "{"
|
||||
|
||||
# all these options are mentioned in PR92860
|
||||
checked_options["flag_merge_constants"]++
|
||||
checked_options["param_max_fields_for_field_sensitive"]++
|
||||
checked_options["flag_omit_frame_pointer"]++
|
||||
checked_options["unroll_only_small_loops"]++
|
||||
|
||||
for (i = 0; i < n_opts; i++) {
|
||||
name = var_name(flags[i]);
|
||||
if (name == "")
|
||||
continue;
|
||||
|
||||
if (name in checked_options)
|
||||
continue;
|
||||
checked_options[name]++
|
||||
|
||||
print " if (ptr1->x_" name " != ptr2->x_" name ")"
|
||||
print " internal_error (\"Error: global_options are modified in local context\\n\");";
|
||||
}
|
||||
|
||||
print "}";
|
||||
}
|
||||
|
@ -318,6 +318,9 @@ print "";
|
||||
print "/* Free heap memory used by optimization options. */";
|
||||
print "extern void cl_optimization_option_free (cl_optimization *ptr1);"
|
||||
print "";
|
||||
print "/* Compare and report difference for a part of cl_optimization options. */";
|
||||
print "extern void cl_optimization_compare (gcc_options *ptr1, gcc_options *ptr2);";
|
||||
print "";
|
||||
print "/* Generator files may not have access to location_t, and don't need these. */"
|
||||
print "#if defined(UNKNOWN_LOCATION)"
|
||||
print "bool "
|
||||
|
Loading…
Reference in New Issue
Block a user