diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst index cd5540320c4..ec57c880ee7 100644 --- a/Doc/using/configure.rst +++ b/Doc/using/configure.rst @@ -232,6 +232,9 @@ also be used to improve performance. .. versionadded:: 3.11 To use ThinLTO feature, use ``--with-lto=thin`` on Clang. + .. versionchanged:: 3.12 + Use ThinLTO as the default optimization policy on Clang if the compiler accepts the flag. + .. cmdoption:: --enable-bolt Enable usage of the `BOLT post-link binary optimizer diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst index 90355a73f08..7c7a196fcc1 100644 --- a/Doc/whatsnew/3.12.rst +++ b/Doc/whatsnew/3.12.rst @@ -453,6 +453,10 @@ Build Changes ``va_start()`` is no longer called with a single parameter. (Contributed by Kumar Aditya in :gh:`93207`.) +* CPython now uses the ThinLTO option as the default link time optimization policy + if the Clang compiler accepts the flag. + (Contributed by Dong-hee Na in :gh:`89536`.) + C API Changes ============= diff --git a/Misc/NEWS.d/next/Build/2022-09-12-18-34-51.gh-issue-85936.tX4VCU.rst b/Misc/NEWS.d/next/Build/2022-09-12-18-34-51.gh-issue-85936.tX4VCU.rst new file mode 100644 index 00000000000..302b863a3b1 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-09-12-18-34-51.gh-issue-85936.tX4VCU.rst @@ -0,0 +1,2 @@ +CPython now uses the ThinLTO option as the default policy if the Clang +compiler accepts the flag. Patch by Dong-hee Na. diff --git a/configure b/configure index b2024bab2fb..08ec2161cba 100755 --- a/configure +++ b/configure @@ -7837,8 +7837,49 @@ $as_echo "$as_me: llvm-ar found via xcrun: ${LLVM_AR}" >&6;} # Any changes made here should be reflected in the GCC+Darwin case below if test $Py_LTO_POLICY = default then - LTOFLAGS="-flto -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto" - LTOCFLAGS="-flto" + # Check that ThinLTO is accepted. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -flto=thin" >&5 +$as_echo_n "checking whether C compiler accepts -flto=thin... " >&6; } +if ${ax_cv_check_cflags___flto_thin+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -flto=thin" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___flto_thin=yes +else + ax_cv_check_cflags___flto_thin=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___flto_thin" >&5 +$as_echo "$ax_cv_check_cflags___flto_thin" >&6; } +if test "x$ax_cv_check_cflags___flto_thin" = xyes; then : + + LTOFLAGS="-flto=thin -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto" + LTOCFLAGS="-flto=thin" + +else + + LTOFLAGS="-flto -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto" + LTOCFLAGS="-flto" + + +fi + else LTOFLAGS="-flto=${Py_LTO_POLICY} -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto" LTOCFLAGS="-flto=${Py_LTO_POLICY}" @@ -7847,7 +7888,42 @@ $as_echo "$as_me: llvm-ar found via xcrun: ${LLVM_AR}" >&6;} *) if test $Py_LTO_POLICY = default then - LTOFLAGS="-flto" + # Check that ThinLTO is accepted + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -flto=thin" >&5 +$as_echo_n "checking whether C compiler accepts -flto=thin... " >&6; } +if ${ax_cv_check_cflags___flto_thin+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -flto=thin" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___flto_thin=yes +else + ax_cv_check_cflags___flto_thin=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___flto_thin" >&5 +$as_echo "$ax_cv_check_cflags___flto_thin" >&6; } +if test "x$ax_cv_check_cflags___flto_thin" = xyes; then : + LTOFLAGS="-flto=thin" +else + LTOFLAGS="-flto" +fi + else LTOFLAGS="-flto=${Py_LTO_POLICY}" fi diff --git a/configure.ac b/configure.ac index a61adcc817e..7d2e83cac81 100644 --- a/configure.ac +++ b/configure.ac @@ -1863,8 +1863,15 @@ if test "$Py_LTO" = 'true' ; then # Any changes made here should be reflected in the GCC+Darwin case below if test $Py_LTO_POLICY = default then - LTOFLAGS="-flto -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto" - LTOCFLAGS="-flto" + # Check that ThinLTO is accepted. + AX_CHECK_COMPILE_FLAG([-flto=thin],[ + LTOFLAGS="-flto=thin -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto" + LTOCFLAGS="-flto=thin" + ],[ + LTOFLAGS="-flto -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto" + LTOCFLAGS="-flto" + ] + ) else LTOFLAGS="-flto=${Py_LTO_POLICY} -Wl,-export_dynamic -Wl,-object_path_lto,\"\$@\".lto" LTOCFLAGS="-flto=${Py_LTO_POLICY}" @@ -1873,7 +1880,8 @@ if test "$Py_LTO" = 'true' ; then *) if test $Py_LTO_POLICY = default then - LTOFLAGS="-flto" + # Check that ThinLTO is accepted + AX_CHECK_COMPILE_FLAG([-flto=thin],[LTOFLAGS="-flto=thin"],[LTOFLAGS="-flto"]) else LTOFLAGS="-flto=${Py_LTO_POLICY}" fi