From 413f5f610012ea24db9910084ea3b40db808147b Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Tue, 29 Aug 2017 15:36:52 -0700 Subject: Super-H multilib toolchain fixes 1. On SuperH, configuring GCC with explicit variant of the CPU (like "sh4") limits the default set of multilibs to just that CPU and requires --with-multilib-list to change. Allow for "unspecified" variant, so that we can defer to GCC to determine the list. 2. Support toolchains with both endiannesses at the same time. 3. Add a SuperH/newlib sample 4. Add more flags processing for uClibc Signed-off-by: Alexey Neyman --- scripts/build/arch/microblaze.sh | 15 ------------ scripts/build/arch/sh.sh | 53 ++++++++++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 30 deletions(-) (limited to 'scripts/build/arch') diff --git a/scripts/build/arch/microblaze.sh b/scripts/build/arch/microblaze.sh index e9d98114..5b850123 100644 --- a/scripts/build/arch/microblaze.sh +++ b/scripts/build/arch/microblaze.sh @@ -3,21 +3,6 @@ CT_DoArchTupleValues () { # The architecture part of the tuple: CT_TARGET_ARCH="${CT_ARCH}${CT_ARCH_SUFFIX:-${target_endian_el}}" - - # gcc ./configure flags - CT_ARCH_WITH_ARCH= - CT_ARCH_WITH_ABI= - CT_ARCH_WITH_CPU= - CT_ARCH_WITH_TUNE= - CT_ARCH_WITH_FPU= - CT_ARCH_WITH_FLOAT= - - # CFLAGS - case "${CT_ARCH_FLOAT_HW},${CT_ARCH_FLOAT_SW}" in - y,) CT_ARCH_FLOAT_CFLAG="-mhard-float" ;; - ,y) CT_ARCH_FLOAT_CFLAG="-msoft-float" ;; - esac - } CT_DoArchUClibcConfig() { diff --git a/scripts/build/arch/sh.sh b/scripts/build/arch/sh.sh index 59bc08aa..27db4d26 100644 --- a/scripts/build/arch/sh.sh +++ b/scripts/build/arch/sh.sh @@ -4,36 +4,29 @@ CT_DoArchTupleValues () { # The architecture part of the tuple: CT_TARGET_ARCH="${CT_ARCH_SH_VARIANT}${CT_ARCH_SUFFIX:-${target_endian_eb}}" - # gcc ./configure flags - CT_ARCH_WITH_ARCH= - CT_ARCH_WITH_ABI= - CT_ARCH_WITH_CPU= - CT_ARCH_WITH_TUNE= - CT_ARCH_WITH_FPU= - CT_ARCH_WITH_FLOAT= - - # Endianness stuff + # Endianness stuff (uses non-standard CFLAGS). If both are compiled, let the + # compiler's default or multilib iterator be used. case "${CT_ARCH_ENDIAN}" in big) CT_ARCH_ENDIAN_CFLAG=-mb;; little) CT_ARCH_ENDIAN_CFLAG=-ml;; esac - # CFLAGS + # Instead of -m{soft,hard}-float, uses CPU type + CT_ARCH_FLOAT_CFLAG= case "${CT_ARCH_SH_VARIANT}" in sh3) CT_ARCH_ARCH_CFLAG=-m3;; sh4*) # softfp is not possible for SuperH, no need to test for it. case "${CT_ARCH_FLOAT}" in hard) - CT_ARCH_ARCH_CFLAG="-m4${CT_ARCH_SH_VARIANT##sh?}" + CT_ARCH_ARCH_CFLAG="-m4${CT_ARCH_SH_VARIANT##sh4}" ;; soft) - CT_ARCH_ARCH_CFLAG="-m4${CT_ARCH_SH_VARIANT##sh?}-nofpu" + CT_ARCH_ARCH_CFLAG="-m4${CT_ARCH_SH_VARIANT##sh4}-nofpu" ;; esac ;; esac - CT_ARCH_FLOAT_CFLAG= } CT_DoArchMultilibList() { @@ -81,6 +74,36 @@ CT_DoArchUClibcCflags() { for f in ${cflags}; do case "${f}" in + -ml) + CT_KconfigDisableOption "ARCH_BIG_ENDIAN" "${dst}" + CT_KconfigDisableOption "ARCH_WANTS_BIG_ENDIAN" "${dst}" + CT_KconfigEnableOption "ARCH_LITTLE_ENDIAN" "${dst}" + CT_KconfigEnableOption "ARCH_WANTS_LITTLE_ENDIAN" "${dst}" + ;; + -mb) + CT_KconfigEnableOption "ARCH_BIG_ENDIAN" "${dst}" + CT_KconfigEnableOption "ARCH_WANTS_BIG_ENDIAN" "${dst}" + CT_KconfigDisableOption "ARCH_LITTLE_ENDIAN" "${dst}" + CT_KconfigDisableOption "ARCH_WANTS_LITTLE_ENDIAN" "${dst}" + ;; + -m2|-m2a|-m2a-nofpu|-m3|-m4|-m4-nofpu|-m4a|-m4a-nofpu) + CT_KconfigDisableOption "CONFIG_SH2" "${cfg}" + CT_KconfigDisableOption "CONFIG_SH2A" "${cfg}" + CT_KconfigDisableOption "CONFIG_SH3" "${cfg}" + CT_KconfigDisableOption "CONFIG_SH4" "${cfg}" + CT_KconfigDisableOption "CONFIG_SH4A" "${cfg}" + CT_KconfigDisableOption "UCLIBC_HAS_FPU" "${cfg}" + case "${f}" in + -m2) + CT_KconfigEnableOption "CONFIG_SH2" "${cfg}" + ;; + -m2a) + CT_KconfigEnableOption "CONFIG_SH2A" "${cfg}" + CT_KconfigEnableOption "UCLIBC_HAS_FPU" "${cfg}" + ;; + -m2a-nofpu) + CT_KconfigEnableOption "CONFIG_SH2A" "${cfg}" + ;; -m3) CT_KconfigEnableOption "CONFIG_SH3" "${cfg}" ;; @@ -90,7 +113,6 @@ CT_DoArchUClibcCflags() { ;; -m4-nofpu) CT_KconfigEnableOption "CONFIG_SH4" "${cfg}" - CT_KconfigDisableOption "UCLIBC_HAS_FPU" "${cfg}" ;; -m4a) CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}" @@ -98,8 +120,9 @@ CT_DoArchUClibcCflags() { ;; -m4a-nofpu) CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}" - CT_KconfigDisableOption "UCLIBC_HAS_FPU" "${cfg}" ;; + esac + ;; esac done } -- cgit v1.2.3 From 602304b23077b8cd58b99a836e8d9ffbedecd52c Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Sat, 2 Sep 2017 10:08:47 -0700 Subject: Use the new SuperH fixes in the two multilib samples - Glibc configure args and tuple need adjustment on SuperH - Only allow "both endian" and "with CPU" for unspecified arch variant. May reconsider endianness (was breaking things before adjusting glibc tuple) - Retire non-multilib sample, it should be a subset of the multilib one now. Signed-off-by: Alexey Neyman --- config/arch/sh.in | 4 +- samples/sh-multilib-linux-gnu/crosstool.config | 10 ++ samples/sh-multilib-linux-gnu/reported.by | 3 + samples/sh-multilib-linux-uclibc/crosstool.config | 11 ++ samples/sh-multilib-linux-uclibc/reported.by | 3 + samples/sh-unknown-elf/crosstool.config | 1 + samples/sh4-multilib-linux-gnu/crosstool.config | 9 -- samples/sh4-multilib-linux-gnu/reported.by | 3 - samples/sh4-multilib-linux-uclibc/crosstool.config | 10 -- samples/sh4-multilib-linux-uclibc/reported.by | 3 - samples/sh4-unknown-linux-gnu/crosstool.config | 7 -- samples/sh4-unknown-linux-gnu/reported.by | 3 - scripts/build/arch.sh | 6 ++ scripts/build/arch/sh.sh | 111 ++++++++++++++++++++- scripts/build/arch/x86.sh | 2 +- scripts/build/libc/glibc.sh | 1 + 16 files changed, 144 insertions(+), 43 deletions(-) create mode 100644 samples/sh-multilib-linux-gnu/crosstool.config create mode 100644 samples/sh-multilib-linux-gnu/reported.by create mode 100644 samples/sh-multilib-linux-uclibc/crosstool.config create mode 100644 samples/sh-multilib-linux-uclibc/reported.by delete mode 100644 samples/sh4-multilib-linux-gnu/crosstool.config delete mode 100644 samples/sh4-multilib-linux-gnu/reported.by delete mode 100644 samples/sh4-multilib-linux-uclibc/crosstool.config delete mode 100644 samples/sh4-multilib-linux-uclibc/reported.by delete mode 100644 samples/sh4-unknown-linux-gnu/crosstool.config delete mode 100644 samples/sh4-unknown-linux-gnu/reported.by (limited to 'scripts/build/arch') diff --git a/config/arch/sh.in b/config/arch/sh.in index bda660cb..efced075 100644 --- a/config/arch/sh.in +++ b/config/arch/sh.in @@ -4,10 +4,9 @@ ## select ARCH_DEFAULT_32 ## select ARCH_USE_MMU ## select ARCH_SUPPORTS_EITHER_ENDIAN -## select ARCH_DEFAULT_LE_BE +## select ARCH_DEFAULT_LE ## select ARCH_REQUIRES_MULTILIB ## select ARCH_SUPPORTS_WITH_ENDIAN -## select ARCH_SUPPORTS_WITH_CPU ## ## 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/ @@ -23,6 +22,7 @@ config ARCH_SH_SH bool prompt "unspecified" select ARCH_SUPPORTS_BOTH_ENDIAN + select ARCH_SUPPORTS_WITH_CPU help If left unspecified, GCC will determine the set of multilibs to compile automatically based on selected endianness, FPU mode and OS. diff --git a/samples/sh-multilib-linux-gnu/crosstool.config b/samples/sh-multilib-linux-gnu/crosstool.config new file mode 100644 index 00000000..9fe6e416 --- /dev/null +++ b/samples/sh-multilib-linux-gnu/crosstool.config @@ -0,0 +1,10 @@ +CT_ARCH_SH=y +CT_ARCH_CPU="sh4" +CT_ARCH_LE_BE=y +CT_TARGET_VENDOR="multilib" +CT_KERNEL_LINUX=y +CT_BINUTILS_PLUGINS=y +CT_CC_GCC_MULTILIB_LIST="m4-nofpu,m4a,m3" +CT_CC_LANG_CXX=y +CT_DEBUG_GDB=y +# CT_GDB_CROSS_PYTHON is not set diff --git a/samples/sh-multilib-linux-gnu/reported.by b/samples/sh-multilib-linux-gnu/reported.by new file mode 100644 index 00000000..f03f2c56 --- /dev/null +++ b/samples/sh-multilib-linux-gnu/reported.by @@ -0,0 +1,3 @@ +reporter_name="Alexey Neyman" +reporter_url="" +reporter_comment="Multilib configuration for SuperH/glibc." diff --git a/samples/sh-multilib-linux-uclibc/crosstool.config b/samples/sh-multilib-linux-uclibc/crosstool.config new file mode 100644 index 00000000..66caf04f --- /dev/null +++ b/samples/sh-multilib-linux-uclibc/crosstool.config @@ -0,0 +1,11 @@ +CT_ARCH_SH=y +CT_ARCH_CPU="sh4" +CT_ARCH_LE_BE=y +CT_TARGET_VENDOR="multilib" +CT_KERNEL_LINUX=y +CT_BINUTILS_PLUGINS=y +CT_LIBC_UCLIBC=y +CT_CC_GCC_MULTILIB_LIST="sh3,sh4,sh4a,sh4a-nofpu" +CT_CC_LANG_CXX=y +CT_DEBUG_GDB=y +# CT_GDB_CROSS_PYTHON is not set diff --git a/samples/sh-multilib-linux-uclibc/reported.by b/samples/sh-multilib-linux-uclibc/reported.by new file mode 100644 index 00000000..2d3a6295 --- /dev/null +++ b/samples/sh-multilib-linux-uclibc/reported.by @@ -0,0 +1,3 @@ +reporter_name="Alexey Neyman" +reporter_url="" +reporter_comment="Multilib configuration for SuperH/uClibc." diff --git a/samples/sh-unknown-elf/crosstool.config b/samples/sh-unknown-elf/crosstool.config index 35fa9110..9387a51a 100644 --- a/samples/sh-unknown-elf/crosstool.config +++ b/samples/sh-unknown-elf/crosstool.config @@ -1,4 +1,5 @@ CT_ARCH_SH=y +CT_ARCH_LE_BE=y CT_BINUTILS_PLUGINS=y CT_CC_LANG_CXX=y CT_GETTEXT=y diff --git a/samples/sh4-multilib-linux-gnu/crosstool.config b/samples/sh4-multilib-linux-gnu/crosstool.config deleted file mode 100644 index 7965da69..00000000 --- a/samples/sh4-multilib-linux-gnu/crosstool.config +++ /dev/null @@ -1,9 +0,0 @@ -CT_ARCH_SH=y -CT_ARCH_SH_SH4=y -CT_TARGET_VENDOR="multilib" -CT_KERNEL_LINUX=y -CT_BINUTILS_PLUGINS=y -CT_CC_GCC_MULTILIB_LIST="m4a" -CT_CC_LANG_CXX=y -CT_DEBUG_GDB=y -# CT_GDB_CROSS_PYTHON is not set diff --git a/samples/sh4-multilib-linux-gnu/reported.by b/samples/sh4-multilib-linux-gnu/reported.by deleted file mode 100644 index f03f2c56..00000000 --- a/samples/sh4-multilib-linux-gnu/reported.by +++ /dev/null @@ -1,3 +0,0 @@ -reporter_name="Alexey Neyman" -reporter_url="" -reporter_comment="Multilib configuration for SuperH/glibc." diff --git a/samples/sh4-multilib-linux-uclibc/crosstool.config b/samples/sh4-multilib-linux-uclibc/crosstool.config deleted file mode 100644 index 2fc34062..00000000 --- a/samples/sh4-multilib-linux-uclibc/crosstool.config +++ /dev/null @@ -1,10 +0,0 @@ -CT_ARCH_SH=y -CT_ARCH_SH_SH4=y -CT_TARGET_VENDOR="multilib" -CT_KERNEL_LINUX=y -CT_BINUTILS_PLUGINS=y -CT_LIBC_UCLIBC=y -CT_CC_GCC_MULTILIB_LIST="m4a,m3" -CT_CC_LANG_CXX=y -CT_DEBUG_GDB=y -# CT_GDB_CROSS_PYTHON is not set diff --git a/samples/sh4-multilib-linux-uclibc/reported.by b/samples/sh4-multilib-linux-uclibc/reported.by deleted file mode 100644 index 2d3a6295..00000000 --- a/samples/sh4-multilib-linux-uclibc/reported.by +++ /dev/null @@ -1,3 +0,0 @@ -reporter_name="Alexey Neyman" -reporter_url="" -reporter_comment="Multilib configuration for SuperH/uClibc." diff --git a/samples/sh4-unknown-linux-gnu/crosstool.config b/samples/sh4-unknown-linux-gnu/crosstool.config deleted file mode 100644 index 36d806f0..00000000 --- a/samples/sh4-unknown-linux-gnu/crosstool.config +++ /dev/null @@ -1,7 +0,0 @@ -CT_ARCH_SH=y -CT_ARCH_SH_SH4=y -CT_KERNEL_LINUX=y -CT_BINUTILS_PLUGINS=y -CT_CC_LANG_CXX=y -CT_DEBUG_GDB=y -# CT_GDB_CROSS_PYTHON is not set diff --git a/samples/sh4-unknown-linux-gnu/reported.by b/samples/sh4-unknown-linux-gnu/reported.by deleted file mode 100644 index 4e2eae77..00000000 --- a/samples/sh4-unknown-linux-gnu/reported.by +++ /dev/null @@ -1,3 +0,0 @@ -reporter_name="YEM" -reporter_url="http://ymorin.is-a-geek.org/" -reporter_comment="EXPERIMENTAL Super-H sh4 sample." diff --git a/scripts/build/arch.sh b/scripts/build/arch.sh index 5a8d84c5..de3e3c91 100644 --- a/scripts/build/arch.sh +++ b/scripts/build/arch.sh @@ -22,6 +22,12 @@ CT_DoArchGlibcAdjustTuple() { :; } +# Multilib: Adjust configure arguments for GLIBC +# Usage: CT_DoArchGlibcAdjustConfigure +CT_DoArchGlibcAdjustConfigure() { + :; +} + # Helper for uClibc configurators: select the architecture # Usage: CT_DoArchUClibcSelectArch CT_DoArchUClibcSelectArch() { diff --git a/scripts/build/arch/sh.sh b/scripts/build/arch/sh.sh index 27db4d26..1911b200 100644 --- a/scripts/build/arch/sh.sh +++ b/scripts/build/arch/sh.sh @@ -15,14 +15,14 @@ CT_DoArchTupleValues () { CT_ARCH_FLOAT_CFLAG= case "${CT_ARCH_SH_VARIANT}" in sh3) CT_ARCH_ARCH_CFLAG=-m3;; - sh4*) + sh4*|sh2*) # softfp is not possible for SuperH, no need to test for it. case "${CT_ARCH_FLOAT}" in hard) - CT_ARCH_ARCH_CFLAG="-m4${CT_ARCH_SH_VARIANT##sh4}" + CT_ARCH_ARCH_CFLAG="-m${CT_ARCH_SH_VARIANT##sh}" ;; soft) - CT_ARCH_ARCH_CFLAG="-m4${CT_ARCH_SH_VARIANT##sh4}-nofpu" + CT_ARCH_ARCH_CFLAG="-m${CT_ARCH_SH_VARIANT##sh}-nofpu" ;; esac ;; @@ -38,13 +38,19 @@ CT_DoArchMultilibList() { # the default CPU. E.g. if configuring for sh4-*-*, we need to remove # "sh4" or "m4" from the multilib list. Otherwise, the resulting compiler # will fail when that CPU is selected explicitly "sh4-multilib-linux-gnu-gcc -m4 ..." - # as it will fail to find the sysroot with that suffix. + # as it will fail to find the sysroot with that suffix. This applies to both + # the CPU type inferred from the target tuple (CT_ARCH_SH_VARIANT) as well as + # the default CPU configured with --with-cpu (CT_ARCH_CPU). IFS=, for x in ${CT_CC_GCC_MULTILIB_LIST}; do if [ "${x}" = "${CT_ARCH_SH_VARIANT}" -o "sh${x#m}" = "${CT_ARCH_SH_VARIANT}" ]; then CT_DoLog WARN "Ignoring '${x}' in multilib list: it is the default multilib" continue fi + if [ "${x}" = "${CT_ARCH_CPU}" -o "sh${x#m}" = "${CT_ARCH_CPU}" ]; then + CT_DoLog WARN "Ignoring '${x}' in multilib list: it is the default multilib" + continue + fi new="${new:+${new},}${x}" done IFS="${save_ifs}" @@ -52,15 +58,110 @@ CT_DoArchMultilibList() { CT_DoLog DEBUG "Adjusted CT_CC_GCC_MULTILIB_LIST to '${CT_CC_GCC_MULTILIB_LIST}'" } +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "target variable" "multilib flags" +CT_DoArchMultilibTarget () +{ + local target_var="${1}"; shift + local -a multi_flags=( "$@" ) + local target_ + local newcpu + + for m in "${multi_flags[@]}"; do + case "${m}" in + -m4*) newcpu=sh4;; + -m3*) newcpu=sh3;; + -m2*) newcpu=sh2;; + -m1*) newcpu=sh1;; + esac + done + + eval target_=\"\${${target_var}}\" + + # Strip CPU name and append the new one if an option has been seen. + if [ -n "${newcpu}" ]; then + target_="${newcpu}-${target_#*-}" + fi + + # Set the target variable + eval ${target_var}=\"${target_}\" +} + +# Adjust target tuple for GLIBC +CT_DoArchGlibcAdjustTuple() { + local target_var="${1}" + local target_ + + eval target_=\"\${${target_var}}\" + + case "${target_}" in + sh-*) + # Glibc does not build unless configured with 'shX-*' tuple. + # Since we ended up here, no architecture variant has been + # specified, so the only source of default is CT_ARCH_CPU. + # GCC defaults to sh1, but this Glibc cannot compile for it. + if [ -n "${CT_ARCH_CPU}" ]; then + target_=${target_/#sh-/${CT_ARCH_CPU}-} + CT_DoLog DEBUG "Adjusted target tuple ${target_}" + else + CT_Abort "GNU C library cannot build for sh1 (GCC default). " \ + "Specify architecture variant or the default CPU type." + fi + ;; + esac + + # Set the target variable + eval ${target_var}=\"${target_}\" +} + +# Multilib: Adjust configure arguments for GLIBC +# Usage: CT_DoArchGlibcAdjustConfigure +CT_DoArchGlibcAdjustConfigure() { + local -a add_args + local array="${1}" + local cflags="${2}" + local opt + + for opt in ${cflags}; do + case "${opt}" in + -m[1-5]*-nofpu) + add_args+=( "--without-fp" ) + ;; + -m[1-5]*) + add_args+=( "--with-fp" ) + ;; + esac + done + + # If architecture variant was specified, we'd have CT_ARCH_ARCH_CFLAG + # and it would've been handled above. Our last resort: CT_ARCH_CPU + if [ "${#add_args[@]}" = 0 ]; then + case "${CT_ARCH_CPU}" in + sh[34]*-nofpu) + add_args+=( "--without-fp" ) + ;; + sh[34]*) + add_args+=( "--with-fp" ) + ;; + esac + fi + + eval "${array}+=( \"\${add_args[@]}\" )" +} + CT_DoArchUClibcConfig() { local cfg="${1}" - # FIXME: uclibc (!ng) seems to support sh64 (sh5), too CT_DoArchUClibcSelectArch "${cfg}" "sh" + CT_KconfigDisableOption "CONFIG_SH2" "${cfg}" + CT_KconfigDisableOption "CONFIG_SH2A" "${cfg}" CT_KconfigDisableOption "CONFIG_SH3" "${cfg}" CT_KconfigDisableOption "CONFIG_SH4" "${cfg}" CT_KconfigDisableOption "CONFIG_SH4A" "${cfg}" case "${CT_ARCH_SH_VARIANT}" in + sh2) CT_KconfigEnableOption "CONFIG_SH2" "${cfg}";; + sh2a) CT_KconfigEnableOption "CONFIG_SH2A" "${cfg}";; sh3) CT_KconfigEnableOption "CONFIG_SH3" "${cfg}";; sh4) CT_KconfigEnableOption "CONFIG_SH4" "${cfg}";; sh4a) CT_KconfigEnableOption "CONFIG_SH4A" "${cfg}";; diff --git a/scripts/build/arch/x86.sh b/scripts/build/arch/x86.sh index 3a7a2cec..471d377a 100644 --- a/scripts/build/arch/x86.sh +++ b/scripts/build/arch/x86.sh @@ -86,7 +86,7 @@ CT_DoArchGlibcAdjustTuple() { # 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 the model - # above # and set the optimization to i686. Otherwise, replace with the most + # above and set the optimization to i686. Otherwise, replace with the most # conservative choice, i486. i386-*) if [ "${CT_TARGET_ARCH}" = "x86_64" ]; then diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index a3cb87b1..3b4b6268 100644 --- a/scripts/build/libc/glibc.sh +++ b/scripts/build/libc/glibc.sh @@ -211,6 +211,7 @@ do_libc_backend_once() { ;; esac done + CT_DoArchGlibcAdjustConfigure extra_config "${glibc_cflags}" # ./configure is mislead by our tools override wrapper for bash # so just tell it where the real bash is _on_the_target_! -- cgit v1.2.3