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.
This commit is contained in:
Martin Liska 2021-10-14 14:57:18 +02:00
parent 701ee06780
commit b470227661
4 changed files with 53 additions and 47 deletions

View File

@ -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

View File

@ -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

View File

@ -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; }

View File

@ -1375,25 +1375,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)
@ -1496,6 +1477,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
@ -1504,33 +1486,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))