aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-05-10 11:44:40 +0200
committerRichard Biener <rguenther@suse.de>2022-05-10 13:03:57 +0200
commit76db543db88727789a6c117608a23edc2eace713 (patch)
treeb6277c024f84b898dd2bb08d67a6a560396c3ee6
parent1bac97ad0436afcbce24c82e6d57f11471cd8f10 (diff)
downloadgcc-76db543db88727789a6c117608a23edc2eace713.zip
gcc-76db543db88727789a6c117608a23edc2eace713.tar.gz
gcc-76db543db88727789a6c117608a23edc2eace713.tar.bz2
middle-end/105537 - debug processing
The following makes sure to have a consistent state of flag_var_tracking_assignments with the distributed handling in process_options and finish_options by moving everything to finish_options which also restores diagnostics for -g0 -fvar-tracking which was lost with previous changes. 2022-05-10 Richard Biener <rguenther@suse.de> PR middle-end/105537 * toplev.cc (process_options): Move flag_var_tracking handling ... * opts.cc (finish_options): ... here. * gcc.dg/torture/pr105537.c: New testcase.
-rw-r--r--gcc/opts.cc27
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr105537.c34
-rw-r--r--gcc/toplev.cc24
3 files changed, 57 insertions, 28 deletions
diff --git a/gcc/opts.cc b/gcc/opts.cc
index a0baec9..c9badd2 100644
--- a/gcc/opts.cc
+++ b/gcc/opts.cc
@@ -1333,10 +1333,29 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
&& !(opts->x_flag_selective_scheduling
|| opts->x_flag_selective_scheduling2));
- /* Note -fvar-tracking is enabled automatically with OPT_LEVELS_1_PLUS and
- so we need to drop it if we are called from optimize attribute. */
- if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
- opts->x_flag_var_tracking = false;
+ /* We know which debug output will be used so we can set flag_var_tracking
+ and flag_var_tracking_uninit if the user has not specified them. Note
+ we have not yet initialized debug_hooks so we might uselessly run
+ var-tracking on targets without var_location debug hook support. */
+ if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL
+ || !dwarf_debuginfo_p (opts))
+ {
+ if ((opts_set->x_flag_var_tracking && opts->x_flag_var_tracking == 1)
+ || (opts_set->x_flag_var_tracking_uninit
+ && opts->x_flag_var_tracking_uninit == 1))
+ {
+ if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL)
+ warning_at (UNKNOWN_LOCATION, 0,
+ "variable tracking requested, but useless unless "
+ "producing debug info");
+ else
+ warning_at (UNKNOWN_LOCATION, 0,
+ "variable tracking requested, but not supported "
+ "by this debug format");
+ }
+ opts->x_flag_var_tracking = 0;
+ opts->x_flag_var_tracking_uninit = 0;
+ }
/* One could use EnabledBy, but it would lead to a circular dependency. */
if (!opts_set->x_flag_var_tracking_uninit)
diff --git a/gcc/testsuite/gcc.dg/torture/pr105537.c b/gcc/testsuite/gcc.dg/torture/pr105537.c
new file mode 100644
index 0000000..2e4825c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr105537.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-ffast-math -fsignaling-nans -fvar-tracking-assignments -fno-move-loop-stores -ftree-loop-distribution" } */
+
+int n;
+
+double
+ext1 (int);
+
+void
+ext2 (double);
+
+int
+sum (int v1, int v2)
+{
+ return v1 + v2;
+}
+
+void
+bar (void)
+{
+ ext2 (ext1 (n));
+}
+
+__attribute__ ((optimize ("-O3"))) void
+foo (int *x)
+{
+ static int i;
+
+ bar ();
+ for (i = 0; i != 2; i = sum (i, 1))
+ n = *x = 0;
+}
+
+/* { dg-message "other options take precedence" "" { target *-*-* } 0 } */
diff --git a/gcc/toplev.cc b/gcc/toplev.cc
index ed546b2..055e064 100644
--- a/gcc/toplev.cc
+++ b/gcc/toplev.cc
@@ -1458,30 +1458,6 @@ process_options (bool no_backend)
debug_type_names[debug_set_to_format (write_symbols)]);
}
- /* We know which debug output will be used so we can set flag_var_tracking
- and flag_var_tracking_uninit if the user has not specified them. */
- if (debug_info_level < DINFO_LEVEL_NORMAL
- || !dwarf_debuginfo_p ()
- || debug_hooks->var_location == do_nothing_debug_hooks.var_location)
- {
- 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,
- "variable tracking requested, but useless unless "
- "producing debug info");
- else
- warning_at (UNKNOWN_LOCATION, 0,
- "variable tracking requested, but not supported "
- "by this debug format");
- }
- 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
gives a simple and stable API for all the information we need to
dump. */