diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2018-12-19 12:51:08 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2019-02-04 11:06:38 +0100 |
commit | 98f5f97d4a4206ecfb0754e1901d9c44a3287d82 (patch) | |
tree | 401d596779f69eec89f8748d5a196564ae012e35 | |
parent | aec51c7f99d6ad0028eebda0213a632b090f6fcf (diff) |
make --enable-ld the default for debug builds, if available
By default for clang this tries to use first lld and then gold,
for gcc it just tries gold.
https://lists.freedesktop.org/archives/libreoffice/2018-June/080437.html
https://lists.freedesktop.org/archives/libreoffice/2018-July/080484.html
Change-Id: I669a8fa7671553f0cf78ddf82c51364fcdb0891b
Reviewed-on: https://gerrit.libreoffice.org/65426
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
-rw-r--r-- | configure.ac | 174 |
1 files changed, 131 insertions, 43 deletions
diff --git a/configure.ac b/configure.ac index fff0cab68623..277b60de88c6 100644 --- a/configure.ac +++ b/configure.ac @@ -1357,7 +1357,8 @@ AC_ARG_ENABLE(icecream, AC_ARG_ENABLE(ld, AS_HELP_STRING([--enable-ld=<linker>], - [Use the specified linker. Both 'gold' and 'lld' linkers generally use less memory and link faster.]), + [Use the specified linker. Both 'gold' and 'lld' linkers generally use less memory and link faster. + By default tries to use the best linker possible, use --disable-ld to use the default linker.]), ,) libo_FUZZ_ARG_ENABLE(cups, @@ -3161,48 +3162,6 @@ else fi AC_SUBST(CROSS_COMPILING) -USE_LD= -if test -n "$enable_ld" -a "$enable_ld" != "no"; then - AC_MSG_CHECKING([for -fuse-ld=$enable_ld linker support]) - if test "$GCC" = "yes"; then - ldflags_save=$LDFLAGS - LDFLAGS="$LDFLAGS -fuse-ld=$enable_ld" - AC_LINK_IFELSE([AC_LANG_PROGRAM([ -#include <stdio.h> - ],[ -printf ("hello world\n"); - ])], USE_LD=$enable_ld, []) - if test -n "$USE_LD"; then - AC_MSG_RESULT( yes ) - LDFLAGS="$ldflags_save -fuse-ld=$enable_ld" - else - AC_MSG_ERROR( no ) - fi - else - AC_MSG_ERROR( not supported ) - fi -fi -AC_SUBST(USE_LD) - -HAVE_LD_BSYMBOLIC_FUNCTIONS= -if test "$GCC" = "yes"; then - AC_MSG_CHECKING([for -Bsymbolic-functions linker support]) - bsymbolic_functions_ldflags_save=$LDFLAGS - LDFLAGS="$LDFLAGS -Wl,-Bsymbolic-functions" - AC_LINK_IFELSE([AC_LANG_PROGRAM([ -#include <stdio.h> - ],[ -printf ("hello world\n"); - ])], HAVE_LD_BSYMBOLIC_FUNCTIONS=TRUE, []) - if test "$HAVE_LD_BSYMBOLIC_FUNCTIONS" = "TRUE"; then - AC_MSG_RESULT( found ) - else - AC_MSG_RESULT( not found ) - fi - LDFLAGS=$bsymbolic_functions_ldflags_save -fi -AC_SUBST(HAVE_LD_BSYMBOLIC_FUNCTIONS) - # Use -isystem (gcc) if possible, to avoid warnings in 3rd party headers. # NOTE: must _not_ be used for bundled external libraries! ISYSTEM= @@ -3869,6 +3828,135 @@ else fi AC_SUBST(ENABLE_DEBUG) +dnl =================================================================== +dnl Select the linker to use (gold/lld/ld.bfd). +dnl This is done only after compiler checks (need to know if Clang is +dnl used, for different defaults) and after checking if a debug build +dnl is wanted (non-debug builds get the default linker if not explictly +dnl specified otherwise). +dnl All checks for linker features/options should come after this. +dnl =================================================================== +check_use_ld() +{ + use_ld=$1 + use_ld_fail_if_error=$2 + use_ld_ok= + AC_MSG_CHECKING([for -fuse-ld=$use_ld linker support]) + use_ld_ldflags_save="$LDFLAGS" + LDFLAGS="$LDFLAGS -fuse-ld=$use_ld" + AC_LINK_IFELSE([AC_LANG_PROGRAM([ +#include <stdio.h> + ],[ +printf ("hello world\n"); + ])], USE_LD=$use_ld, []) + if test -n "$USE_LD"; then + AC_MSG_RESULT( yes ) + use_ld_ok=yes + dnl For obscure reasons, unxgcc.mk uses the --dynamic-list-cpp-typeinfo linker option + dnl if sanitizers are used, and lld doesn't support this option. + use_ld_has_sanitizers= + for i in $CC; do + case $i in + -fsanitize=*) + use_ld_has_sanitizers=yes + break + ;; + esac + done + if test -n "$use_ld_has_sanitizers"; then + AC_MSG_CHECKING([for --dynamic-list-cpp-typeinfo linker support (-fuse-ld=$use_ld)]) + use_ld_ldflags_save_2="$LDFLAGS" + LDFLAGS="$LDFLAGS -Wl,--dynamic-list-cpp-typeinfo" + use_ld_has_cpp_typeinfo= + AC_LINK_IFELSE([AC_LANG_PROGRAM([ +#include <stdio.h> + ],[ +printf ("hello world\n"); + ])], use_ld_has_cpp_typeinfo=yes, []) + LDFLAGS="$use_ld_ldflags_save_2" + if test -n "$use_ld_has_cpp_typeinfo"; then + AC_MSG_RESULT( yes ) + else + AC_MSG_RESULT( no ) + use_ld_ok= + fi + fi + else + if test -n "$use_ld_fail_if_error"; then + AC_MSG_ERROR( no ) + else + AC_MSG_RESULT( no ) + fi + fi + if test -n "$use_ld_ok"; then + dnl keep the value of LDFLAGS + return 0 + fi + LDFLAGS="$use_ld_ldflags_save" + return 1 +} +USE_LD= +if test "$enable_ld" != "no"; then + if test "$GCC" = "yes"; then + if test -n "$enable_ld"; then + check_use_ld "$enable_ld" fail_if_error + elif test -z "$ENABLE_DEBUG$ENABLE_DBGUTIL"; then + dnl non-debug builds default to the default linker + true + elif test -n "$COM_IS_CLANG"; then + check_use_ld lld + if test $? -ne 0; then + check_use_ld gold + fi + else + check_use_ld gold + fi + ld_output=$(echo 'int main() { return 0; }' | $CC -Wl,-v -x c - $CFLAGS $LDFLAGS 2>/dev/null) + ld_used=$(echo "$ld_output" | grep -E '(^GNU gold|^GNU ld|^LLD)') + if test -z "$ld_used"; then + ld_used="unknown" + fi + AC_MSG_CHECKING([for linker that is used]) + AC_MSG_RESULT([$ld_used]) + if test -n "$ENABLE_DEBUG$ENABLE_DBGUTIL"; then + if echo "$ld_used" | grep -q "^GNU ld"; then + if test -n "$COM_IS_CLANG"; then + AC_MSG_WARN([The default GNU linker is slow, consider using the LLD or the GNU gold linker.]) + add_warning "The default GNU linker is slow, consider using the LLD or the GNU gold linker." + else + AC_MSG_WARN([The default GNU linker is slow, consider using the GNU gold linker.]) + add_warning "The default GNU linker is slow, consider using the GNU gold linker." + fi + fi + fi + else + if test "$enable_ld" = "yes"; then + AC_MSG_ERROR([--enable-ld not supported]) + fi + fi +fi +AC_SUBST(USE_LD) + +HAVE_LD_BSYMBOLIC_FUNCTIONS= +if test "$GCC" = "yes"; then + AC_MSG_CHECKING([for -Bsymbolic-functions linker support]) + bsymbolic_functions_ldflags_save=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-Bsymbolic-functions" + AC_LINK_IFELSE([AC_LANG_PROGRAM([ +#include <stdio.h> + ],[ +printf ("hello world\n"); + ])], HAVE_LD_BSYMBOLIC_FUNCTIONS=TRUE, []) + if test "$HAVE_LD_BSYMBOLIC_FUNCTIONS" = "TRUE"; then + AC_MSG_RESULT( found ) + else + AC_MSG_RESULT( not found ) + fi + LDFLAGS=$bsymbolic_functions_ldflags_save +fi +AC_SUBST(HAVE_LD_BSYMBOLIC_FUNCTIONS) + + HAVE_GSPLIT_DWARF= if test "$enable_split_debug" != no; then dnl Currently by default enabled only on Linux, feel free to set test_split_debug above also for other platforms. |