summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na@python.org>2022-09-16 10:40:05 (GMT)
committerGitHub <noreply@github.com>2022-09-16 10:40:05 (GMT)
commite47b96c44f7b48a1e95de24f38f6e3de879b4d61 (patch)
tree56cd8f495c33eccdf04681132d1d84009dd5434c
parent16c33a9676e2f3ef330d09f2ab515c56636fa09f (diff)
downloadcpython-e47b96c44f7b48a1e95de24f38f6e3de879b4d61.zip
cpython-e47b96c44f7b48a1e95de24f38f6e3de879b4d61.tar.gz
cpython-e47b96c44f7b48a1e95de24f38f6e3de879b4d61.tar.bz2
gh-89536: Use ThinLTO policy if possible (gh-96766)
-rw-r--r--Doc/using/configure.rst3
-rw-r--r--Doc/whatsnew/3.12.rst4
-rw-r--r--Misc/NEWS.d/next/Build/2022-09-12-18-34-51.gh-issue-85936.tX4VCU.rst2
-rwxr-xr-xconfigure82
-rw-r--r--configure.ac14
5 files changed, 99 insertions, 6 deletions
diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst
index cd55403..ec57c88 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 90355a7..7c7a196 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 0000000..302b863
--- /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 b2024ba..08ec216 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 a61adcc..7d2e83c 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