diff -r 7096bb13720d -r e47a0faa1ad0 SConstruct --- a/SConstruct Thu Sep 13 10:37:45 2012 +0100 +++ b/SConstruct Thu Sep 13 10:38:06 2012 +0100 @@ -165,6 +165,8 @@ help='Override which build_opts file to use for defaults') AddLocalOption('--ignore-style', dest='ignore_style', action='store_true', help='Disable style checking hooks') +AddLocalOption('--no-lto', dest='no_lto', action='store_true', + help='Disable Link-Time Optimization for fast') AddLocalOption('--update-ref', dest='update_ref', action='store_true', help='Update test reference outputs') AddLocalOption('--verbose', dest='verbose', action='store_true', @@ -477,6 +479,10 @@ main['SHCXXCOMSTR'] = Transform("SHCXX") Export('MakeAction') +# Initialize the Link-Time Optimization (LTO) flags +main['LTO_CCFLAGS'] = [] +main['LTO_LDFLAGS'] = [] + CXX_version = readCommand([main['CXX'],'--version'], exception=False) CXX_V = readCommand([main['CXX'],'-V'], exception=False) @@ -504,6 +510,21 @@ main.Append(CCFLAGS=['-fno-tree-vectorize']) if compareVersions(gcc_version, '4.6') >= 0: main.Append(CXXFLAGS=['-std=c++0x']) + # Add the appropriate Link-Time Optimization (LTO) flags + # unless LTO is explicitly turned off. Note that these flags + # are only used by the fast target. + if not GetOption('no_lto'): + # Pass the LTO flag when compiling to produce GIMPLE + # output, we merely create the flags here and only append + # them later/ + main['LTO_CCFLAGS'] = ['-flto=%d' % GetOption('num_jobs')] + + # Use the same amount of jobs for LTO as we are running + # scons with, we hardcode the use of the linker plugin + # which requires either gold or GNU ld >= 2.21 + main['LTO_LDFLAGS'] = ['-flto=%d' % GetOption('num_jobs'), + '-fuse-linker-plugin'] + elif main['ICC']: pass #Fix me... add warning flags once we clean up icc warnings elif main['SUNCC']: diff -r 7096bb13720d -r e47a0faa1ad0 src/SConscript --- a/src/SConscript Thu Sep 13 10:37:45 2012 +0100 +++ b/src/SConscript Thu Sep 13 10:38:06 2012 +0100 @@ -946,15 +946,26 @@ '-lprofiler', '-Wl,--as-needed']])) +# For Link Time Optimization, the optimisation flags used to compile +# individual files are decoupled from those used at link time +# (i.e. you can compile with -O3 and perform LTO with -O0), so we need +# to also update the linker flags based on the target. if env['GCC']: if sys.platform == 'sunos5': ccflags['debug'] += ['-gstabs+'] else: ccflags['debug'] += ['-ggdb3'] ldflags['debug'] += ['-O0'] - # opt, fast, prof and perf all share the same cc flags + # opt, fast, prof and perf all share the same cc flags, also add + # the optimization to the ldflags as LTO defers the optimization + # to link time for target in ['opt', 'fast', 'prof', 'perf']: ccflags[target] += ['-O3'] + ldflags[target] += ['-O3'] + + ccflags['fast'] += env['LTO_CCFLAGS'] + ldflags['fast'] += env['LTO_LDFLAGS'] + elif env['SUNCC']: ccflags['debug'] += ['-g0'] ccflags['opt'] += ['-O']