On 10/19/21 12:53, Richard Biener wrote:
Meh ... :/Well, move the target override hook call down (try to shuffle things so diagnostics happen after but "inits" happen before).
Not so easy. There are direct usages of the hooks (influences dwarf2out_as_loc_support and dwarf2out_as_locview_support) if (!OPTION_SET_P (dwarf2out_as_loc_support)) dwarf2out_as_loc_support = dwarf2out_default_as_loc_support (); if (!OPTION_SET_P (dwarf2out_as_locview_support)) dwarf2out_as_locview_support = dwarf2out_default_as_locview_support (); if (!OPTION_SET_P (debug_variable_location_views)) { debug_variable_location_views = (flag_var_tracking && debug_info_level >= DINFO_LEVEL_NORMAL && dwarf_debuginfo_p () && !dwarf_strict && dwarf2out_as_loc_support && dwarf2out_as_locview_support); } and then the warnings depend on debug_variable_location_views. I have another attempt which is about moving option detection of debug_nonbind_markers_p to finish_options. That works fine, except one needs to mark the option as PerFunction. That's because it depends on 'optimize' and that would trigger: 'global_options are modified in local context' verification error. What do you think about the patch? Cheers, Martin
From 1fbeeb6bb326c6e9e704be7a99b69014b1104fda Mon Sep 17 00:00:00 2001 From: Martin Liska <mli...@suse.cz> Date: Thu, 14 Oct 2021 14:57:18 +0200 Subject: [PATCH] options: Fix variable tracking option processing. PR debug/102585 PR bootstrap/102766 gcc/ChangeLog: * opts.c (finish_options): Process flag_var_tracking* options here as they can be adjusted by optimize attribute. * toplev.c (process_options): Remove it here. * common.opt: Make debug_nonbind_markers_p as PerFunction attribute as it depends on optimization level. gcc/testsuite/ChangeLog: * gcc.dg/pr102585.c: New test. --- gcc/common.opt | 2 +- gcc/opts.c | 26 ++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/pr102585.c | 6 ++++++ gcc/toplev.c | 28 +--------------------------- 4 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr102585.c diff --git a/gcc/common.opt b/gcc/common.opt index a2af7fb36e0..c4a77f65aa2 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -3284,7 +3284,7 @@ Common Driver JoinedOrMissing Negative(gvms) Generate debug information in extended STABS format. gstatement-frontiers -Common Driver Var(debug_nonbind_markers_p) +Common Driver Var(debug_nonbind_markers_p) PerFunction Emit progressive recommended breakpoint locations. gstrict-dwarf diff --git a/gcc/opts.c b/gcc/opts.c index 65fe192a198..2dd1e5d5372 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1349,6 +1349,32 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model, VECT_COST_MODEL_CHEAP); + /* One could use EnabledBy, but it would lead to a circular dependency. */ + if (!OPTION_SET_P (flag_var_tracking_uninit)) + flag_var_tracking_uninit = flag_var_tracking; + + if (!OPTION_SET_P (flag_var_tracking_assignments)) + flag_var_tracking_assignments + = (flag_var_tracking + && !(flag_selective_scheduling || flag_selective_scheduling2)); + + if (flag_var_tracking_assignments_toggle) + flag_var_tracking_assignments = !flag_var_tracking_assignments; + + if (flag_var_tracking_assignments && !flag_var_tracking) + flag_var_tracking = flag_var_tracking_assignments = -1; + + if (flag_var_tracking_assignments + && (flag_selective_scheduling || flag_selective_scheduling2)) + warning_at (loc, 0, + "var-tracking-assignments changes selective scheduling"); + + if (!OPTION_SET_P (debug_nonbind_markers_p)) + debug_nonbind_markers_p + = (optimize + && debug_info_level >= DINFO_LEVEL_NORMAL + && dwarf_debuginfo_p () + && !(flag_selective_scheduling || flag_selective_scheduling2)); } #define LEFT_COLUMN 27 diff --git a/gcc/testsuite/gcc.dg/pr102585.c b/gcc/testsuite/gcc.dg/pr102585.c new file mode 100644 index 00000000000..efd066b4a4e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr102585.c @@ -0,0 +1,6 @@ +/* PR debug/102585 */ +/* { dg-do compile } */ +/* { dg-options "-fvar-tracking-assignments -fno-var-tracking" } */ + +#pragma GCC optimize 0 +void d_demangle_callback_Og() { int c = 0; } diff --git a/gcc/toplev.c b/gcc/toplev.c index cb4f8c470f0..67f921afb3e 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1499,6 +1499,7 @@ process_options (bool no_backend) } flag_var_tracking = 0; flag_var_tracking_uninit = 0; + flag_var_tracking_assignments = 0; } /* The debug hooks are used to implement -fdump-go-spec because it @@ -1507,33 +1508,6 @@ process_options (bool no_backend) if (flag_dump_go_spec != NULL) debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks); - /* One could use EnabledBy, but it would lead to a circular dependency. */ - if (!OPTION_SET_P (flag_var_tracking_uninit)) - flag_var_tracking_uninit = flag_var_tracking; - - if (!OPTION_SET_P (flag_var_tracking_assignments)) - flag_var_tracking_assignments - = (flag_var_tracking - && !(flag_selective_scheduling || flag_selective_scheduling2)); - - if (flag_var_tracking_assignments_toggle) - flag_var_tracking_assignments = !flag_var_tracking_assignments; - - if (flag_var_tracking_assignments && !flag_var_tracking) - flag_var_tracking = flag_var_tracking_assignments = -1; - - if (flag_var_tracking_assignments - && (flag_selective_scheduling || flag_selective_scheduling2)) - warning_at (UNKNOWN_LOCATION, 0, - "var-tracking-assignments changes selective scheduling"); - - if (!OPTION_SET_P (debug_nonbind_markers_p)) - debug_nonbind_markers_p - = (optimize - && debug_info_level >= DINFO_LEVEL_NORMAL - && dwarf_debuginfo_p () - && !(flag_selective_scheduling || flag_selective_scheduling2)); - if (!OPTION_SET_P (dwarf2out_as_loc_support)) dwarf2out_as_loc_support = dwarf2out_default_as_loc_support (); if (!OPTION_SET_P (dwarf2out_as_locview_support)) -- 2.33.1