From 65fc11a49ec939261ca9a3dbfa534a9c3354825e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 8 Jun 2014 16:13:17 +0200 Subject: Add ENABLE_LTO cmake option Tested with GCC and clang; unlikely to work with other toolchains, so it's disabled by default. --- cmake/CMakeFindBinUtils.cmake | 8 +++++--- cmake/checks.cmake | 15 +++++++++++++++ cmake/config.cmake | 2 ++ src/CMakeLists.txt | 4 ++-- src/crypto/mac/ghash/pclmulqdq/CMakeLists.txt | 2 +- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/cmake/CMakeFindBinUtils.cmake b/cmake/CMakeFindBinUtils.cmake index 83d1a4e..753577a 100644 --- a/cmake/CMakeFindBinUtils.cmake +++ b/cmake/CMakeFindBinUtils.cmake @@ -1,5 +1,7 @@ -find_program(CMAKE_AR NAMES ${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) -find_program(CMAKE_NM NAMES ${_CMAKE_TOOLCHAIN_PREFIX}gcc-nm HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) -find_program(CMAKE_RANLIB NAMES ${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) +if(CMAKE_COMPILER_IS_GNUCC) + find_program(CMAKE_AR NAMES ${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_NM NAMES ${_CMAKE_TOOLCHAIN_PREFIX}gcc-nm HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) + find_program(CMAKE_RANLIB NAMES ${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib HINTS ${_CMAKE_TOOLCHAIN_LOCATION}) +endif(CMAKE_COMPILER_IS_GNUCC) include(${CMAKE_ROOT}/Modules/CMakeFindBinUtils.cmake) diff --git a/cmake/checks.cmake b/cmake/checks.cmake index 225c443..62d10d0 100644 --- a/cmake/checks.cmake +++ b/cmake/checks.cmake @@ -9,6 +9,21 @@ if(ARCH_X86 OR ARCH_X86_64) check_c_compiler_flag("-mpclmul" HAVE_PCLMUL) endif(ARCH_X86 OR ARCH_X86_64) + + +if(ENABLE_LTO) + set(CFLAGS_LTO "-flto") + set(CFLAGS_NO_LTO "-fno-lto") + + check_c_compiler_flag("-fwhole-program" HAVE_FLAG_WHOLE_PROGRAM) + if(HAVE_FLAG_WHOLE_PROGRAM) + set(LDFLAGS_LTO "-flto -fwhole-program") + else(HAVE_FLAG_WHOLE_PROGRAM) + set(LDFLAGS_LTO "-flto") + endif(HAVE_FLAG_WHOLE_PROGRAM) +endif(ENABLE_LTO) + + check_c_source_compiles(" #include #include diff --git a/cmake/config.cmake b/cmake/config.cmake index e08955e..e77abc8 100644 --- a/cmake/config.cmake +++ b/cmake/config.cmake @@ -23,6 +23,8 @@ set(WITH_CAPABILITIES ${LINUX} CACHE BOOL "Include support for POSIX capabilitie set(ENABLE_LIBSODIUM TRUE CACHE BOOL "Use libsodium instead of NaCl") set(ENABLE_OPENSSL FALSE CACHE BOOL "Enable crypto implementations using OpenSSL") +set(ENABLE_LTO FALSE CACHE BOOL "Enable link-time optimization") + if(LINUX) set(ENABLE_SYSTEMD TRUE CACHE BOOL "Enable systemd support") endif(LINUX) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9802883..792d9cb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,5 @@ set_directory_properties(PROPERTIES COMPILE_DEFINITIONS _GNU_SOURCE) -set(FASTD_CFLAGS "-pthread -std=c99 ${UECC_CFLAGS_OTHER} ${NACL_CFLAGS_OTHER} ${OPENSSL_CRYPTO_CFLAGS_OTHER} -Wall") +set(FASTD_CFLAGS "-pthread -std=c99 ${UECC_CFLAGS_OTHER} ${NACL_CFLAGS_OTHER} ${OPENSSL_CRYPTO_CFLAGS_OTHER} ${CFLAGS_LTO} -Wall") include_directories(${FASTD_SOURCE_DIR} ${FASTD_BINARY_DIR}/src) link_directories(${UECC_LIBRARY_DIRS} ${NACL_LIBRARY_DIRS} ${OPENSSL_CRYPTO_LIBRARY_DIRS}) @@ -43,7 +43,7 @@ add_executable(fastd ${BISON_fastd_config_parse_OUTPUTS} ) set_property(TARGET fastd PROPERTY COMPILE_FLAGS "${FASTD_CFLAGS}") -set_property(TARGET fastd PROPERTY LINK_FLAGS "-pthread ${UECC_LDFLAGS_OTHER} ${NACL_LDFLAGS_OTHER} ${OPENSSL_CRYPTO_LDFLAGS_OTHER}") +set_property(TARGET fastd PROPERTY LINK_FLAGS "-pthread ${UECC_LDFLAGS_OTHER} ${NACL_LDFLAGS_OTHER} ${OPENSSL_CRYPTO_LDFLAGS_OTHER} ${LDFLAGS_LTO}") set_property(TARGET fastd APPEND PROPERTY INCLUDE_DIRECTORIES ${CAP_INCLUDE_DIR} ${NACL_INCLUDE_DIRS}) target_link_libraries(fastd protocols methods ciphers macs ${RT_LIBRARY} ${CAP_LIBRARY} ${UECC_LIBRARIES} ${NACL_LIBRARIES} ${OPENSSL_CRYPTO_LIBRARIES}) diff --git a/src/crypto/mac/ghash/pclmulqdq/CMakeLists.txt b/src/crypto/mac/ghash/pclmulqdq/CMakeLists.txt index f96f680..f3b407e 100644 --- a/src/crypto/mac/ghash/pclmulqdq/CMakeLists.txt +++ b/src/crypto/mac/ghash/pclmulqdq/CMakeLists.txt @@ -3,7 +3,7 @@ if(ARCH_X86 OR ARCH_X86_64) ghash_pclmulqdq.c ghash_pclmulqdq_impl.c ) - fastd_mac_impl_compile_flags(ghash pclmulqdq ghash_pclmulqdq_impl.c "-mssse3 -mpclmul") + fastd_mac_impl_compile_flags(ghash pclmulqdq ghash_pclmulqdq_impl.c "-mssse3 -mpclmul ${CFLAGS_NO_LTO}") if(WITH_MAC_GHASH_PCLMULQDQ AND NOT HAVE_PCLMUL) message(FATAL_ERROR "WITH_MAC_GHASH_PCLMULQDQ enabled, but there is no compiler support for -mpclmul") -- cgit v1.2.3