[PATCH] Fix up -fvar-tracking-uninit [PR126801]

Jakub Jelinek <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <aoasjo18jFrjYSk3@tucnak>
Hi!

The r12-4397 change to get rid of AUTODETECT_VALUE unfortunately broke
several things related to -fvar-tracking-uninit.
Before that change, the option defaulted to 0, under some condition
on darwin only set it to flag_var_tracking which at that point could have
been whatever user specified or AUTODETECT_VALUE and finally in
finish_options did:
  /* 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;
i.e.
1) -fvar-tracking-uninit option specified on command line implied
   -fvar-tracking
2) var-tracking was defaulted to 1 even for -O1 and above
3) in the darwin conditional case if flag_var_tracking_uninit was
   defaulted to maybe on, it was set to flag_var_tracking

The r12-4397 change properly handled only 2), by adding
default_options_table entry for OPT_fvar_tracking.
1) got lost in the patch, -fvar-tracking-uninit explicitly on command
   line no longer implies -fvar-tracking
3) was probably assumed to be always initialized to AUTODETECT_VALUE
   and so replaced with
  /* 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;
which effectively makes -fvar-tracking-uninit default to on whenever
-fvar-tracking is on (explicitly or implicitly), unless overridden by user.

Also note that the value of flag_var_tracking_uninit is irrelevant if
flag_var_tracking is off, the variable is only tested in various spots
in the var-tracking pass guarded by flag_var_tracking.

Anyway, the following patch restores the 1) behavior, changes the
darwin code to just set flag_var_tracking_uninit by default to 1 if
the condition is met (worst case flag_var_tracking_uninit will be 1
and flag_var_tracking will be 0, nothing will care), drops the bogus
defaulting to -fvar-tracking-uninit on all other targets and finally fixes
something that has been broken even before r12-4397, in my reading on
darwin the condition would turn on flag_var_tracking_uninit even if
user used explicit -fno-var-tracking-uninit.

Unfortunately the DW_OP_GNU_uninit support didn't come with a single
testcase, neither on the gcc side nor on the gdb side and I haven't figured
out easily a testcase which I could add to the testsuite for this (sure, I
could from some *.o that contains it cvise reduce it).
But one can actually see some DW_OP_GNU_uninit uses in the cc1plus binary,
before the patch:
readelf -wo cc1plus 2>&1 | grep DW_OP_GNU_uninit | wc -l
2228
readelf -wo cc1plus 2>&1 | grep DW_OP_GNU_uninit.*DW_OP_GNU_uninit | wc -l
208
after the patch:
readelf -wo cc1plus 2>&1 | grep DW_OP_GNU_uninit | wc -l
0

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2026-08-20  Jakub Jelinek  <[email protected]>

	PR debug/126801
	* opts.cc (finish_options): Don't set flag_var_tracking_uninit to
	flag_var_tracking by default.  Instead, set flag_var_tracking to
	flag_var_tracking_uninit if the latter was explicitly set.
	* config/darwin.cc (darwin_override_options): Only set
	flag_var_tracking_uninit if it wasn't explicitly set and set it to
	1 rather than flag_var_tracking.  Formatting fix.

--- gcc/opts.cc.jj	2026-08-18 08:47:22.044793076 +0200
+++ gcc/opts.cc	2026-08-19 12:28:11.107209028 +0200
@@ -1499,9 +1499,8 @@ finish_options (struct gcc_options *opts
       opts->x_flag_var_tracking_assignments = 0;
     }
 
-  /* One could use EnabledBy, but it would lead to a circular dependency.  */
-  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_uninit && opts->x_flag_var_tracking_uninit)
+    opts->x_flag_var_tracking = 1;
 
   if (!opts_set->x_flag_var_tracking_assignments)
     opts->x_flag_var_tracking_assignments
--- gcc/config/darwin.cc.jj	2026-08-17 10:00:21.681856778 +0200
+++ gcc/config/darwin.cc	2026-08-19 12:24:08.235382015 +0200
@@ -3576,12 +3576,13 @@ darwin_override_options (void)
       flag_asynchronous_unwind_tables = 0;
     }
 
-  if (flag_var_tracking_uninit == 0
+  if (!OPTION_SET_P (flag_var_tracking_uninit)
+      && flag_var_tracking_uninit == 0
       && generating_for_darwin_version >= 9
       && (flag_gtoggle ? (debug_info_level == DINFO_LEVEL_NONE)
-      : (debug_info_level >= DINFO_LEVEL_NORMAL))
+	  : (debug_info_level >= DINFO_LEVEL_NORMAL))
       && dwarf_debuginfo_p ())
-    flag_var_tracking_uninit = flag_var_tracking;
+    flag_var_tracking_uninit = 1;
 
   if (OPTION_SET_P (flag_pie) && flag_pie)
     {

	Jakub
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.