http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49743

           Summary: -g enables var_tracking on -O0 - causes long
                    compilations
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: ne...@intrepid.com
                CC: j...@suse.cz, g...@intrepid.com, phhargr...@lbl.gov
              Host: x86_64-apple-darwin10.8.0
            Target: x86_64-apple-darwin10.8.0


I have a test program written in UPC that takes a long time to compile on Mac
OS X. This is caused by the var_tracking code that I think is getting
erroneously enabled for no-optimization case - only "-g" option is used on a
command line.

When process_options (in toplevel.c) is called, flag_var_tracking has a value
of 2 which is AUTODETECT_VALUE, and is getting set based on the optimization
level:

1466   if (flag_var_tracking == AUTODETECT_VALUE)
1467     flag_var_tracking = optimize >= 1;

For x86_64 on Linux box this would set flag_var_tracking to 0.

However, for Darwin, "target_option.override" is used and
darwin_override_options() is called at the beginning of the
process_options() and this code is getting executed (darwin.c):

2929   if (flag_var_tracking
2930 && generating_for_darwin_version >= 9
2931 && (flag_gtoggle ? (debug_info_level == DINFO_LEVEL_NONE)
2932       : (debug_info_level >= DINFO_LEVEL_NORMAL))
2933 && write_symbols == DWARF2_DEBUG)
2934     flag_var_tracking_uninit = 1;

The above will set "flag_var_tracking_uninit" as all conditions are there:
flag_var_tracking == 2
generating_for_darwin_version == 10
debug_info_level >= DINFO_LEVEL_NORMAL
write_symbols == DWARF2_DEBUG

Once code returns to process_options:

1460   /* If the user specifically requested variable tracking with tagging
1461      uninitialized variables, we need to turn on variable tracking.
1462      (We already determined above that variable tracking is feasible.)  */
1463   if (flag_var_tracking_uninit)
1464     flag_var_tracking = 1;
1465
1466   if (flag_var_tracking == AUTODETECT_VALUE)
1467     flag_var_tracking = optimize >= 1;

flag_var_tracking is getting unconditionally set based debug level (not
optimization).

The net effect is that for Darwin, var_tracking is always enabled, even for the
optim level of 0.

If I specify "-g -fvar-tracking" on the Linux x86_64 box I also get long
compile times on my test. 

I think that var_tracking needs to be disabled on -O0.

Reply via email to