bpo-28015: Support LTO build with clang (GH-9908)

.o generated by clang in LTO mode actually are LLVM bitcode files, which
leads to a few errors during configure/build step:

- add lto flags to the BASECFLAGS instead of CFLAGS, as CFLAGS are used
  to build autoconf test case, and some are not compatible with clang LTO
  (they assume binary in the .o, not bitcode)
- force llvm-ar instead of ar, as ar is not aware of .o files generated
  by clang -flto
This commit is contained in:
serge-sans-paille 2018-10-25 01:54:22 +02:00 committed by Victor Stinner
parent 890423f796
commit 5ad36f9b21
4 changed files with 235 additions and 83 deletions

View file

@ -1265,6 +1265,26 @@ else
DEF_MAKE_RULE="all"
fi
# Make llvm-relatec checks work on systems where llvm tools are not installed with their
# normal names in the default $PATH (ie: Ubuntu). They exist under the
# non-suffixed name in their versioned llvm directory.
llvm_bin_dir=''
llvm_path="${PATH}"
if test "${CC}" = "clang"
then
clang_bin=`which clang`
# Some systems install clang elsewhere as a symlink to the real path
# which is where the related llvm tools are located.
if test -L "${clang_bin}"
then
clang_dir=`dirname "${clang_bin}"`
clang_bin=`readlink "${clang_bin}"`
llvm_bin_dir="${clang_dir}/"`dirname "${clang_bin}"`
llvm_path="${llvm_path}${PATH_SEPARATOR}${llvm_bin_dir}"
fi
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. Disabled by default.]),
@ -1281,6 +1301,33 @@ fi],
if test "$Py_LTO" = 'true' ; then
case $CC in
*clang*)
AC_SUBST(LLVM_AR)
AC_PATH_TARGET_TOOL(LLVM_AR, llvm-ar, '', ${llvm_path})
AC_SUBST(LLVM_AR_FOUND)
if test -n "${LLVM_AR}" -a -x "${LLVM_AR}"
then
LLVM_AR_FOUND="found"
else
LLVM_AR_FOUND="not-found"
fi
if test "$ac_sys_system" = "Darwin" -a "${LLVM_AR_FOUND}" = "not-found"
then
found_llvm_ar=`/usr/bin/xcrun -find llvm-ar 2>/dev/null`
if test -n "${found_llvm_ar}"
then
LLVM_AR='/usr/bin/xcrun llvm-ar'
LLVM_AR_FOUND=found
AC_MSG_NOTICE([llvm-ar found via xcrun: ${LLVM_AR}])
fi
fi
if test $LLVM_AR_FOUND = not-found
then
LLVM_PROFR_ERR=yes
AC_MSG_ERROR([llvm-ar is required for a --with-lto build with clang but could not be found.])
else
LLVM_AR_ERR=no
fi
AR="${LLVM_AR}"
case $ac_sys_system in
Darwin*)
# Any changes made here should be reflected in the GCC+Darwin case below
@ -1310,7 +1357,7 @@ if test "$Py_LTO" = 'true' ; then
LTOFLAGS="$LTOFLAGS -g"
fi
CFLAGS="$CFLAGS $LTOFLAGS"
BASECFLAGS="$BASECFLAGS $LTOFLAGS"
LDFLAGS="$LDFLAGS $LTOFLAGS"
fi
@ -1320,24 +1367,6 @@ AC_SUBST(PGO_PROF_USE_FLAG)
AC_SUBST(LLVM_PROF_MERGER)
AC_SUBST(LLVM_PROF_FILE)
AC_SUBST(LLVM_PROF_ERR)
# Make this work on systems where llvm tools are not installed with their
# normal names in the default $PATH (ie: Ubuntu). They exist under the
# non-suffixed name in their versioned llvm directory.
llvm_bin_dir=''
llvm_path="${PATH}"
if test "${CC}" = "clang"
then
clang_bin=`which clang`
# Some systems install clang elsewhere as a symlink to the real path
# which is where the related llvm tools are located.
if test -L "${clang_bin}"
then
clang_dir=`dirname "${clang_bin}"`
clang_bin=`readlink "${clang_bin}"`
llvm_bin_dir="${clang_dir}/"`dirname "${clang_bin}"`
llvm_path="${llvm_path}${PATH_SEPARATOR}${llvm_bin_dir}"
fi
fi
AC_SUBST(LLVM_PROFDATA)
AC_PATH_TARGET_TOOL(LLVM_PROFDATA, llvm-profdata, '', ${llvm_path})
AC_SUBST(LLVM_PROF_FOUND)