scons: Enable LTO and partial linking with gcc >= 8.1.

The bug(s) which prevented LTO and partial linking from working with gcc
have been fixed in my local version (9.3), and according to one of the
original bug reports:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69866

A fix was committed in gcc version 8.1.

The original code left in the SConstruct describing the problem with
versions greated than 6.0 also enabled an -flinker-output option and set
it to "rel". That option doesn't show up in the gcc 8.4 documentation
even though it was added in 6.0, but in the 9.3 documentation it
describes it and says that it defaults to "rel" when the -r (partial
linking) option is used.

This *should* mean that LTO and partial linking can be used together
with no issues after version 8.1, and at most by version 9.3. If someone
finds that that isn't true, then the range of bad versions can be
expanded.

Change-Id: Ie0529d077a0042ef55e2af995d01430d1695c031
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27131
Tested-by: Gem5 Cloud Project GCB service account <345032938727@cloudbuild.gserviceaccount.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2020-03-26 04:44:51 -07:00
committed by Gabe Black
parent 1c59559ddb
commit f41abbdb5c

View File

@@ -401,27 +401,22 @@ if main['GCC']:
main['GCC_VERSION'] = gcc_version main['GCC_VERSION'] = gcc_version
if compareVersions(gcc_version, '4.9') >= 0: if compareVersions(gcc_version, '4.9') >= 0 and \
compareVersions(gcc_version, '8.1') < 0:
# Incremental linking with LTO is currently broken in gcc versions # Incremental linking with LTO is currently broken in gcc versions
# 4.9 and above. A version where everything works completely hasn't # 4.9 to 8.1.
# yet been identified.
# #
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67548 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67548
main['BROKEN_INCREMENTAL_LTO'] = True #
if compareVersions(gcc_version, '6.0') >= 0:
# gcc versions 6.0 and greater accept an -flinker-output flag which # gcc versions 6.0 and greater accept an -flinker-output flag which
# selects what type of output the linker should generate. This is # selects what type of output the linker should generate. This is
# necessary for incremental lto to work, but is also broken in # necessary for incremental lto to work, but is also broken in
# current versions of gcc. It may not be necessary in future # versions of gcc up to 8.1.
# versions. We add it here since it might be, and as a reminder that
# it exists. It's excluded if lto is being forced.
# #
# https://gcc.gnu.org/gcc-6/changes.html # https://gcc.gnu.org/gcc-6/changes.html
# https://gcc.gnu.org/ml/gcc-patches/2015-11/msg03161.html # https://gcc.gnu.org/ml/gcc-patches/2015-11/msg03161.html
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69866 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69866
if not GetOption('force_lto'): main['BROKEN_INCREMENTAL_LTO'] = True
main.Append(PSHLINKFLAGS='-flinker-output=rel')
main.Append(PLINKFLAGS='-flinker-output=rel')
disable_lto = GetOption('no_lto') disable_lto = GetOption('no_lto')
if not disable_lto and main.get('BROKEN_INCREMENTAL_LTO', False) and \ if not disable_lto and main.get('BROKEN_INCREMENTAL_LTO', False) and \