Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-44340: Add support for building with clang full/thin lto #27231

Merged
merged 5 commits into from Jul 19, 2021
Merged
Changes from all commits
Commits
File filter
Filter file types
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.

Always

Just for now

@@ -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
@@ -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.
@@ -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,
@@ -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"
@@ -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'

This comment has been minimized.

@corona10

corona10 Jul 18, 2021
Author Member

If the Py_LTO_POLICY is the default, it will follow the default LTO option of compiler

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
This conversation was marked as resolved by gpshead

This comment has been minimized.

@corona10

corona10 Jul 18, 2021
Author Member

@holmanb
Should we check the full option also?
IMHO, -flto itself can be the alternative to the full option.

This comment has been minimized.

@holmanb

holmanb Jul 18, 2021

I don't have strong opinions on this. Assuming -flto when full is passed as an option is a sensible assumption, since full is the default lto policy on clang, and no other compilers that I'm aware of have multiple lto implementations.

It may lead to confusion in the future if, for example, clang changes default --flto policy to be thin, or if other compilers produce alternative lto implementations that have different naming schemes. That said, unless anyone else has stronger opinions, I'd say leave it as is.

This comment has been minimized.

@gpshead

gpshead Jul 18, 2021
Member

agreed.

then
AC_MSG_ERROR([thin lto is not supported under gcc compiler.])
fi
case $ac_sys_system in
Darwin*)
LTOFLAGS="-flto -Wl,-export_dynamic"