Issue #26359: Add the --with-optimizations configure flag.

The flag will activate LTO and PGO build support when available.
Thanks to Alecsandur Patrascu of Intel for the original patch.
This commit is contained in:
Brett Cannon 2016-09-06 17:12:40 -07:00
parent 62ec3317d2
commit 63d98bcd4c
5 changed files with 108 additions and 17 deletions

View File

@ -796,6 +796,10 @@ Optimizations
Build and C API Changes Build and C API Changes
======================= =======================
* The ``--with-optimizations`` configure flag has been added. Turning it on
will activate LTO and PGO build support (when available).
(Original patch by Alecsandru Patrascu of Intel in :issue:`26539`.)
* New :c:func:`Py_FinalizeEx` API which indicates if flushing buffered data * New :c:func:`Py_FinalizeEx` API which indicates if flushing buffered data
failed (:issue:`5319`). failed (:issue:`5319`).

View File

@ -459,7 +459,7 @@ LIBRARY_OBJS= \
# Rules # Rules
# Default target # Default target
all: build_all all: @DEF_MAKE_ALL_RULE@
build_all: $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Programs/_testembed python-config build_all: $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Programs/_testembed python-config
# Compile a binary with profile guided optimization. # Compile a binary with profile guided optimization.
@ -483,7 +483,7 @@ profile-opt:
$(MAKE) profile-removal $(MAKE) profile-removal
build_all_generate_profile: build_all_generate_profile:
$(MAKE) all CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_GEN_FLAG) @LTOFLAGS@" LDFLAGS="$(LDFLAGS) $(PGO_PROF_GEN_FLAG) @LTOFLAGS@" LIBS="$(LIBS)" $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_GEN_FLAG) @LTOFLAGS@" LDFLAGS="$(LDFLAGS) $(PGO_PROF_GEN_FLAG) @LTOFLAGS@" LIBS="$(LIBS)"
run_profile_task: run_profile_task:
: # FIXME: can't run for a cross build : # FIXME: can't run for a cross build
@ -493,14 +493,14 @@ build_all_merge_profile:
$(LLVM_PROF_MERGER) $(LLVM_PROF_MERGER)
build_all_use_profile: build_all_use_profile:
$(MAKE) all CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_USE_FLAG) @LTOFLAGS@" LDFLAGS="$(LDFLAGS) @LTOFLAGS@" $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_USE_FLAG) @LTOFLAGS@" LDFLAGS="$(LDFLAGS) @LTOFLAGS@"
# Compile and run with gcov # Compile and run with gcov
.PHONY=coverage coverage-lcov coverage-report .PHONY=coverage coverage-lcov coverage-report
coverage: coverage:
@echo "Building with support for coverage checking:" @echo "Building with support for coverage checking:"
$(MAKE) clean profile-removal $(MAKE) clean profile-removal
$(MAKE) all CFLAGS="$(CFLAGS) -O0 -pg -fprofile-arcs -ftest-coverage" LIBS="$(LIBS) -lgcov" $(MAKE) @DEF_MAKE_RULE@ CFLAGS="$(CFLAGS) -O0 -pg -fprofile-arcs -ftest-coverage" LIBS="$(LIBS) -lgcov"
coverage-lcov: coverage-lcov:
@echo "Creating Coverage HTML report with LCOV:" @echo "Creating Coverage HTML report with LCOV:"

View File

@ -219,6 +219,9 @@ Tests
Build Build
----- -----
- Issue #26539: Add the --with-optimizations flag to turn on LTO and PGO build
support when available.
- Issue #27917: Set platform triplets for Android builds. - Issue #27917: Set platform triplets for Android builds.
- Issue #25825: Update references to the $(LIBPL) installation path on AIX. - Issue #25825: Update references to the $(LIBPL) installation path on AIX.

69
configure vendored
View File

@ -674,6 +674,8 @@ LLVM_PROF_MERGER
PGO_PROF_USE_FLAG PGO_PROF_USE_FLAG
PGO_PROF_GEN_FLAG PGO_PROF_GEN_FLAG
LTOFLAGS LTOFLAGS
DEF_MAKE_RULE
DEF_MAKE_ALL_RULE
ABIFLAGS ABIFLAGS
LN LN
MKDIR_P MKDIR_P
@ -775,7 +777,6 @@ infodir
docdir docdir
oldincludedir oldincludedir
includedir includedir
runstatedir
localstatedir localstatedir
sharedstatedir sharedstatedir
sysconfdir sysconfdir
@ -809,6 +810,7 @@ with_suffix
enable_shared enable_shared
enable_profiling enable_profiling
with_pydebug with_pydebug
with_optimizations
with_lto with_lto
with_hash_algorithm with_hash_algorithm
with_address_sanitizer with_address_sanitizer
@ -886,7 +888,6 @@ datadir='${datarootdir}'
sysconfdir='${prefix}/etc' sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com' sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var' localstatedir='${prefix}/var'
runstatedir='${localstatedir}/run'
includedir='${prefix}/include' includedir='${prefix}/include'
oldincludedir='/usr/include' oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@ -1139,15 +1140,6 @@ do
| -silent | --silent | --silen | --sile | --sil) | -silent | --silent | --silen | --sile | --sil)
silent=yes ;; silent=yes ;;
-runstatedir | --runstatedir | --runstatedi | --runstated \
| --runstate | --runstat | --runsta | --runst | --runs \
| --run | --ru | --r)
ac_prev=runstatedir ;;
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
| --run=* | --ru=* | --r=*)
runstatedir=$ac_optarg ;;
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;; ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@ -1285,7 +1277,7 @@ fi
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \ datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
libdir localedir mandir runstatedir libdir localedir mandir
do do
eval ac_val=\$$ac_var eval ac_val=\$$ac_var
# Remove trailing slashes. # Remove trailing slashes.
@ -1438,7 +1430,6 @@ Fine tuning of the installation directories:
--sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var] --localstatedir=DIR modifiable single-machine data [PREFIX/var]
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
--libdir=DIR object code libraries [EPREFIX/lib] --libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include] --includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include] --oldincludedir=DIR C header files for non-gcc [/usr/include]
@ -1501,6 +1492,8 @@ Optional Packages:
compiler compiler
--with-suffix=.exe set executable suffix --with-suffix=.exe set executable suffix
--with-pydebug build with Py_DEBUG defined --with-pydebug build with Py_DEBUG defined
--with-optimizations Enable all optimizations when available (LTO, PGO,
etc). Disabled by default.
--with-lto Enable Link Time Optimization in PGO builds. --with-lto Enable Link Time Optimization in PGO builds.
Disabled by default. Disabled by default.
--with-hash-algorithm=[fnv|siphash24] --with-hash-algorithm=[fnv|siphash24]
@ -6458,6 +6451,46 @@ $as_echo "no" >&6; }
fi fi
# Enable optimization flags
Py_OPT='false'
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-optimizations" >&5
$as_echo_n "checking for --with-optimizations... " >&6; }
# Check whether --with-optimizations was given.
if test "${with_optimizations+set}" = set; then :
withval=$with_optimizations;
if test "$withval" != no
then
Py_OPT='true'
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; };
else
Py_OPT='false'
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; };
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "$Py_OPT" = 'true' ; then
Py_LTO='true'
case $ac_sys_system in
Darwin*)
# At least on macOS El Capitan, LTO does not work with PGO.
Py_LTO='false'
;;
esac
DEF_MAKE_ALL_RULE="profile-opt"
DEF_MAKE_RULE="build_all"
else
DEF_MAKE_ALL_RULE="build_all"
DEF_MAKE_RULE="all"
fi
# Enable LTO flags # Enable LTO flags
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-lto" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-lto" >&5
@ -17581,3 +17614,13 @@ $SHELL $srcdir/Modules/makesetup -c $srcdir/Modules/config.c.in \
-s Modules Modules/Setup.config \ -s Modules Modules/Setup.config \
Modules/Setup.local Modules/Setup Modules/Setup.local Modules/Setup
mv config.c Modules mv config.c Modules
if test "$Py_OPT" = 'false' -a "$Py_DEBUG" != 'true'; then
echo "" >&6
echo "" >&6
echo "If you want a release build with all optimizations active (LTO, PGO, etc),"
echo "please run ./configure --with-optimizations" >&6
echo "" >&6
echo "" >&6
fi

View File

@ -1282,6 +1282,37 @@ else AC_MSG_RESULT(no); Py_DEBUG='false'
fi], fi],
[AC_MSG_RESULT(no)]) [AC_MSG_RESULT(no)])
# Enable optimization flags
AC_SUBST(DEF_MAKE_ALL_RULE)
AC_SUBST(DEF_MAKE_RULE)
Py_OPT='false'
AC_MSG_CHECKING(for --with-optimizations)
AC_ARG_WITH(optimizations, AS_HELP_STRING([--with-optimizations], [Enable all optimizations when available (LTO, PGO, etc). Disabled by default.]),
[
if test "$withval" != no
then
Py_OPT='true'
AC_MSG_RESULT(yes);
else
Py_OPT='false'
AC_MSG_RESULT(no);
fi],
[AC_MSG_RESULT(no)])
if test "$Py_OPT" = 'true' ; then
Py_LTO='true'
case $ac_sys_system in
Darwin*)
# At least on macOS El Capitan, LTO does not work with PGO.
Py_LTO='false'
;;
esac
DEF_MAKE_ALL_RULE="profile-opt"
DEF_MAKE_RULE="build_all"
else
DEF_MAKE_ALL_RULE="build_all"
DEF_MAKE_RULE="all"
fi
# Enable LTO flags # Enable LTO flags
AC_SUBST(LTOFLAGS) AC_SUBST(LTOFLAGS)
AC_MSG_CHECKING(for --with-lto) AC_MSG_CHECKING(for --with-lto)
@ -5337,3 +5368,13 @@ $SHELL $srcdir/Modules/makesetup -c $srcdir/Modules/config.c.in \
-s Modules Modules/Setup.config \ -s Modules Modules/Setup.config \
Modules/Setup.local Modules/Setup Modules/Setup.local Modules/Setup
mv config.c Modules mv config.c Modules
if test "$Py_OPT" = 'false' -a "$Py_DEBUG" != 'true'; then
echo "" >&AS_MESSAGE_FD
echo "" >&AS_MESSAGE_FD
echo "If you want a release build with all optimizations active (LTO, PGO, etc),"
echo "please run ./configure --with-optimizations" >&AS_MESSAGE_FD
echo "" >&AS_MESSAGE_FD
echo "" >&AS_MESSAGE_FD
fi