summaryrefslogtreecommitdiffstats
path: root/Modules/Compiler
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2017-03-31 14:37:56 (GMT)
committerKitware Robot <kwrobot@kitware.com>2017-03-31 14:38:08 (GMT)
commit8772fc81c4ab745eb5abbae58c6a69706f610429 (patch)
treecf974aec17ed5a474680b488d1effbf137a7db5e /Modules/Compiler
parent60dde287e71efbad71b107902991098a6c77556d (diff)
parentdfa8263f4be4f1413b73c81649fdc4567a71e56a (diff)
downloadCMake-8772fc81c4ab745eb5abbae58c6a69706f610429.zip
CMake-8772fc81c4ab745eb5abbae58c6a69706f610429.tar.gz
CMake-8772fc81c4ab745eb5abbae58c6a69706f610429.tar.bz2
Merge topic 'ipo-policy-CMP0069'
dfa8263f Implement interprocedural optimization for GNU compilers 1588a577 Add policy CMP0069 to enforce INTERPROCEDURAL_OPTIMIZATION a7575700 Refactoring: s,GetFeatureAsBool,IsIPOEnabled, e05835c3 CheckIPOSupported: Visual Studio and Xcode generators do not support IPO Acked-by: Kitware Robot <kwrobot@kitware.com> Reviewed-by: Brad King <brad.king@kitware.com> Reviewed-by: Nils Gladitz <nilsgladitz@gmail.com> Merge-request: !568
Diffstat (limited to 'Modules/Compiler')
-rw-r--r--Modules/Compiler/Clang.cmake8
-rw-r--r--Modules/Compiler/GNU.cmake39
-rw-r--r--Modules/Compiler/QCC.cmake8
3 files changed, 55 insertions, 0 deletions
diff --git a/Modules/Compiler/Clang.cmake b/Modules/Compiler/Clang.cmake
index 96263fc..6b99a08 100644
--- a/Modules/Compiler/Clang.cmake
+++ b/Modules/Compiler/Clang.cmake
@@ -27,5 +27,13 @@ else()
set(CMAKE_${lang}_COMPILE_OPTIONS_TARGET "--target=")
set(CMAKE_${lang}_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN "--gcc-toolchain=")
endif()
+
+ set(_CMAKE_IPO_SUPPORTED_BY_CMAKE NO)
+ set(_CMAKE_IPO_MAY_BE_SUPPORTED_BY_COMPILER NO)
+
+ unset(CMAKE_${lang}_COMPILE_OPTIONS_IPO)
+ unset(CMAKE_${lang}_ARCHIVE_CREATE_IPO)
+ unset(CMAKE_${lang}_ARCHIVE_APPEND_IPO)
+ unset(CMAKE_${lang}_ARCHIVE_FINISH_IPO)
endmacro()
endif()
diff --git a/Modules/Compiler/GNU.cmake b/Modules/Compiler/GNU.cmake
index b67002c..4b1c598 100644
--- a/Modules/Compiler/GNU.cmake
+++ b/Modules/Compiler/GNU.cmake
@@ -45,4 +45,43 @@ macro(__compiler_gnu lang)
if(NOT APPLE OR NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4) # work around #4462
set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-isystem ")
endif()
+
+ set(_CMAKE_IPO_SUPPORTED_BY_CMAKE YES)
+ set(_CMAKE_IPO_MAY_BE_SUPPORTED_BY_COMPILER NO)
+
+ # '-flto' introduced since GCC 4.5:
+ # * https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Option-Summary.html (no)
+ # * https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Option-Summary.html (yes)
+ if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.5)
+ set(_CMAKE_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES)
+ set(__lto_flags -flto)
+
+ if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7)
+ # '-ffat-lto-objects' introduced since GCC 4.7:
+ # * https://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/Option-Summary.html (no)
+ # * https://gcc.gnu.org/onlinedocs/gcc-4.7.4/gcc/Option-Summary.html (yes)
+ list(APPEND __lto_flags -fno-fat-lto-objects)
+ endif()
+
+ set(CMAKE_${lang}_COMPILE_OPTIONS_IPO ${__lto_flags})
+
+ # Need to use version of 'ar'/'ranlib' with plugin support.
+ # Quote from [documentation][1]:
+ #
+ # To create static libraries suitable for LTO,
+ # use gcc-ar and gcc-ranlib instead of ar and ranlib
+ #
+ # [1]: https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Optimize-Options.html
+ set(CMAKE_${lang}_ARCHIVE_CREATE_IPO
+ "${CMAKE_GCC_AR} cr <TARGET> <LINK_FLAGS> <OBJECTS>"
+ )
+
+ set(CMAKE_${lang}_ARCHIVE_APPEND_IPO
+ "${CMAKE_GCC_AR} r <TARGET> <LINK_FLAGS> <OBJECTS>"
+ )
+
+ set(CMAKE_${lang}_ARCHIVE_FINISH_IPO
+ "${CMAKE_GCC_RANLIB} <TARGET>"
+ )
+ endif()
endmacro()
diff --git a/Modules/Compiler/QCC.cmake b/Modules/Compiler/QCC.cmake
index 2d7e881..695a138 100644
--- a/Modules/Compiler/QCC.cmake
+++ b/Modules/Compiler/QCC.cmake
@@ -12,4 +12,12 @@ macro(__compiler_qcc lang)
set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-Wp,-isystem,")
set(CMAKE_DEPFILE_FLAGS_${lang} "-Wc,-MD,<DEPFILE>,-MT,<OBJECT>,-MF,<DEPFILE>")
+
+ set(_CMAKE_IPO_SUPPORTED_BY_CMAKE NO)
+ set(_CMAKE_IPO_MAY_BE_SUPPORTED_BY_COMPILER NO)
+
+ unset(CMAKE_${lang}_COMPILE_OPTIONS_IPO)
+ unset(CMAKE_${lang}_ARCHIVE_CREATE_IPO)
+ unset(CMAKE_${lang}_ARCHIVE_APPEND_IPO)
+ unset(CMAKE_${lang}_ARCHIVE_FINISH_IPO)
endmacro()