diff options
author | Christian Fetzer <fetzer.ch@gmail.com> | 2016-06-06 08:32:50 +0200 |
---|---|---|
committer | Christian Fetzer <fetzer.ch@gmail.com> | 2016-07-07 19:56:57 +0200 |
commit | 130d154afdc13101f7265356086beedbdaeb8e7f (patch) | |
tree | b1bf1dd1d1f194b3aea185686cdc77bce3152161 /project/cmake | |
parent | 706c33445433be1bcff141e2fa1162be5e24853d (diff) |
[cmake] Increase link performance (GOLD, DebugFission)
Increase the link performance with GCC by
- defaulting to GNU Gold Linker if available
- defaulting to Debug Fission if available (https://gcc.gnu.org/wiki/DebugFission)
Some measurements on Ubuntu Xenial (GNU GCC 5.3.1, Binutils 2.26)
with incremental linking (touch xbmc/FileItem.cpp) of a debug build:
- GNU ld: 16.5s
- GNU gold: 6.5s
Diffstat (limited to 'project/cmake')
-rw-r--r-- | project/cmake/modules/LDGOLD.cmake | 45 | ||||
-rw-r--r-- | project/cmake/scripts/linux/ArchSetup.cmake | 1 |
2 files changed, 46 insertions, 0 deletions
diff --git a/project/cmake/modules/LDGOLD.cmake b/project/cmake/modules/LDGOLD.cmake new file mode 100644 index 0000000000..ad19c6b349 --- /dev/null +++ b/project/cmake/modules/LDGOLD.cmake @@ -0,0 +1,45 @@ +option(ENABLE_LDGOLD "Use GNU gold linker" ON) + +set(LDGOLD_FOUND FALSE) +if(ENABLE_LDGOLD) + execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE LD_VERSION) + if(LD_VERSION MATCHES "GNU gold") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold") + set(LDGOLD_FOUND TRUE) + message(STATUS "Linker: GNU gold") + else() + message(WARNING "GNU gold linker is not available, falling back to default system linker") + endif() +else() + message(STATUS "Linker: Default system linker") +endif() + +set(DEFAULT_ENABLE_DEBUGFISSION FALSE) +if(CMAKE_BUILD_TYPE STREQUAL Debug OR + CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo AND + LDGOLD_FOUND) + set(DEFAULT_ENABLE_DEBUGFISSION TRUE) +endif() + +include(CMakeDependentOption) +cmake_dependent_option(ENABLE_DEBUGFISSION "Enable Debug Fission support" ON + "DEFAULT_ENABLE_DEBUGFISSION" OFF) + +set(DEBUGFISSION_FOUND FALSE) +if(ENABLE_DEBUGFISSION) + include(TestCXXAcceptsFlag) + check_cxx_accepts_flag(-gsplit-dwarf CXX_ACCEPTS_GSPLIT_DWARF) + if(CXX_ACCEPTS_GSPLIT_DWARF) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -gsplit-dwarf") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -gsplit-dwarf") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gdb-index") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gdb-index") + set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gdb-index") + set(DEBUGFISSION_FOUND TRUE) + message(STATUS "Debug Fission enabled") + else() + message(WARNING "Debug Fission is not available") + endif() +endif() diff --git a/project/cmake/scripts/linux/ArchSetup.cmake b/project/cmake/scripts/linux/ArchSetup.cmake index 1e4e88b69b..e2adf5bb3b 100644 --- a/project/cmake/scripts/linux/ArchSetup.cmake +++ b/project/cmake/scripts/linux/ArchSetup.cmake @@ -16,6 +16,7 @@ else() endif() find_package(CXX11 REQUIRED) +include(LDGOLD) if(ENABLE_LIRC) set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use") |