build: fix building with LTO

Building with link-time optimization requires some tricks explained
in [1].

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48200#c28
This commit is contained in:
Beniamino Galvani 2019-02-02 15:57:01 +01:00
parent b114b00f0a
commit e6cf4213a7
3 changed files with 13 additions and 4 deletions

View file

@ -150,9 +150,9 @@ fi
AC_DEFUN([NM_LTO],
[AC_ARG_ENABLE(lto, AS_HELP_STRING([--enable-lto], [Enable Link Time Optimization for smaller size (default: no)]))
if (test "${enable_lto}" = "yes"); then
CC_CHECK_FLAG_APPEND([lto_flags], [CFLAGS], [-flto])
CC_CHECK_FLAG_APPEND([lto_flags], [CFLAGS], [-flto -flto-partition=none])
if (test -n "${lto_flags}"); then
CFLAGS="-flto $CFLAGS"
CFLAGS="-flto -flto-partition=none $CFLAGS"
else
AC_MSG_ERROR([Link Time Optimization -flto is not supported.])
fi

View file

@ -147,6 +147,15 @@ if enable_ld_gc
common_ldflags += test_ldflags
endif
enable_lto = get_option('b_lto')
if enable_lto
# meson already adds '-flto'
lto_flag = '-flto-partition=none'
assert(cc.has_argument(lto_flag), '-flto-partition=none not supported. Disable link-time optimization with -Db_lto=false.')
common_flags += lto_flag
common_ldflags += lto_flag
endif
if nm_debug
common_flags += cc.get_supported_arguments([
'-fno-strict-aliasing',
@ -986,7 +995,7 @@ if enable_valgrind
endif
output += '\n'
output += ' code coverage: ' + get_option('b_coverage').to_string() + '\n'
output += ' LTO: ' + get_option('b_lto').to_string() + '\n'
output += ' LTO: ' + enable_lto.to_string() + '\n'
output += ' Linker garbage collection: ' + enable_ld_gc.to_string() + '\n'
output += ' JSON validation for libnm: ' + enable_json_validation.to_string() + '\n'
output += ' crypto: ' + crypto + ' (have-gnutls: ' + crypto_gnutls_dep.found().to_string() + ', have-nss: ' + crypto_nss_dep.found().to_string() + ')\n'

View file

@ -1245,7 +1245,7 @@ fcn_name (lookup_type val) \
#define _NM_BACKPORT_SYMBOL_IMPL(version, return_type, orig_func, versioned_func, args_typed, args) \
return_type versioned_func args_typed; \
return_type versioned_func args_typed \
__attribute__ ((externally_visible)) return_type versioned_func args_typed \
{ \
return orig_func args; \
} \