From dc6d15eaa23cbae1468a6ef92371b1c856c14819 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 10 Dec 2019 19:41:08 +0100 Subject: [PATCH] Add gcc_assert that &global_options are not dirty modified. gcc/ChangeLog: 2020-03-20 Martin Liska 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 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. --- gcc/c-family/c-attribs.c | 12 ++++++++++++ gcc/c-family/c-pragma.c | 11 +++++++++++ gcc/optc-save-gen.awk | 25 +++++++++++++++++++++++++ gcc/opth-gen.awk | 3 +++ 4 files changed, 51 insertions(+) diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index 193c4cd7cd0..37214831538 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -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; diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c index 7c35741745b..e3169e68fb6 100644 --- a/gcc/c-family/c-pragma.c +++ b/gcc/c-family/c-pragma.c @@ -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; diff --git a/gcc/optc-save-gen.awk b/gcc/optc-save-gen.awk index 6033f519866..4a0e5ab64f3 100644 --- a/gcc/optc-save-gen.awk +++ b/gcc/optc-save-gen.awk @@ -945,5 +945,30 @@ for (i = 0; i < n_opt_val; i++) { print " free (const_cast (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 "}"; } diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk index 856a69168a5..472fd591413 100644 --- a/gcc/opth-gen.awk +++ b/gcc/opth-gen.awk @@ -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 "