From b2cf2513f9184c850a69fab718532b4f7c6a003d Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Mon, 19 Jul 2021 19:52:56 +0900 Subject: [PATCH] bpo-44340: Add support for building with clang full/thin lto (GH-27231) --- Doc/using/configure.rst | 5 +- .../2021-07-19-01-09-56.bpo-44340.JNeOf4.rst | 2 + aclocal.m4 | 4 +- configure | 72 ++++++++++++++----- configure.ac | 57 +++++++++++---- 5 files changed, 107 insertions(+), 33 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2021-07-19-01-09-56.bpo-44340.JNeOf4.rst diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index b1d1623a38c..a545d5a9372 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -171,7 +171,7 @@ recommended for best performance. .. versionadded:: 3.8 -.. cmdoption:: --with-lto +.. cmdoption:: --with-lto=[full|thin|no|yes] Enable Link Time Optimization (LTO) in any build (disabled by default). @@ -180,6 +180,9 @@ recommended for best performance. .. versionadded:: 3.6 + .. versionadded:: 3.11 + To use ThinLTO feature, use ``--with-lto=thin`` on Clang. + .. cmdoption:: --with-computed-gotos Enable computed gotos in evaluation loop (enabled by default on supported diff --git a/Misc/NEWS.d/next/Build/2021-07-19-01-09-56.bpo-44340.JNeOf4.rst b/Misc/NEWS.d/next/Build/2021-07-19-01-09-56.bpo-44340.JNeOf4.rst new file mode 100644 index 00000000000..cf19eb6052e --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-07-19-01-09-56.bpo-44340.JNeOf4.rst @@ -0,0 +1,2 @@ +Add support for building with clang thin lto via --with-lto=thin/full. Patch +by Dong-hee Na and Brett Holman. diff --git a/aclocal.m4 b/aclocal.m4 index 1133004b86a..987bfdf215c 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.16.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.3 -*- Autoconf -*- -# Copyright (C) 1996-2018 Free Software Foundation, Inc. +# Copyright (C) 1996-2020 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/configure b/configure index 1756d25d16f..050f1836011 100755 --- a/configure +++ b/configure @@ -1545,7 +1545,8 @@ Optional Packages: --with-trace-refs enable tracing references for debugging purpose (default is no) --with-assertions build with C assertions enabled (default is no) - --with-lto enable Link-Time-Optimization in any build (default + --with-lto=[full|thin|no|yes] + enable Link-Time-Optimization in any build (default is no) --with-hash-algorithm=[fnv|siphash24] select hash algorithm for use in Python/pyhash.c @@ -3039,27 +3040,27 @@ VERSION=3.11 SOVERSION=1.0 -# The later defininition of _XOPEN_SOURCE disables certain features +# The later definition of _XOPEN_SOURCE disables certain features # on Linux, so we need _GNU_SOURCE to re-enable them (makedev, tm_zone). $as_echo "#define _GNU_SOURCE 1" >>confdefs.h -# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables # certain features on NetBSD, so we need _NETBSD_SOURCE to re-enable # them. $as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h -# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables # certain features on FreeBSD, so we need __BSD_VISIBLE to re-enable # them. $as_echo "#define __BSD_VISIBLE 1" >>confdefs.h -# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# The later definition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables # certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable # them. @@ -6585,16 +6586,36 @@ $as_echo_n "checking for --with-lto... " >&6; } # Check whether --with-lto was given. if test "${with_lto+set}" = set; then : withval=$with_lto; -if test "$withval" != no -then - Py_LTO='true' - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; }; -else - Py_LTO='false' - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; }; -fi +case "$withval" in + full) + Py_LTO='true' + Py_LTO_POLICY='full' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + thin) + Py_LTO='true' + Py_LTO_POLICY='thin' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + yes) + Py_LTO='true' + Py_LTO_POLICY='default' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ;; + no) + Py_LTO='false' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + *) + Py_LTO='false' + as_fn_error $? "unknown lto option: '$withval'" "$LINENO" 5 + ;; +esac + else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } @@ -6732,15 +6753,30 @@ $as_echo "$as_me: llvm-ar found via xcrun: ${LLVM_AR}" >&6;} case $ac_sys_system in Darwin*) # Any changes made here should be reflected in the GCC+Darwin case below - LTOFLAGS="-flto -Wl,-export_dynamic" - LTOCFLAGS="-flto" + if test $Py_LTO_POLICY = default + then + LTOFLAGS="-flto -Wl,-export_dynamic" + LTOCFLAGS="-flto" + else + LTOFLAGS="-flto=${Py_LTO_POLICY} -Wl,-export_dynamic" + LTOCFLAGS="-flto=${Py_LTO_POLICY}" + fi ;; *) - LTOFLAGS="-flto" + if test $Py_LTO_POLICY = default + then + LTOFLAGS="-flto" + else + LTOFLAGS="-flto=${Py_LTO_POLICY}" + fi ;; esac ;; *gcc*) + if test $Py_LTO_POLICY = thin + then + as_fn_error $? "thin lto is not supported under gcc compiler." "$LINENO" 5 + fi case $ac_sys_system in Darwin*) LTOFLAGS="-flto -Wl,-export_dynamic" diff --git a/configure.ac b/configure.ac index 11dd84f12c6..aaff79f720e 100644 --- a/configure.ac +++ b/configure.ac @@ -1360,16 +1360,34 @@ fi # Enable LTO flags AC_MSG_CHECKING(for --with-lto) -AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto], [enable Link-Time-Optimization in any build (default is no)]), +AC_ARG_WITH(lto, AS_HELP_STRING([--with-lto=@<:@full|thin|no|yes@:>@], [enable Link-Time-Optimization in any build (default is no)]), [ -if test "$withval" != no -then - Py_LTO='true' - AC_MSG_RESULT(yes); -else - Py_LTO='false' - AC_MSG_RESULT(no); -fi], +case "$withval" in + full) + Py_LTO='true' + Py_LTO_POLICY='full' + AC_MSG_RESULT(yes) + ;; + thin) + Py_LTO='true' + Py_LTO_POLICY='thin' + AC_MSG_RESULT(yes) + ;; + yes) + Py_LTO='true' + Py_LTO_POLICY='default' + AC_MSG_RESULT(yes) + ;; + no) + Py_LTO='false' + AC_MSG_RESULT(no) + ;; + *) + Py_LTO='false' + AC_MSG_ERROR([unknown lto option: '$withval']) + ;; +esac +], [AC_MSG_RESULT(no)]) if test "$Py_LTO" = 'true' ; then case $CC in @@ -1405,15 +1423,30 @@ if test "$Py_LTO" = 'true' ; then case $ac_sys_system in Darwin*) # Any changes made here should be reflected in the GCC+Darwin case below - LTOFLAGS="-flto -Wl,-export_dynamic" - LTOCFLAGS="-flto" + if test $Py_LTO_POLICY = default + then + LTOFLAGS="-flto -Wl,-export_dynamic" + LTOCFLAGS="-flto" + else + LTOFLAGS="-flto=${Py_LTO_POLICY} -Wl,-export_dynamic" + LTOCFLAGS="-flto=${Py_LTO_POLICY}" + fi ;; *) - LTOFLAGS="-flto" + if test $Py_LTO_POLICY = default + then + LTOFLAGS="-flto" + else + LTOFLAGS="-flto=${Py_LTO_POLICY}" + fi ;; esac ;; *gcc*) + if test $Py_LTO_POLICY = thin + then + AC_MSG_ERROR([thin lto is not supported under gcc compiler.]) + fi case $ac_sys_system in Darwin*) LTOFLAGS="-flto -Wl,-export_dynamic"