summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/arch/sh.in4
-rw-r--r--samples/sh-multilib-linux-gnu/crosstool.config (renamed from samples/sh4-multilib-linux-gnu/crosstool.config)5
-rw-r--r--samples/sh-multilib-linux-gnu/reported.by (renamed from samples/sh4-multilib-linux-gnu/reported.by)0
-rw-r--r--samples/sh-multilib-linux-uclibc/crosstool.config (renamed from samples/sh4-multilib-linux-uclibc/crosstool.config)5
-rw-r--r--samples/sh-multilib-linux-uclibc/reported.by (renamed from samples/sh4-multilib-linux-uclibc/reported.by)0
-rw-r--r--samples/sh-unknown-elf/crosstool.config1
-rw-r--r--samples/sh4-unknown-linux-gnu/crosstool.config7
-rw-r--r--samples/sh4-unknown-linux-gnu/reported.by3
-rw-r--r--scripts/build/arch.sh6
-rw-r--r--scripts/build/arch/sh.sh111
-rw-r--r--scripts/build/arch/x86.sh2
-rw-r--r--scripts/build/libc/glibc.sh1
12 files changed, 123 insertions, 22 deletions
diff --git a/config/arch/sh.in b/config/arch/sh.in
index bda660c..efced07 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/sh4-multilib-linux-gnu/crosstool.config b/samples/sh-multilib-linux-gnu/crosstool.config
index 7965da6..9fe6e41 100644
--- a/samples/sh4-multilib-linux-gnu/crosstool.config
+++ b/samples/sh-multilib-linux-gnu/crosstool.config
@@ -1,9 +1,10 @@
CT_ARCH_SH=y
-CT_ARCH_SH_SH4=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="m4a"
+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/sh4-multilib-linux-gnu/reported.by b/samples/sh-multilib-linux-gnu/reported.by
index f03f2c5..f03f2c5 100644
--- a/samples/sh4-multilib-linux-gnu/reported.by
+++ b/samples/sh-multilib-linux-gnu/reported.by
diff --git a/samples/sh4-multilib-linux-uclibc/crosstool.config b/samples/sh-multilib-linux-uclibc/crosstool.config
index 2fc3406..66caf04 100644
--- a/samples/sh4-multilib-linux-uclibc/crosstool.config
+++ b/samples/sh-multilib-linux-uclibc/crosstool.config
@@ -1,10 +1,11 @@
CT_ARCH_SH=y
-CT_ARCH_SH_SH4=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="m4a,m3"
+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/sh4-multilib-linux-uclibc/reported.by b/samples/sh-multilib-linux-uclibc/reported.by
index 2d3a629..2d3a629 100644
--- a/samples/sh4-multilib-linux-uclibc/reported.by
+++ b/samples/sh-multilib-linux-uclibc/reported.by
diff --git a/samples/sh-unknown-elf/crosstool.config b/samples/sh-unknown-elf/crosstool.config
index 35fa911..9387a51 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-unknown-linux-gnu/crosstool.config b/samples/sh4-unknown-linux-gnu/crosstool.config
deleted file mode 100644
index 36d806f..0000000
--- 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 4e2eae7..0000000
--- 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 5a8d84c..de3e3c9 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 <configure-args-array-name> <cflags>
+CT_DoArchGlibcAdjustConfigure() {
+ :;
+}
+
# Helper for uClibc configurators: select the architecture
# Usage: CT_DoArchUClibcSelectArch <config-file> <architecture>
CT_DoArchUClibcSelectArch() {
diff --git a/scripts/build/arch/sh.sh b/scripts/build/arch/sh.sh
index 27db4d2..1911b20 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 <configure-args-array-name> <cflags>
+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 3a7a2ce..471d377 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 a3cb87b..3b4b626 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_!