From f41abbdb5cf5c67233f3d730885d43517969afda Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 26 Mar 2020 04:44:51 -0700 Subject: [PATCH] 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 Reviewed-by: Gabe Black Maintainer: Gabe Black --- SConstruct | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/SConstruct b/SConstruct index 8be1ced46..215c0b61d 100755 --- a/SConstruct +++ b/SConstruct @@ -401,27 +401,22 @@ if main['GCC']: 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 - # 4.9 and above. A version where everything works completely hasn't - # yet been identified. + # 4.9 to 8.1. # # 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 # selects what type of output the linker should generate. This is # necessary for incremental lto to work, but is also broken in - # current versions of gcc. It may not be necessary in future - # versions. We add it here since it might be, and as a reminder that - # it exists. It's excluded if lto is being forced. + # versions of gcc up to 8.1. # # https://gcc.gnu.org/gcc-6/changes.html # https://gcc.gnu.org/ml/gcc-patches/2015-11/msg03161.html # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69866 - if not GetOption('force_lto'): - main.Append(PSHLINKFLAGS='-flinker-output=rel') - main.Append(PLINKFLAGS='-flinker-output=rel') + main['BROKEN_INCREMENTAL_LTO'] = True disable_lto = GetOption('no_lto') if not disable_lto and main.get('BROKEN_INCREMENTAL_LTO', False) and \ -- 2.30.2