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

Richard Biener <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
On Thu, 20 Aug 2026, Jakub Jelinek wrote:

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

OK.

Thanks,
Richard.

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

-- 
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Abhinav Puri; (HRB 36809, AG Nuernberg)
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.