summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Hundven <bryanhundven@gmail.com>2016-06-18 01:02:59 (GMT)
committerGitHub <noreply@github.com>2016-06-18 01:02:59 (GMT)
commit6e7c61650a39a67ee02ed58c11d64c94c436bb33 (patch)
tree199f985d8429efb8d075bba2051502f13a30ccf6
parent7300eb17b43a38320d25dff47230f483a82b4154 (diff)
parentdc8f2d1c04258069101e913d22c898298b98384c (diff)
Merge pull request #403 from stilor/multilib-1
First chunk of multilib changes for merging
-rw-r--r--config/arch/sh.in1
-rw-r--r--config/cc/gcc.in.210
-rw-r--r--config/libc/musl.in1
-rw-r--r--scripts/build/arch/alpha.sh11
-rw-r--r--scripts/build/arch/arm.sh11
-rw-r--r--scripts/build/arch/m68k.sh11
-rw-r--r--scripts/build/arch/microblaze.sh11
-rw-r--r--scripts/build/arch/mips.sh11
-rw-r--r--scripts/build/arch/powerpc.sh41
-rw-r--r--scripts/build/arch/s390.sh27
-rw-r--r--scripts/build/arch/sh.sh11
-rw-r--r--scripts/build/arch/sparc.sh24
-rw-r--r--scripts/build/arch/x86.sh47
-rw-r--r--scripts/build/cc/100-gcc.sh21
-rw-r--r--scripts/build/libc/glibc.sh26
-rw-r--r--scripts/functions19
16 files changed, 276 insertions, 7 deletions
diff --git a/config/arch/sh.in b/config/arch/sh.in
index 68d3120..60de313 100644
--- a/config/arch/sh.in
+++ b/config/arch/sh.in
@@ -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/
diff --git a/config/cc/gcc.in.2 b/config/cc/gcc.in.2
index 17b41cc..c200d22 100644
--- a/config/cc/gcc.in.2
+++ b/config/cc/gcc.in.2
@@ -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"
diff --git a/config/libc/musl.in b/config/libc/musl.in
index 00d98ea..ff84448 100644
--- a/config/libc/musl.in
+++ b/config/libc/musl.in
@@ -1,6 +1,7 @@
# musl options
## depends on ! WINDOWS && ! BARE_METAL
+## depends on EXPERIMENTAL
##
## select LIBC_SUPPORT_THREADS_NATIVE
## select CC_CORE_PASSES_NEEDED
diff --git a/scripts/build/arch/alpha.sh b/scripts/build/arch/alpha.sh
index cf6d40d..ffceae3 100644
--- a/scripts/build/arch/alpha.sh
+++ b/scripts/build/arch/alpha.sh
@@ -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}"
+}
diff --git a/scripts/build/arch/arm.sh b/scripts/build/arch/arm.sh
index 5f6ce2f..338392c 100644
--- a/scripts/build/arch/arm.sh
+++ b/scripts/build/arch/arm.sh
@@ -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}"
+}
diff --git a/scripts/build/arch/m68k.sh b/scripts/build/arch/m68k.sh
index bf26d1b..a6eb010 100644
--- a/scripts/build/arch/m68k.sh
+++ b/scripts/build/arch/m68k.sh
@@ -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}"
+}
diff --git a/scripts/build/arch/microblaze.sh b/scripts/build/arch/microblaze.sh
index 456a6e3..93ecc9a 100644
--- a/scripts/build/arch/microblaze.sh
+++ b/scripts/build/arch/microblaze.sh
@@ -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}"
+}
diff --git a/scripts/build/arch/mips.sh b/scripts/build/arch/mips.sh
index 4d732be..68ad4fa 100644
--- a/scripts/build/arch/mips.sh
+++ b/scripts/build/arch/mips.sh
@@ -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}"
+}
diff --git a/scripts/build/arch/powerpc.sh b/scripts/build/arch/powerpc.sh
index fbc3120..77bbc8a 100644
--- a/scripts/build/arch/powerpc.sh
+++ b/scripts/build/arch/powerpc.sh
@@ -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}"
+}
diff --git a/scripts/build/arch/s390.sh b/scripts/build/arch/s390.sh
index b4b8078..e303420 100644
--- a/scripts/build/arch/s390.sh
+++ b/scripts/build/arch/s390.sh
@@ -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}"
+}
diff --git a/scripts/build/arch/sh.sh b/scripts/build/arch/sh.sh
index 7780e40..e7f4f1a 100644
--- a/scripts/build/arch/sh.sh
+++ b/scripts/build/arch/sh.sh
@@ -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}"
+}
diff --git a/scripts/build/arch/sparc.sh b/scripts/build/arch/sparc.sh
index e3e7491..2d3baa3 100644
--- a/scripts/build/arch/sparc.sh
+++ b/scripts/build/arch/sparc.sh
@@ -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}"
}
diff --git a/scripts/build/arch/x86.sh b/scripts/build/arch/x86.sh
index 69407db..ca0f08b 100644
--- a/scripts/build/arch/x86.sh
+++ b/scripts/build/arch/x86.sh
@@ -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}"
}
diff --git a/scripts/build/cc/100-gcc.sh b/scripts/build/cc/100-gcc.sh
index 7085a90..7bb3610 100644
--- a/scripts/build/cc/100-gcc.sh
+++ b/scripts/build/cc/100-gcc.sh
@@ -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[*]}'"
diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh
index 013c6eb..472acad 100644
--- a/scripts/build/libc/glibc.sh
+++ b/scripts/build/libc/glibc.sh
@@ -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 \
diff --git a/scripts/functions b/scripts/functions
index 70c1ba6..62d264e 100644
--- a/scripts/functions
+++ b/scripts/functions
@@ -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() {