Merge pull request #403 from stilor/multilib-1

First chunk of multilib changes for merging
This commit is contained in:
Bryan Hundven 2016-06-17 18:02:59 -07:00 committed by GitHub
commit 6e7c61650a
16 changed files with 276 additions and 7 deletions

View File

@ -5,6 +5,7 @@
## select ARCH_USE_MMU
## select ARCH_SUPPORTS_BOTH_ENDIAN
## select ARCH_DEFAULT_LE
## select ARCH_REQUIRES_MULTILIB
##
## help The Super-H architecture, as defined by:
## help http://www.renesas.com/fmwk.jsp?cnt=superh_family_landing.jsp&fp=/products/mpumcu/superh_family/

View File

@ -37,6 +37,16 @@ config CC_GCC_EXTRA_CONFIG_ARRAY
if they are properly quoted (or escaped, but prefer quotes). Eg.:
--with-foo="1st arg with 4 spaces" --with-bar=2nd-arg-without-space
config CC_GCC_MULTILIB_LIST
string
prompt "List of multilib variants"
depends on MULTILIB
help
Architecture-specific option of expanding or restricting the list of
the multilib variants to be built. Refer to GCC installation manual
for the format of this option for a particular architecture.
Leave empty to use the default list for this architecture.
config CC_GCC_TARGET_FINAL
bool
prompt "Use the default targets all and install for the final compiler"

View File

@ -1,6 +1,7 @@
# musl options
## depends on ! WINDOWS && ! BARE_METAL
## depends on EXPERIMENTAL
##
## select LIBC_SUPPORT_THREADS_NATIVE
## select CC_CORE_PASSES_NEEDED

View File

@ -4,3 +4,14 @@ CT_DoArchTupleValues () {
# The architecture part of the tuple:
CT_TARGET_ARCH="${CT_ARCH}${CT_ARCH_SUFFIX:-${CT_ARCH_ALPHA_VARIANT}}"
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
echo "${target}"
}

View File

@ -39,3 +39,14 @@ CT_DoArchTupleValues() {
CT_TARGET_SYS="${CT_TARGET_SYS}hf"
fi
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
echo "${target}"
}

View File

@ -3,3 +3,14 @@
CT_DoArchTupleValues() {
:
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
echo "${target}"
}

View File

@ -19,3 +19,14 @@ CT_DoArchTupleValues () {
esac
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
echo "${target}"
}

View File

@ -14,3 +14,14 @@ CT_DoArchTupleValues() {
CT_ARCH_ABI_CFLAG="-mabi=${CT_ARCH_mips_ABI}"
CT_ARCH_WITH_ABI="--with-abi=${CT_ARCH_mips_ABI}"
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
echo "${target}"
}

View File

@ -26,3 +26,44 @@ CT_DoArchTupleValues () {
CT_ARCH_CC_EXTRA_CONFIG="--enable-e500_double"
fi
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
local m32=false
local m64=false
local mlittle=false
local mbig=false
for m in "${multi_flags[@]}"; do
case "$m" in
-m32) m32=true ;;
-m64) m64=true ;;
-mbig) mbig=true ;;
-mlittle) mlittle=true ;;
esac
done
# Fix up bitness
case "${target}" in
powerpc-*) $m64 && target=${target/#powerpc-/powerpc64-} ;;
powerpcle-*) $m64 && target=${target/#powerpcle-/powerpc64le-} ;;
powerpc64-*) $m32 && target=${target/#powerpc64-/powerpc-} ;;
powerpc64le-*) $m32 && target=${target/#powerpc64le-/powerpcle-} ;;
esac
# Fix up endianness
case "${target}" in
powerpc-*) $mlittle && target=${target/#powerpc-/powerpcle-} ;;
powerpcle-*) $mbig && target=${target/#powerpcle-/powerpc-} ;;
powerpc64-*) $mlittle && target=${target/#powerpc64-/powerpc64le-} ;;
powerpc64le-*) $mbig && target=${target/#powerpc64le-/powerpc64-} ;;
esac
# return the target
echo "${target}"
}

View File

@ -6,3 +6,30 @@ CT_DoArchTupleValues() {
CT_TARGET_ARCH="s390x${CT_ARCH_SUFFIX}"
fi
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
local m31=false
local m64=false
for m in "${multi_flags[@]}"; do
case "${multi_flags}" in
-m64) m64=true ;;
-m31) m31=true ;;
esac
done
# Fix bitness
case "${target}" in
s390-*) $m64 && target=${target/#s390-/s390x-} ;;
s390x-*) $m31 && target=${target/#s390x-/s390-} ;;
esac
echo "${target}"
}

View File

@ -35,3 +35,14 @@ CT_DoArchTupleValues () {
esac
CT_ARCH_FLOAT_CFLAG=
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
echo "${target}"
}

View File

@ -2,4 +2,28 @@
CT_DoArchTupleValues() {
# That's the only thing to override
CT_TARGET_ARCH="sparc${target_bits_64}${CT_ARCH_SUFFIX}"
# By default, sparc64-*-linux is configured with -mcpu=v9. However,
# according to https://sourceware.org/ml/libc-alpha/2005-12/msg00027.html,
# "There is no Linux sparc64 port that runs on non-UltraSPARC-I+ ISA CPUs."
# There is a patch that would change the default to -mcpu=ultrasparc for
# sparc64-*-linux configuration: https://patchwork.ozlabs.org/patch/409424/
# but that patch has not been integrated (yet). One concern raised about
# this patch was that -mcpu=ultrasparc can suboptimally schedule instructions
# for newer SPARC CPUs. So, override to -mcpu=ultrasparc and warn the user.
if [ "${CT_KERNEL}" = "linux" -a "${CT_ARCH_64}" = "y" -a -z "${CT_ARCH_CPU}" ]; then
CT_DoLog WARN "Setting CPU to UltraSPARC-I for sparc64-linux. Set CT_ARCH_CPU if a different CPU is desired."
CT_ARCH_WITH_CPU="--with-cpu=ultrasparc"
fi
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
echo "${target}"
}

View File

@ -20,4 +20,51 @@ CT_DoArchTupleValues() {
esac
fi
CT_TARGET_ARCH="${CT_TARGET_ARCH}${CT_ARCH_SUFFIX}"
# Shouldn't be possible to specify this (CT_TARGET_SYS is not specified by the user,
# it is computed by scripts/functions from libc choices). But trap if such invalid
# values ever come from the caller:
case "${CT_TARGET_ARCH}-${CT_TARGET_SYS}" in
i[34567]86-gnux32)
CT_DoLog ERROR "Invalid CT_TARGET: i[34567]86-<vendor>-<os>-gnux32 is invalid."
CT_DoLog ERROR "CT_TARGET: ${CT_TARGET}"
CT_Abort "Go read: https://wiki.debian.org/Multiarch/Tuples"
;;
esac
}
#------------------------------------------------------------------------------
# Get multilib architecture-specific target
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
CT_DoArchMultilibTarget ()
{
local target="${1}"; shift
local -a multi_flags=( "$@" )
local bit32=false
local bit64=false
local abi_dflt=false
local abi_x32=false
for m in "${multi_flags[@]}"; do
case "$m" in
-m32) bit32=true; abi_dflt=true;;
-m64) bit64=true; abi_dflt=true;;
-mx32) bit64=true; abi_x32=true;;
esac
done
# Fix up architecture.
case "${target}" in
x86_64-*) $bit32 && target=${target/#x86_64-/i386-} ;;
i[34567]86-*) $bit64 && target=${target/#i[34567]86-/x86_64-} ;;
esac
# Fix up the ABI part.
case "${target}" in
*x32) $abi_dflt && target=${target/%x32} ;;
*) $abi_x32 && target=${target}x32 ;;
esac
echo "${target}"
}

View File

@ -403,10 +403,20 @@ do_gcc_core_backend() {
extra_config+=("--with-system-zlib")
fi
# Some versions of gcc have a deffective --enable-multilib.
# Since that's the default, only pass --disable-multilib.
# Some versions of gcc have a defective --enable-multilib.
# Since that's the default, only pass --disable-multilib. For multilib,
# also enable multiarch. Without explicit --enable-multiarch, pass-1
# compiler is configured as multilib/no-multiarch and pass-2/final
# are multilib/multiarch (because gcc autodetects multiarch based on
# multiple instances of crt*.o in the install directory - which do
# not exist in pass-1).
if [ "${CT_MULTILIB}" != "y" ]; then
extra_config+=("--disable-multilib")
else
extra_config+=("--enable-multiarch")
if [ -n "${CT_CC_GCC_MULTILIB_LIST}" ]; then
extra_config+=("--with-multilib-list=${CT_CC_GCC_MULTILIB_LIST}")
fi
fi
CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
@ -880,10 +890,15 @@ do_gcc_backend() {
extra_config+=("--with-system-zlib")
fi
# Some versions of gcc have a deffective --enable-multilib.
# Some versions of gcc have a defective --enable-multilib.
# Since that's the default, only pass --disable-multilib.
if [ "${CT_MULTILIB}" != "y" ]; then
extra_config+=("--disable-multilib")
else
extra_config+=("--enable-multiarch")
if [ -n "${CT_CC_GCC_MULTILIB_LIST}" ]; then
extra_config+=("--with-multilib-list=${CT_CC_GCC_MULTILIB_LIST}")
fi
fi
CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"

View File

@ -137,7 +137,7 @@ do_libc_backend() {
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
target=${CT_TARGET}
target=$( CT_DoMultilibTarget "${CT_TARGET}" ${extra_flags} )
case "${target}" in
# SPARC quirk: glibc 2.23 and newer dropped support for SPARCv8 and
# earlier (corresponding pthread barrier code is missing). Until this
@ -147,6 +147,18 @@ do_libc_backend() {
target=${target/#sparc-/sparcv9-}
fi
;;
# x86 quirk: architecture name is i386, but glibc expects i[4567]86 - to
# indicate the desired optimization. If it was a multilib variant of x86_64,
# then it targets at least NetBurst a.k.a. i786, but we'll follow arch/x86.sh
# and set the optimization to i686. Otherwise, replace with the most
# conservative choice, i486.
i386-*)
if [ "${CT_TARGET_ARCH}" = "x86_64" ]; then
target=${target/#i386-/i686-}
else
target=${target/#i386-/i486-}
fi
;;
esac
do_libc_backend_once extra_dir="${extra_dir}" \
@ -193,6 +205,7 @@ do_libc_backend() {
# libc_full : Build full libc : bool : n
# extra_flags : Extra CFLAGS to use (for multilib) : string : (empty)
# extra_dir : Extra subdir for multilib : string : (empty)
# target : Build libc using this target (for multilib) : string : ${CT_TARGET}
do_libc_backend_once() {
local libc_headers
local libc_startfiles
@ -213,6 +226,10 @@ do_libc_backend_once() {
eval "${arg// /\\ }"
done
if [ "${target}" = "" ]; then
target="${CT_TARGET}"
fi
CT_DoLog EXTRA "Configuring C library"
case "${CT_LIBC}" in
@ -288,12 +305,12 @@ do_libc_backend_once() {
|${sed} -r -e '/^(.*[[:space:]])?-(E[BL]|m((big|little)(-endian)?|e?[bl]))([[:space:]].*)?$/!d;' \
-e 's//\2/;' \
)"
# If extra_flags contained an endianness option, no need to add it again. Otherwise,
# add the option from the configuration.
case "${endian_extra}" in
EB|mbig-endian|mbig|meb|mb)
extra_cc_args="${extra_cc_args} ${endian_extra}"
;;
EL|mlittle-endian|mlittle|mel|ml)
extra_cc_args="${extra_cc_args} ${endian_extra}"
;;
"") extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
;;
@ -458,7 +475,8 @@ do_libc_backend_once() {
# However, since we will never actually execute its code,
# it doesn't matter what it contains. So, treating '/dev/null'
# as a C source file, we produce a dummy 'libc.so' in one step
CT_DoExecLog ALL "${cross_cc}" -nostdlib \
CT_DoExecLog ALL "${cross_cc}" ${extra_flags} \
-nostdlib \
-nostartfiles \
-shared \
-x c /dev/null \

View File

@ -1305,6 +1305,25 @@ CT_DoBuildTargetTuple() {
CT_ARCH_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_ARCH_ENDIAN_LDFLAG}"
}
# This function determines the target tuple for a given set of compiler
# flags, using either GCC's multiarch feature (if supported; if not,
# GCC prints nothing and exits with status 0), falling back to calling
# the architecture-specific functions.
CT_DoMultilibTarget() {
local target="$1"; shift
local -a multi_flags=( "$@" )
local gcc_multiarch
gcc_multiarch=$( "${CT_TARGET}-gcc" -print-multiarch "${multi_flags[@]}" )
if [ -n "${gcc_multiarch}" ]; then
echo "${gcc_multiarch}"
return
fi
# Fall back to arch-specific guesswork
CT_DoArchMultilibTarget "${target}" "${multi_flags[@]}"
}
# This function does pause the build until the user strikes "Return"
# Usage: CT_DoPause [optional_message]
CT_DoPause() {