* [PATCH] options: Fix variable tracking option processing. @ 2021-10-11 11:01 Martin Liška 2021-10-11 13:05 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-11 11:01 UTC (permalink / raw) To: gcc-patches After the recent change in Optimize attribute handling, we need finish_option function properly auto-detecting variable tracking options. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin PR debug/102585 gcc/ChangeLog: * common.opt: Do not init flag_var_tracking* options. * opts.c (finish_options): Handle flag_var_tracking* options. * toplev.c (process_options): Move to opts.c. gcc/testsuite/ChangeLog: * gcc.dg/pr102585.c: New test. --- gcc/common.opt | 14 +++++--------- gcc/opts.c | 28 ++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/pr102585.c | 6 ++++++ gcc/toplev.c | 33 +++------------------------------ 4 files changed, 42 insertions(+), 39 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr102585.c diff --git a/gcc/common.opt b/gcc/common.opt index 52693e226d2..ec020f4e642 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -3003,19 +3003,16 @@ Common Undocumented Var(flag_use_linker_plugin) ; Positive if we should track variables, negative if we should run ; the var-tracking pass only to discard debug annotations, zero if -; we're not to run it. When flag_var_tracking == 2 (AUTODETECT_VALUE) it -; will be set according to optimize, debug_info_level and debug_hooks -; in process_options (). +; we're not to run it. fvar-tracking -Common Var(flag_var_tracking) Init(2) PerFunction +Common Var(flag_var_tracking) PerFunction Perform variable tracking. ; Positive if we should track variables at assignments, negative if ; we should run the var-tracking pass only to discard debug -; annotations. When flag_var_tracking_assignments == -; AUTODETECT_VALUE it will be set according to flag_var_tracking. +; annotations. fvar-tracking-assignments -Common Var(flag_var_tracking_assignments) Init(2) PerFunction +Common Var(flag_var_tracking_assignments) PerFunction Perform variable tracking by annotating assignments. ; Nonzero if we should toggle flag_var_tracking_assignments after @@ -3026,8 +3023,7 @@ Toggle -fvar-tracking-assignments. ; Positive if we should track uninitialized variables, negative if ; we should run the var-tracking pass only to discard debug -; annotations. When flag_var_tracking_uninit == AUTODETECT_VALUE it -; will be set according to flag_var_tracking. +; annotations. fvar-tracking-uninit Common Var(flag_var_tracking_uninit) PerFunction Perform variable tracking and also tag variables that are uninitialized. diff --git a/gcc/opts.c b/gcc/opts.c index 2116c2991dd..eeb6b1dcc7c 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1353,6 +1353,34 @@ 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); + /* If the user specifically requested variable tracking with tagging + uninitialized variables, we need to turn on variable tracking. + (We already determined above that variable tracking is feasible.) */ + if (opts->x_flag_var_tracking_uninit == 1) + opts->x_flag_var_tracking = 1; + + if (!opts_set->x_flag_var_tracking) + opts->x_flag_var_tracking = optimize >= 1; + + if (!opts_set->x_flag_var_tracking_uninit) + opts->x_flag_var_tracking_uninit = opts->x_flag_var_tracking; + + if (!opts_set->x_flag_var_tracking_assignments) + opts->x_flag_var_tracking_assignments + = (opts->x_flag_var_tracking + && !(opts->x_flag_selective_scheduling + || opts->x_flag_selective_scheduling2)); + + if (opts->x_flag_var_tracking_assignments_toggle) + opts->x_flag_var_tracking_assignments = !opts->x_flag_var_tracking_assignments; + + if (opts->x_flag_var_tracking_assignments && !opts->x_flag_var_tracking) + opts->x_flag_var_tracking = opts->x_flag_var_tracking_assignments = -1; + + if (opts->x_flag_var_tracking_assignments + && (opts->x_flag_selective_scheduling || opts->x_flag_selective_scheduling2)) + warning_at (loc, 0, + "var-tracking-assignments changes selective scheduling"); } #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 81748b1152a..2f13d740b98 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1490,8 +1490,8 @@ process_options (bool no_backend) || !dwarf_debuginfo_p () || debug_hooks->var_location == do_nothing_debug_hooks.var_location) { - if (flag_var_tracking == 1 - || flag_var_tracking_uninit == 1) + if ((OPTION_SET_P (flag_var_tracking) && flag_var_tracking == 1) + || (OPTION_SET_P (flag_var_tracking_uninit) && flag_var_tracking_uninit == 1)) { if (debug_info_level < DINFO_LEVEL_NORMAL) warning_at (UNKNOWN_LOCATION, 0, @@ -1504,6 +1504,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 @@ -1512,34 +1513,6 @@ process_options (bool no_backend) if (flag_dump_go_spec != NULL) debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks); - /* If the user specifically requested variable tracking with tagging - uninitialized variables, we need to turn on variable tracking. - (We already determined above that variable tracking is feasible.) */ - if (flag_var_tracking_uninit == 1) - flag_var_tracking = 1; - - if (flag_var_tracking == AUTODETECT_VALUE) - flag_var_tracking = optimize >= 1; - - if (flag_var_tracking_uninit == AUTODETECT_VALUE) - flag_var_tracking_uninit = flag_var_tracking; - - if (flag_var_tracking_assignments == AUTODETECT_VALUE) - 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 (debug_nonbind_markers_p == AUTODETECT_VALUE) debug_nonbind_markers_p = (optimize -- 2.33.0 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-11 11:01 [PATCH] options: Fix variable tracking option processing Martin Liška @ 2021-10-11 13:05 ` Richard Biener 2021-10-11 13:21 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-11 13:05 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Mon, Oct 11, 2021 at 1:02 PM Martin Liška <mliska@suse.cz> wrote: > > After the recent change in Optimize attribute handling, we need > finish_option function properly auto-detecting variable tracking options. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin > > PR debug/102585 > > gcc/ChangeLog: > > * common.opt: Do not init flag_var_tracking* options. > * opts.c (finish_options): Handle flag_var_tracking* options. > * toplev.c (process_options): Move to opts.c. > > gcc/testsuite/ChangeLog: > > * gcc.dg/pr102585.c: New test. > --- > gcc/common.opt | 14 +++++--------- > gcc/opts.c | 28 ++++++++++++++++++++++++++++ > gcc/testsuite/gcc.dg/pr102585.c | 6 ++++++ > gcc/toplev.c | 33 +++------------------------------ > 4 files changed, 42 insertions(+), 39 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/pr102585.c > > diff --git a/gcc/common.opt b/gcc/common.opt > index 52693e226d2..ec020f4e642 100644 > --- a/gcc/common.opt > +++ b/gcc/common.opt > @@ -3003,19 +3003,16 @@ Common Undocumented Var(flag_use_linker_plugin) > > ; Positive if we should track variables, negative if we should run > ; the var-tracking pass only to discard debug annotations, zero if > -; we're not to run it. When flag_var_tracking == 2 (AUTODETECT_VALUE) it > -; will be set according to optimize, debug_info_level and debug_hooks > -; in process_options (). > +; we're not to run it. > fvar-tracking > -Common Var(flag_var_tracking) Init(2) PerFunction > +Common Var(flag_var_tracking) PerFunction > Perform variable tracking. > > ; Positive if we should track variables at assignments, negative if > ; we should run the var-tracking pass only to discard debug > -; annotations. When flag_var_tracking_assignments == > -; AUTODETECT_VALUE it will be set according to flag_var_tracking. > +; annotations. > fvar-tracking-assignments > -Common Var(flag_var_tracking_assignments) Init(2) PerFunction > +Common Var(flag_var_tracking_assignments) PerFunction > Perform variable tracking by annotating assignments. > > ; Nonzero if we should toggle flag_var_tracking_assignments after > @@ -3026,8 +3023,7 @@ Toggle -fvar-tracking-assignments. > > ; Positive if we should track uninitialized variables, negative if > ; we should run the var-tracking pass only to discard debug > -; annotations. When flag_var_tracking_uninit == AUTODETECT_VALUE it > -; will be set according to flag_var_tracking. > +; annotations. > fvar-tracking-uninit > Common Var(flag_var_tracking_uninit) PerFunction > Perform variable tracking and also tag variables that are uninitialized. > diff --git a/gcc/opts.c b/gcc/opts.c > index 2116c2991dd..eeb6b1dcc7c 100644 > --- a/gcc/opts.c > +++ b/gcc/opts.c > @@ -1353,6 +1353,34 @@ 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); > > + /* If the user specifically requested variable tracking with tagging > + uninitialized variables, we need to turn on variable tracking. > + (We already determined above that variable tracking is feasible.) */ > + if (opts->x_flag_var_tracking_uninit == 1) > + opts->x_flag_var_tracking = 1; > + > + if (!opts_set->x_flag_var_tracking) > + opts->x_flag_var_tracking = optimize >= 1; That's still not equivalent to the old code for -fvar-tracking-uninit which sets opts->x_flag_var_tracking to 1 and the old code checked that for AUTOINIT_VALUE but you override it here for -O0. > + if (!opts_set->x_flag_var_tracking_uninit) > + opts->x_flag_var_tracking_uninit = opts->x_flag_var_tracking; > + > + if (!opts_set->x_flag_var_tracking_assignments) > + opts->x_flag_var_tracking_assignments > + = (opts->x_flag_var_tracking > + && !(opts->x_flag_selective_scheduling > + || opts->x_flag_selective_scheduling2)); > + > + if (opts->x_flag_var_tracking_assignments_toggle) > + opts->x_flag_var_tracking_assignments = !opts->x_flag_var_tracking_assignments; > + > + if (opts->x_flag_var_tracking_assignments && !opts->x_flag_var_tracking) > + opts->x_flag_var_tracking = opts->x_flag_var_tracking_assignments = -1; > + > + if (opts->x_flag_var_tracking_assignments > + && (opts->x_flag_selective_scheduling || opts->x_flag_selective_scheduling2)) > + warning_at (loc, 0, > + "var-tracking-assignments changes selective scheduling"); > } > > #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 81748b1152a..2f13d740b98 100644 > --- a/gcc/toplev.c > +++ b/gcc/toplev.c > @@ -1490,8 +1490,8 @@ process_options (bool no_backend) > || !dwarf_debuginfo_p () > || debug_hooks->var_location == do_nothing_debug_hooks.var_location) > { > - if (flag_var_tracking == 1 > - || flag_var_tracking_uninit == 1) > + if ((OPTION_SET_P (flag_var_tracking) && flag_var_tracking == 1) > + || (OPTION_SET_P (flag_var_tracking_uninit) && flag_var_tracking_uninit == 1)) > { > if (debug_info_level < DINFO_LEVEL_NORMAL) > warning_at (UNKNOWN_LOCATION, 0, > @@ -1504,6 +1504,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 > @@ -1512,34 +1513,6 @@ process_options (bool no_backend) > if (flag_dump_go_spec != NULL) > debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks); > > - /* If the user specifically requested variable tracking with tagging > - uninitialized variables, we need to turn on variable tracking. > - (We already determined above that variable tracking is feasible.) */ > - if (flag_var_tracking_uninit == 1) > - flag_var_tracking = 1; > - > - if (flag_var_tracking == AUTODETECT_VALUE) > - flag_var_tracking = optimize >= 1; > - > - if (flag_var_tracking_uninit == AUTODETECT_VALUE) > - flag_var_tracking_uninit = flag_var_tracking; > - > - if (flag_var_tracking_assignments == AUTODETECT_VALUE) > - 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 (debug_nonbind_markers_p == AUTODETECT_VALUE) > debug_nonbind_markers_p > = (optimize > -- > 2.33.0 > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-11 13:05 ` Richard Biener @ 2021-10-11 13:21 ` Martin Liška 2021-10-11 13:45 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-11 13:21 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches On 10/11/21 15:05, Richard Biener wrote: >> + if (!opts_set->x_flag_var_tracking) >> + opts->x_flag_var_tracking = optimize >= 1; > That's still not equivalent to the old code for -fvar-tracking-uninit which > sets opts->x_flag_var_tracking to 1 and the old code checked that > for AUTOINIT_VALUE but you override it here for -O0. > Do you mean the newly added code: + if (!opts_set->x_flag_var_tracking) + opts->x_flag_var_tracking = optimize >= 1; that should be equivalent to: - if (flag_var_tracking == AUTODETECT_VALUE) - flag_var_tracking = optimize >= 1; ? Or do I miss something? Thanks, Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-11 13:21 ` Martin Liška @ 2021-10-11 13:45 ` Richard Biener 2021-10-12 15:21 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-11 13:45 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Mon, Oct 11, 2021 at 3:21 PM Martin Liška <mliska@suse.cz> wrote: > > On 10/11/21 15:05, Richard Biener wrote: > >> + if (!opts_set->x_flag_var_tracking) > >> + opts->x_flag_var_tracking = optimize >= 1; > > That's still not equivalent to the old code for -fvar-tracking-uninit which > > sets opts->x_flag_var_tracking to 1 and the old code checked that > > for AUTOINIT_VALUE but you override it here for -O0. > > > > Do you mean the newly added code: > > + if (!opts_set->x_flag_var_tracking) > > + opts->x_flag_var_tracking = optimize >= 1; > > > that should be equivalent to: > > - if (flag_var_tracking == AUTODETECT_VALUE) > > - flag_var_tracking = optimize >= 1; > > > ? Or do I miss something? Yes. I think to be equivalent it would need to be if (!opts_set->x_flag_var_tracking_uninit && !opts_set->x_flag_var_tracking) opts->x_flag_var_tracking = optimize >= 1; see how in the old code the order of the tests makes a difference because we test flag_* we also set. Please double-check the change with regard to that. Btw, I'd be more comfortable when the move of the code would be independent of the adjustment to not rely on AUTODETECT_VALUE. Can we do the latter change first (IIRC the former one failed already)? Richard. > > Thanks, > Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-11 13:45 ` Richard Biener @ 2021-10-12 15:21 ` Martin Liška 2021-10-13 8:47 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-12 15:21 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches [-- Attachment #1: Type: text/plain, Size: 525 bytes --] On 10/11/21 15:45, Richard Biener wrote: > Btw, I'd be more comfortable when the move of the code would be > independent of the adjustment to not rely on AUTODETECT_VALUE. > Can we do the latter change first (IIRC the former one failed already)? All right, so I'm doing the first step by eliminating AUTODETECT_VALUE. Note we can't easily use EnabledBy, the option logic is more complicated (like optimize >= 1). Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin [-- Attachment #2: 0001-Eliminate-AUTODETECT_VALUE-usage-in-options.patch --] [-- Type: text/x-patch, Size: 7111 bytes --] From 55af725e87379695faa4b11321e5b416f2981c74 Mon Sep 17 00:00:00 2001 From: Martin Liska <mliska@suse.cz> Date: Tue, 12 Oct 2021 14:31:50 +0200 Subject: [PATCH] Eliminate AUTODETECT_VALUE usage in options. gcc/ChangeLog: * common.opt: Stop using AUTODETECT_VALUE as Init value. * toplev.c (AUTODETECT_VALUE): Remove it. (process_options): Do not compare option values to AUTODETECT_VALUE, but use rather OPTION_SET_P macro. For flag_var_tracking, do not reset it if it is already set based on flag_var_tracking_uninit. --- gcc/common.opt | 24 ++++++++++-------------- gcc/toplev.c | 32 +++++++++++++------------------- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/gcc/common.opt b/gcc/common.opt index 4099effcc80..2b401abdc77 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -3003,19 +3003,16 @@ Common Undocumented Var(flag_use_linker_plugin) ; Positive if we should track variables, negative if we should run ; the var-tracking pass only to discard debug annotations, zero if -; we're not to run it. When flag_var_tracking == 2 (AUTODETECT_VALUE) it -; will be set according to optimize, debug_info_level and debug_hooks -; in process_options (). +; we're not to run it. fvar-tracking -Common Var(flag_var_tracking) Init(2) PerFunction +Common Var(flag_var_tracking) Init(1) PerFunction Perform variable tracking. ; Positive if we should track variables at assignments, negative if ; we should run the var-tracking pass only to discard debug -; annotations. When flag_var_tracking_assignments == -; AUTODETECT_VALUE it will be set according to flag_var_tracking. +; annotations. fvar-tracking-assignments -Common Var(flag_var_tracking_assignments) Init(2) PerFunction +Common Var(flag_var_tracking_assignments) PerFunction Perform variable tracking by annotating assignments. ; Nonzero if we should toggle flag_var_tracking_assignments after @@ -3026,8 +3023,7 @@ Toggle -fvar-tracking-assignments. ; Positive if we should track uninitialized variables, negative if ; we should run the var-tracking pass only to discard debug -; annotations. When flag_var_tracking_uninit == AUTODETECT_VALUE it -; will be set according to flag_var_tracking. +; annotations. fvar-tracking-uninit Common Var(flag_var_tracking_uninit) PerFunction Perform variable tracking and also tag variables that are uninitialized. @@ -3190,11 +3186,11 @@ Common Driver RejectNegative JoinedOrMissing Generate debug information in default format. gas-loc-support -Common Driver Var(dwarf2out_as_loc_support) Init(2) +Common Driver Var(dwarf2out_as_loc_support) Assume assembler support for (DWARF2+) .loc directives. gas-locview-support -Common Driver Var(dwarf2out_as_locview_support) Init(2) +Common Driver Var(dwarf2out_as_locview_support) Assume assembler support for view in (DWARF2+) .loc directives. gcoff @@ -3248,7 +3244,7 @@ Common Driver JoinedOrMissing Generate debug information in default extended format. ginline-points -Common Driver Var(debug_inline_points) Init(2) +Common Driver Var(debug_inline_points) Generate extended entry point information for inlined functions. ginternal-reset-location-views @@ -3288,7 +3284,7 @@ Common Driver JoinedOrMissing Negative(gvms) Generate debug information in extended STABS format. gstatement-frontiers -Common Driver Var(debug_nonbind_markers_p) Init(2) +Common Driver Var(debug_nonbind_markers_p) Emit progressive recommended breakpoint locations. gstrict-dwarf @@ -3304,7 +3300,7 @@ Common Driver Var(flag_gtoggle) Toggle debug information generation. gvariable-location-views -Common Driver Var(debug_variable_location_views, 1) Init(2) +Common Driver Var(debug_variable_location_views, 1) Augment variable location lists with progressive views. gvariable-location-views=incompat5 diff --git a/gcc/toplev.c b/gcc/toplev.c index 167feac2583..5e0f548f1ea 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -119,10 +119,6 @@ unsigned int save_decoded_options_count; /* Vector of saved Optimization decoded command line options. */ vec<cl_decoded_option> *save_opt_decoded_options; -/* Used to enable -fvar-tracking, -fweb and -frename-registers according - to optimize in process_options (). */ -#define AUTODETECT_VALUE 2 - /* Debug hooks - dependent upon command line options. */ const struct gcc_debug_hooks *debug_hooks; @@ -1490,8 +1486,9 @@ process_options (bool no_backend) || !dwarf_debuginfo_p () || debug_hooks->var_location == do_nothing_debug_hooks.var_location) { - if (flag_var_tracking == 1 - || flag_var_tracking_uninit == 1) + if ((OPTION_SET_P (flag_var_tracking) && flag_var_tracking == 1) + || (OPTION_SET_P (flag_var_tracking_uninit) + && flag_var_tracking_uninit == 1)) { if (debug_info_level < DINFO_LEVEL_NORMAL) warning_at (UNKNOWN_LOCATION, 0, @@ -1517,14 +1514,13 @@ process_options (bool no_backend) (We already determined above that variable tracking is feasible.) */ if (flag_var_tracking_uninit == 1) flag_var_tracking = 1; - - if (flag_var_tracking == AUTODETECT_VALUE) + else if (!OPTION_SET_P (flag_var_tracking) && flag_var_tracking) flag_var_tracking = optimize >= 1; - if (flag_var_tracking_uninit == AUTODETECT_VALUE) + if (!OPTION_SET_P (flag_var_tracking_uninit)) flag_var_tracking_uninit = flag_var_tracking; - if (flag_var_tracking_assignments == AUTODETECT_VALUE) + if (!OPTION_SET_P (flag_var_tracking_assignments)) flag_var_tracking_assignments = (flag_var_tracking && !(flag_selective_scheduling || flag_selective_scheduling2)); @@ -1540,21 +1536,19 @@ process_options (bool no_backend) warning_at (UNKNOWN_LOCATION, 0, "var-tracking-assignments changes selective scheduling"); - if (debug_nonbind_markers_p == AUTODETECT_VALUE) + 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 (dwarf2out_as_loc_support == AUTODETECT_VALUE) - dwarf2out_as_loc_support - = dwarf2out_default_as_loc_support (); - if (dwarf2out_as_locview_support == AUTODETECT_VALUE) - dwarf2out_as_locview_support - = dwarf2out_default_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 (debug_variable_location_views == AUTODETECT_VALUE) + if (!OPTION_SET_P (debug_variable_location_views)) { debug_variable_location_views = (flag_var_tracking @@ -1588,7 +1582,7 @@ process_options (bool no_backend) debug_internal_reset_location_views = 0; } - if (debug_inline_points == AUTODETECT_VALUE) + if (!OPTION_SET_P (debug_inline_points)) debug_inline_points = debug_variable_location_views; else if (debug_inline_points && !debug_nonbind_markers_p) { -- 2.33.0 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-12 15:21 ` Martin Liška @ 2021-10-13 8:47 ` Richard Biener 2021-10-13 11:59 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-13 8:47 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Tue, Oct 12, 2021 at 5:21 PM Martin Liška <mliska@suse.cz> wrote: > > On 10/11/21 15:45, Richard Biener wrote: > > Btw, I'd be more comfortable when the move of the code would be > > independent of the adjustment to not rely on AUTODETECT_VALUE. > > Can we do the latter change first (IIRC the former one failed already)? > > All right, so I'm doing the first step by eliminating AUTODETECT_VALUE. > Note we can't easily use EnabledBy, the option logic is more complicated (like optimize >= 1). > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? Let's split this ;) The debug_inline_points part is OK. How can debug_variable_location_views be ever -1? But the debug_variable_location_views part looks OK as well. More or less all parts that have the variable assigned in a single place in gcc/ are OK (dwarf2out_as_locview_support). But the main flag_var_tracking* cases need more thorough view, maybe we can convert them to single-set code first? Richard. > Thanks, > Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-13 8:47 ` Richard Biener @ 2021-10-13 11:59 ` Martin Liška 2021-10-13 12:50 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-13 11:59 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches On 10/13/21 10:47, Richard Biener wrote: > Let's split this;) The debug_inline_points part is OK. Fine. > > How can debug_variable_location_views be ever -1? But the > debug_variable_location_views part looks OK as well. It comes from here: gvariable-location-views=incompat5 Common Driver RejectNegative Var(debug_variable_location_views, -1) Init(2) but it's fine as using -gvariable-location-views=incompat5 leads to OPTION_SET_P(debug_variable_location_views) == true. > > More or less all parts that have the variable assigned in a single > place in gcc/ are OK (dwarf2out_as_locview_support). But the > main flag_var_tracking* cases need more thorough view, > maybe we can convert them to single-set code first? I don't think so, your have code like if (flag_var_tracking_assignments_toggle) flag_var_tracking_assignments = !flag_var_tracking_assignments; which makes it more complicated. Or do I miss something? Cheers, Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-13 11:59 ` Martin Liška @ 2021-10-13 12:50 ` Richard Biener 2021-10-13 13:12 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-13 12:50 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Wed, Oct 13, 2021 at 1:59 PM Martin Liška <mliska@suse.cz> wrote: > > On 10/13/21 10:47, Richard Biener wrote: > > Let's split this;) The debug_inline_points part is OK. > > Fine. > > > > > How can debug_variable_location_views be ever -1? But the > > debug_variable_location_views part looks OK as well. > > It comes from here: > gvariable-location-views=incompat5 > Common Driver RejectNegative Var(debug_variable_location_views, -1) Init(2) > > but it's fine as using -gvariable-location-views=incompat5 leads to > OPTION_SET_P(debug_variable_location_views) == true. > > > > > More or less all parts that have the variable assigned in a single > > place in gcc/ are OK (dwarf2out_as_locview_support). But the > > main flag_var_tracking* cases need more thorough view, > > maybe we can convert them to single-set code first? > > I don't think so, your have code like > > if (flag_var_tracking_assignments_toggle) > flag_var_tracking_assignments = !flag_var_tracking_assignments; > > which makes it more complicated. Or do I miss something? It does, yes. But that's a ^ with flag_var_tracking_assignments_toggle ;) It's also one of the more weird flags, so it could be applied after the otherwise single set of flag_var_tracking_assignments ... Richard. > > Cheers, > Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-13 12:50 ` Richard Biener @ 2021-10-13 13:12 ` Martin Liška 2021-10-13 13:29 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-13 13:12 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches On 10/13/21 14:50, Richard Biener wrote: > It does, yes. But that's a ^ with flag_var_tracking_assignments_toggle;) > > It's also one of the more weird flags, so it could be applied after the > otherwise single set of flag_var_tracking_assignments ... Well, it's far from being simple. Can we please make a step and install the patch I sent? I mean the latest that does the removal of AUTODETECT_VALUE. Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-13 13:12 ` Martin Liška @ 2021-10-13 13:29 ` Richard Biener 2021-10-14 11:10 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-13 13:29 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Wed, Oct 13, 2021 at 3:12 PM Martin Liška <mliska@suse.cz> wrote: > > On 10/13/21 14:50, Richard Biener wrote: > > It does, yes. But that's a ^ with flag_var_tracking_assignments_toggle;) > > > > It's also one of the more weird flags, so it could be applied after the > > otherwise single set of flag_var_tracking_assignments ... > > Well, it's far from being simple. > Can we please make a step and install the patch I sent? I mean the latest > that does the removal of AUTODETECT_VALUE. But parts of the patch are not obvious and you've not explained why you remove all Init(AUTODETECT_VALUE) but for flag_var_tracking you change it to Init(1). I count 4 assignments to flag_var_tracking in toplev.c and one in nvptx.c and c6x.c each. if (flag_var_tracking_uninit == AUTODETECT_VALUE) flag_var_tracking_uninit = flag_var_tracking; can probably be handled by EnabledBy, but then we also have if (flag_var_tracking_uninit == 1) flag_var_tracking = 1; which suggests the same the other way around. I guess positional handling might differ with say -fvar-tracking -fno-var-tracking-uninit vs. -fno-var-tracking-uninit -fvar-tracking when using EnabledBy vs. the "explicit" code. + else if (!OPTION_SET_P (flag_var_tracking) && flag_var_tracking) flag_var_tracking = optimize >= 1; I think _this_ should, instead of the Init(1), become an entry in default_options_table with OPT_LEVELS_1_PLUS. As said, besides flag_var_* the posted patch looks OK and is good to commit. Richard. > > Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-13 13:29 ` Richard Biener @ 2021-10-14 11:10 ` Martin Liška 2021-10-14 12:07 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-14 11:10 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches [-- Attachment #1: Type: text/plain, Size: 2230 bytes --] On 10/13/21 15:29, Richard Biener wrote: > On Wed, Oct 13, 2021 at 3:12 PM Martin Liška <mliska@suse.cz> wrote: >> >> On 10/13/21 14:50, Richard Biener wrote: >>> It does, yes. But that's a ^ with flag_var_tracking_assignments_toggle;) >>> >>> It's also one of the more weird flags, so it could be applied after the >>> otherwise single set of flag_var_tracking_assignments ... >> >> Well, it's far from being simple. >> Can we please make a step and install the patch I sent? I mean the latest >> that does the removal of AUTODETECT_VALUE. > > But parts of the patch are not obvious and you've not explained why you > remove all Init(AUTODETECT_VALUE) but for flag_var_tracking you > change it to Init(1). I count 4 assignments to flag_var_tracking in toplev.c > and one in nvptx.c and c6x.c each. All right. So the assignments in these target set flag_var_tracking = 0, which is fine. > > if (flag_var_tracking_uninit == AUTODETECT_VALUE) > flag_var_tracking_uninit = flag_var_tracking; > > can probably be handled by EnabledBy, but then we also have > > if (flag_var_tracking_uninit == 1) > flag_var_tracking = 1; Yep, I made: fvar-tracking Common Var(flag_var_tracking) PerFunction EnabledBy(fvar-tracking-uninit) and made fvar-tracking enabled with OPT_LEVELS_1_PLUS. > > which suggests the same the other way around. I guess The other way around is problematic as leads to a cycle. I tried adding a cycle detection in common_handle_option_auto (using a bitmap). But it breaks case OPT_Wunused, which set sets various sub-values :/ > positional handling might differ with say > -fvar-tracking -fno-var-tracking-uninit vs. -fno-var-tracking-uninit > -fvar-tracking I verified this is fine in debugger. > when using EnabledBy vs. the "explicit" code. > > + else if (!OPTION_SET_P (flag_var_tracking) && flag_var_tracking) > flag_var_tracking = optimize >= 1; > > I think _this_ should, instead of the Init(1), become an entry in > default_options_table with OPT_LEVELS_1_PLUS. Done. > > As said, besides flag_var_* the posted patch looks OK and is good to > commit. I'm sending an updated version that survives regression tests. Thoughts? Martin > > Richard. > >> >> Martin [-- Attachment #2: 0001-Eliminate-AUTODETECT_VALUE-usage-in-options.patch --] [-- Type: text/x-patch, Size: 8002 bytes --] From 4d9adc296aa527d9ae504da4271e7293d77bceed Mon Sep 17 00:00:00 2001 From: Martin Liska <mliska@suse.cz> Date: Tue, 12 Oct 2021 14:31:50 +0200 Subject: [PATCH] Eliminate AUTODETECT_VALUE usage in options. gcc/ChangeLog: * common.opt: Stop using AUTODETECT_VALUE and use EnabledBy where possible. * opts.c: Enable OPT_fvar_tracking with optimize >= 1. * toplev.c (AUTODETECT_VALUE): Remove macro. (process_options): Simplify by using EnabledBy and OPT_fvar_tracking. Use OPTION_SET_P macro instead of AUTODETECT_VALUE. --- gcc/common.opt | 24 ++++++++++-------------- gcc/opts.c | 1 + gcc/toplev.c | 41 ++++++++++++++--------------------------- 3 files changed, 25 insertions(+), 41 deletions(-) diff --git a/gcc/common.opt b/gcc/common.opt index 1eedfeaf539..a2af7fb36e0 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -3003,19 +3003,16 @@ Common Undocumented Var(flag_use_linker_plugin) ; Positive if we should track variables, negative if we should run ; the var-tracking pass only to discard debug annotations, zero if -; we're not to run it. When flag_var_tracking == 2 (AUTODETECT_VALUE) it -; will be set according to optimize, debug_info_level and debug_hooks -; in process_options (). +; we're not to run it. fvar-tracking -Common Var(flag_var_tracking) Init(2) PerFunction +Common Var(flag_var_tracking) PerFunction EnabledBy(fvar-tracking-uninit) Perform variable tracking. ; Positive if we should track variables at assignments, negative if ; we should run the var-tracking pass only to discard debug -; annotations. When flag_var_tracking_assignments == -; AUTODETECT_VALUE it will be set according to flag_var_tracking. +; annotations. fvar-tracking-assignments -Common Var(flag_var_tracking_assignments) Init(2) PerFunction +Common Var(flag_var_tracking_assignments) PerFunction Perform variable tracking by annotating assignments. ; Nonzero if we should toggle flag_var_tracking_assignments after @@ -3026,8 +3023,7 @@ Toggle -fvar-tracking-assignments. ; Positive if we should track uninitialized variables, negative if ; we should run the var-tracking pass only to discard debug -; annotations. When flag_var_tracking_uninit == AUTODETECT_VALUE it -; will be set according to flag_var_tracking. +; annotations. fvar-tracking-uninit Common Var(flag_var_tracking_uninit) PerFunction Perform variable tracking and also tag variables that are uninitialized. @@ -3190,11 +3186,11 @@ Common Driver RejectNegative JoinedOrMissing Generate debug information in default format. gas-loc-support -Common Driver Var(dwarf2out_as_loc_support) Init(2) +Common Driver Var(dwarf2out_as_loc_support) Assume assembler support for (DWARF2+) .loc directives. gas-locview-support -Common Driver Var(dwarf2out_as_locview_support) Init(2) +Common Driver Var(dwarf2out_as_locview_support) Assume assembler support for view in (DWARF2+) .loc directives. gcoff @@ -3248,7 +3244,7 @@ Common Driver JoinedOrMissing Generate debug information in default extended format. ginline-points -Common Driver Var(debug_inline_points) Init(2) +Common Driver Var(debug_inline_points) Generate extended entry point information for inlined functions. ginternal-reset-location-views @@ -3288,7 +3284,7 @@ Common Driver JoinedOrMissing Negative(gvms) Generate debug information in extended STABS format. gstatement-frontiers -Common Driver Var(debug_nonbind_markers_p) Init(2) +Common Driver Var(debug_nonbind_markers_p) Emit progressive recommended breakpoint locations. gstrict-dwarf @@ -3304,7 +3300,7 @@ Common Driver Var(flag_gtoggle) Toggle debug information generation. gvariable-location-views -Common Driver Var(debug_variable_location_views, 1) Init(2) +Common Driver Var(debug_variable_location_views, 1) Augment variable location lists with progressive views. gvariable-location-views=incompat5 diff --git a/gcc/opts.c b/gcc/opts.c index fc71b6e4242..65fe192a198 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -581,6 +581,7 @@ static const struct default_options default_options_table[] = { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 }, + { OPT_LEVELS_1_PLUS, OPT_fvar_tracking, NULL, 1 }, /* -O1 (and not -Og) optimizations. */ { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 }, diff --git a/gcc/toplev.c b/gcc/toplev.c index 81546b19e91..4f574a5aad3 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -119,10 +119,6 @@ unsigned int save_decoded_options_count; /* Vector of saved Optimization decoded command line options. */ vec<cl_decoded_option> *save_opt_decoded_options; -/* Used to enable -fvar-tracking, -fweb and -frename-registers according - to optimize in process_options (). */ -#define AUTODETECT_VALUE 2 - /* Debug hooks - dependent upon command line options. */ const struct gcc_debug_hooks *debug_hooks; @@ -1483,8 +1479,9 @@ process_options (bool no_backend) || !dwarf_debuginfo_p () || debug_hooks->var_location == do_nothing_debug_hooks.var_location) { - if (flag_var_tracking == 1 - || flag_var_tracking_uninit == 1) + if ((OPTION_SET_P (flag_var_tracking) && flag_var_tracking == 1) + || (OPTION_SET_P (flag_var_tracking_uninit) + && flag_var_tracking_uninit == 1)) { if (debug_info_level < DINFO_LEVEL_NORMAL) warning_at (UNKNOWN_LOCATION, 0, @@ -1505,19 +1502,11 @@ process_options (bool no_backend) if (flag_dump_go_spec != NULL) debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks); - /* If the user specifically requested variable tracking with tagging - uninitialized variables, we need to turn on variable tracking. - (We already determined above that variable tracking is feasible.) */ - if (flag_var_tracking_uninit == 1) - flag_var_tracking = 1; - - if (flag_var_tracking == AUTODETECT_VALUE) - flag_var_tracking = optimize >= 1; - - if (flag_var_tracking_uninit == AUTODETECT_VALUE) - flag_var_tracking_uninit = flag_var_tracking; + /* 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 (flag_var_tracking_assignments == AUTODETECT_VALUE) + if (!OPTION_SET_P (flag_var_tracking_assignments)) flag_var_tracking_assignments = (flag_var_tracking && !(flag_selective_scheduling || flag_selective_scheduling2)); @@ -1533,21 +1522,19 @@ process_options (bool no_backend) warning_at (UNKNOWN_LOCATION, 0, "var-tracking-assignments changes selective scheduling"); - if (debug_nonbind_markers_p == AUTODETECT_VALUE) + 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 (dwarf2out_as_loc_support == AUTODETECT_VALUE) - dwarf2out_as_loc_support - = dwarf2out_default_as_loc_support (); - if (dwarf2out_as_locview_support == AUTODETECT_VALUE) - dwarf2out_as_locview_support - = dwarf2out_default_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 (debug_variable_location_views == AUTODETECT_VALUE) + if (!OPTION_SET_P (debug_variable_location_views)) { debug_variable_location_views = (flag_var_tracking @@ -1581,7 +1568,7 @@ process_options (bool no_backend) debug_internal_reset_location_views = 0; } - if (debug_inline_points == AUTODETECT_VALUE) + if (!OPTION_SET_P (debug_inline_points)) debug_inline_points = debug_variable_location_views; else if (debug_inline_points && !debug_nonbind_markers_p) { -- 2.33.0 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-14 11:10 ` Martin Liška @ 2021-10-14 12:07 ` Richard Biener 2021-10-15 15:22 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-14 12:07 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Thu, Oct 14, 2021 at 1:10 PM Martin Liška <mliska@suse.cz> wrote: > > On 10/13/21 15:29, Richard Biener wrote: > > On Wed, Oct 13, 2021 at 3:12 PM Martin Liška <mliska@suse.cz> wrote: > >> > >> On 10/13/21 14:50, Richard Biener wrote: > >>> It does, yes. But that's a ^ with flag_var_tracking_assignments_toggle;) > >>> > >>> It's also one of the more weird flags, so it could be applied after the > >>> otherwise single set of flag_var_tracking_assignments ... > >> > >> Well, it's far from being simple. > >> Can we please make a step and install the patch I sent? I mean the latest > >> that does the removal of AUTODETECT_VALUE. > > > > But parts of the patch are not obvious and you've not explained why you > > remove all Init(AUTODETECT_VALUE) but for flag_var_tracking you > > change it to Init(1). I count 4 assignments to flag_var_tracking in toplev.c > > and one in nvptx.c and c6x.c each. > > All right. So the assignments in these target set flag_var_tracking = 0, which > is fine. > > > > > if (flag_var_tracking_uninit == AUTODETECT_VALUE) > > flag_var_tracking_uninit = flag_var_tracking; > > > > can probably be handled by EnabledBy, but then we also have > > > > if (flag_var_tracking_uninit == 1) > > flag_var_tracking = 1; > > Yep, I made: > > fvar-tracking > Common Var(flag_var_tracking) PerFunction EnabledBy(fvar-tracking-uninit) > > and made fvar-tracking enabled with OPT_LEVELS_1_PLUS. > > > > > which suggests the same the other way around. I guess > > The other way around is problematic as leads to a cycle. I tried adding > a cycle detection in common_handle_option_auto (using a bitmap). But it breaks > case OPT_Wunused, which set sets various sub-values :/ > > > > positional handling might differ with say > > -fvar-tracking -fno-var-tracking-uninit vs. -fno-var-tracking-uninit > > -fvar-tracking > > I verified this is fine in debugger. > > > when using EnabledBy vs. the "explicit" code. > > > > + else if (!OPTION_SET_P (flag_var_tracking) && flag_var_tracking) > > flag_var_tracking = optimize >= 1; > > > > I think _this_ should, instead of the Init(1), become an entry in > > default_options_table with OPT_LEVELS_1_PLUS. > > Done. > > > > > As said, besides flag_var_* the posted patch looks OK and is good to > > commit. > > I'm sending an updated version that survives regression tests. > > Thoughts? OK. Thanks, Richard. > Martin > > > > > Richard. > > > >> > >> Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-14 12:07 ` Richard Biener @ 2021-10-15 15:22 ` Martin Liška 2021-10-19 9:12 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-15 15:22 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches [-- Attachment #1: Type: text/plain, Size: 515 bytes --] All right, and there's second part that moves the code from toplev.c to opts.c (finish_options) as I've done in the original version. The patch also handles PR102766 where nvptx.c target sets: debug_nonbind_markers_p = 0; So the easiest approach is marking the flag as set in global_options_set, I haven't found a better approach :/ Reason is that nvptx_option_override is called before finish_options. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin [-- Attachment #2: 0001-options-Fix-variable-tracking-option-processing.patch --] [-- Type: text/x-patch, Size: 4232 bytes --] From 827647ab23b8bec9d20094e009341598e12a644b Mon Sep 17 00:00:00 2001 From: Martin Liska <mliska@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. gcc/testsuite/ChangeLog: * gcc.dg/pr102585.c: New test. --- gcc/config/nvptx/nvptx.c | 1 + gcc/opts.c | 19 +++++++++++++++++++ gcc/testsuite/gcc.dg/pr102585.c | 6 ++++++ gcc/toplev.c | 21 +-------------------- 4 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr102585.c diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index 951252e598a..1e4b26381c5 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -219,6 +219,7 @@ nvptx_option_override (void) flag_toplevel_reorder = 1; debug_nonbind_markers_p = 0; + OPTION_SET_P (debug_nonbind_markers_p) = 1; /* Set flag_no_common, unless explicitly disabled. We fake common using .weak, and that's not entirely accurate, so avoid it diff --git a/gcc/opts.c b/gcc/opts.c index 65fe192a198..bf3a81c287e 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1349,6 +1349,25 @@ 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"); } #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 4f574a5aad3..7c0467948f2 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1494,6 +1494,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 @@ -1502,26 +1503,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 -- 2.33.0 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-15 15:22 ` Martin Liška @ 2021-10-19 9:12 ` Richard Biener 2021-10-19 9:34 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-19 9:12 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Fri, Oct 15, 2021 at 5:22 PM Martin Liška <mliska@suse.cz> wrote: > > All right, and there's second part that moves the code > from toplev.c to opts.c (finish_options) as I've done in the original version. > > The patch also handles PR102766 where nvptx.c target sets: > debug_nonbind_markers_p = 0; > > So the easiest approach is marking the flag as set in global_options_set, > I haven't found a better approach :/ Reason is that nvptx_option_override > is called before finish_options. So currently nvptx_option_override is called before we do this code blob (it's called at the beginning of process_options). Why's the solution not to move this setting to finish_options as well? (and disabling it along var-tracking when we end with no -g in process_options) IMHO the target should have the last say, so the hook should be invoked after we are finished overriding stuff and finish_options should be _only_ doing diagnostics and disabling stuff we cannot handle. Richard. > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-19 9:12 ` Richard Biener @ 2021-10-19 9:34 ` Martin Liška 2021-10-19 10:53 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-19 9:34 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches On 10/19/21 11:12, Richard Biener wrote: > On Fri, Oct 15, 2021 at 5:22 PM Martin Liška <mliska@suse.cz> wrote: >> >> All right, and there's second part that moves the code >> from toplev.c to opts.c (finish_options) as I've done in the original version. >> >> The patch also handles PR102766 where nvptx.c target sets: >> debug_nonbind_markers_p = 0; >> >> So the easiest approach is marking the flag as set in global_options_set, >> I haven't found a better approach :/ Reason is that nvptx_option_override >> is called before finish_options. > > So currently nvptx_option_override is called before we do this code > blob (it's called at the beginning of process_options). Yes, happens early in process_options. > > Why's the solution not to move this setting to finish_options as well? I would like to, but the option detection depends on target hooks and some debuginfo functionality, leading to: g++ -no-pie -g -DIN_GCC -fPIC -DCROSS_DIRECTORY_STRUCTURE -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wno-error=format-diag -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fno-common -DHAVE_CONFIG_H -static-libstdc++ -static-libgcc -o Tlto-wrapper \ lto-wrapper.o collect-utils.o ggc-none.o libcommon-target.a libcommon.a ../libcpp/libcpp.a ../libbacktrace/.libs/libbacktrace.a ../libiberty/pic/libiberty.a ../libdecnumber/libdecnumber.a /home/marxin/Programming/gcc/gcc/opts.c:1382: error: undefined reference to 'dwarf2out_default_as_loc_support()' /home/marxin/Programming/gcc/gcc/opts.c:1384: error: undefined reference to 'dwarf2out_default_as_locview_support()' /home/marxin/Programming/gcc/gcc/opts.c:1409: error: undefined reference to 'targetm' Or can we do better? > (and disabling it along var-tracking when we end with no -g in process_options) > > IMHO the target should have the last say, so the hook should be invoked > after we are finished overriding stuff and finish_options should be > _only_ doing diagnostics and disabling stuff we cannot handle. Well, that sounds good, but we are quite far from that :/ Martin > > Richard. > >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >> >> Ready to be installed? >> Thanks, >> Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-19 9:34 ` Martin Liška @ 2021-10-19 10:53 ` Richard Biener 2021-10-20 8:51 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-19 10:53 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Tue, Oct 19, 2021 at 11:34 AM Martin Liška <mliska@suse.cz> wrote: > > On 10/19/21 11:12, Richard Biener wrote: > > On Fri, Oct 15, 2021 at 5:22 PM Martin Liška <mliska@suse.cz> wrote: > >> > >> All right, and there's second part that moves the code > >> from toplev.c to opts.c (finish_options) as I've done in the original version. > >> > >> The patch also handles PR102766 where nvptx.c target sets: > >> debug_nonbind_markers_p = 0; > >> > >> So the easiest approach is marking the flag as set in global_options_set, > >> I haven't found a better approach :/ Reason is that nvptx_option_override > >> is called before finish_options. > > > > So currently nvptx_option_override is called before we do this code > > blob (it's called at the beginning of process_options). > > Yes, happens early in process_options. > > > > > Why's the solution not to move this setting to finish_options as well? > > I would like to, but the option detection depends on target hooks and some debuginfo > functionality, leading to: > > g++ -no-pie -g -DIN_GCC -fPIC -DCROSS_DIRECTORY_STRUCTURE -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wno-error=format-diag -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fno-common -DHAVE_CONFIG_H -static-libstdc++ -static-libgcc -o Tlto-wrapper \ > lto-wrapper.o collect-utils.o ggc-none.o libcommon-target.a libcommon.a ../libcpp/libcpp.a ../libbacktrace/.libs/libbacktrace.a ../libiberty/pic/libiberty.a ../libdecnumber/libdecnumber.a > /home/marxin/Programming/gcc/gcc/opts.c:1382: error: undefined reference to 'dwarf2out_default_as_loc_support()' > /home/marxin/Programming/gcc/gcc/opts.c:1384: error: undefined reference to 'dwarf2out_default_as_locview_support()' > /home/marxin/Programming/gcc/gcc/opts.c:1409: error: undefined reference to 'targetm' > > Or can we do better? Meh ... :/ Well, move the target override hook call down (try to shuffle things so diagnostics happen after but "inits" happen before). > > (and disabling it along var-tracking when we end with no -g in process_options) > > > > IMHO the target should have the last say, so the hook should be invoked > > after we are finished overriding stuff and finish_options should be > > _only_ doing diagnostics and disabling stuff we cannot handle. > > Well, that sounds good, but we are quite far from that :/ Yes, I know... > Martin > > > > > Richard. > > > >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > >> > >> Ready to be installed? > >> Thanks, > >> Martin > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-19 10:53 ` Richard Biener @ 2021-10-20 8:51 ` Martin Liška 2021-10-21 9:57 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-20 8:51 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches [-- Attachment #1: Type: text/plain, Size: 1275 bytes --] 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 [-- Attachment #2: 0001-options-Fix-variable-tracking-option-processing.patch --] [-- Type: text/x-patch, Size: 4878 bytes --] From 1fbeeb6bb326c6e9e704be7a99b69014b1104fda Mon Sep 17 00:00:00 2001 From: Martin Liska <mliska@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 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-20 8:51 ` Martin Liška @ 2021-10-21 9:57 ` Richard Biener 2021-10-21 13:14 ` Martin Liška 0 siblings, 1 reply; 20+ messages in thread From: Richard Biener @ 2021-10-21 9:57 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Wed, Oct 20, 2021 at 10:51 AM Martin Liška <mliska@suse.cz> wrote: > > 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. That looks like a sensible change anyway - options that depend on options that are per function have to be per function as well. It also depends on flag_selective_scheduling. But note the checks now happen before if (flag_syntax_only) { write_symbols = NO_DEBUG; profile_flag = 0; } if (flag_gtoggle) { if (debug_info_level == DINFO_LEVEL_NONE) { debug_info_level = DINFO_LEVEL_NORMAL; if (write_symbols == NO_DEBUG) write_symbols = PREFERRED_DEBUGGING_TYPE; } else debug_info_level = DINFO_LEVEL_NONE; } which previously affected debug_nonbind_markers_p. I think it makes sense to move the above to finish_options as well. I suppose -help doesn't correctly dump the -g enabled state for -gtoggle at the moment? Richard. > > What do you think about the patch? > Cheers, > Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-21 9:57 ` Richard Biener @ 2021-10-21 13:14 ` Martin Liška 2021-10-21 13:17 ` Richard Biener 0 siblings, 1 reply; 20+ messages in thread From: Martin Liška @ 2021-10-21 13:14 UTC (permalink / raw) To: Richard Biener; +Cc: GCC Patches [-- Attachment #1: Type: text/plain, Size: 562 bytes --] On 10/21/21 11:57, Richard Biener wrote: > which previously affected debug_nonbind_markers_p. I think it makes > sense to move > the above to finish_options as well. I suppose -help doesn't correctly dump > the -g enabled state for -gtoggle at the moment? All right, works for me. The updated patch was tested on nvptx cross compiler and can bootstrap on x86_64-linux-gnu and survives regression tests. The -g option is showed in -Q --help=common as: -g So no option value is displayed. Is the patch fine now? Thanks, Martin [-- Attachment #2: 0001-options-Fix-variable-tracking-option-processing.patch --] [-- Type: text/x-patch, Size: 5877 bytes --] From da24e51c8e108373256f1106fe4478b919189c99 Mon Sep 17 00:00:00 2001 From: Martin Liska <mliska@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. Process also flag_syntax_only and flag_gtoggle. * 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 | 45 +++++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/pr102585.c | 6 +++++ gcc/toplev.c | 47 +-------------------------------- 4 files changed, 53 insertions(+), 47 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..4472cec1b98 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1349,6 +1349,51 @@ 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 (flag_syntax_only) + { + write_symbols = NO_DEBUG; + profile_flag = 0; + } + + if (flag_gtoggle) + { + if (debug_info_level == DINFO_LEVEL_NONE) + { + debug_info_level = DINFO_LEVEL_NORMAL; + + if (write_symbols == NO_DEBUG) + write_symbols = PREFERRED_DEBUGGING_TYPE; + } + else + debug_info_level = DINFO_LEVEL_NONE; + } + + 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..486bd8804fa 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1378,25 +1378,6 @@ process_options (bool no_backend) } } - if (flag_syntax_only) - { - write_symbols = NO_DEBUG; - profile_flag = 0; - } - - if (flag_gtoggle) - { - if (debug_info_level == DINFO_LEVEL_NONE) - { - debug_info_level = DINFO_LEVEL_NORMAL; - - if (write_symbols == NO_DEBUG) - write_symbols = PREFERRED_DEBUGGING_TYPE; - } - else - debug_info_level = DINFO_LEVEL_NONE; - } - /* CTF is supported for only C at this time. */ if (!lang_GNU_C () && ctf_debug_info_level > CTFINFO_LEVEL_NONE) @@ -1499,6 +1480,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 +1489,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 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] options: Fix variable tracking option processing. 2021-10-21 13:14 ` Martin Liška @ 2021-10-21 13:17 ` Richard Biener 0 siblings, 0 replies; 20+ messages in thread From: Richard Biener @ 2021-10-21 13:17 UTC (permalink / raw) To: Martin Liška; +Cc: GCC Patches On Thu, Oct 21, 2021 at 3:14 PM Martin Liška <mliska@suse.cz> wrote: > > On 10/21/21 11:57, Richard Biener wrote: > > which previously affected debug_nonbind_markers_p. I think it makes > > sense to move > > the above to finish_options as well. I suppose -help doesn't correctly dump > > the -g enabled state for -gtoggle at the moment? > > All right, works for me. The updated patch was tested on nvptx cross compiler > and can bootstrap on x86_64-linux-gnu and survives regression tests. > > The -g option is showed in -Q --help=common as: > > -g > > So no option value is displayed. > > Is the patch fine now? OK. Thanks, Richard. > Thanks, > Martin ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2021-10-21 13:17 UTC | newest] Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-10-11 11:01 [PATCH] options: Fix variable tracking option processing Martin Liška 2021-10-11 13:05 ` Richard Biener 2021-10-11 13:21 ` Martin Liška 2021-10-11 13:45 ` Richard Biener 2021-10-12 15:21 ` Martin Liška 2021-10-13 8:47 ` Richard Biener 2021-10-13 11:59 ` Martin Liška 2021-10-13 12:50 ` Richard Biener 2021-10-13 13:12 ` Martin Liška 2021-10-13 13:29 ` Richard Biener 2021-10-14 11:10 ` Martin Liška 2021-10-14 12:07 ` Richard Biener 2021-10-15 15:22 ` Martin Liška 2021-10-19 9:12 ` Richard Biener 2021-10-19 9:34 ` Martin Liška 2021-10-19 10:53 ` Richard Biener 2021-10-20 8:51 ` Martin Liška 2021-10-21 9:57 ` Richard Biener 2021-10-21 13:14 ` Martin Liška 2021-10-21 13:17 ` Richard Biener
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).