Hello,
I've long noticed that configs like `armv7m-unknown-none-eabi`, though
supported by LLVM, are not supported by gnu-config. [LLVM would treat
"none" as the kernel, and "eabi" as the OS/ABI.] I recently found the
time to go investigate why, and this is what I found and patched.
The problem is the way 4-component configs (i.e. 3 dashes) are parsed.
Commit b7ab42761455e051a57876252740cb398aa952eb is the source of this
support, which works by special-casing certain KERNEL-OPERATING_SYSTEM
pairs, to disambiguate between CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
and CPU_TYPE-KERNEL-OPERATING_SYSTEM.
This is fine for 3-component triples, but is overkill in the 4-component
case where the config is always unambiguously
CPU_TYPE-KERNEL-OPERATING_SYSTEM. Additionally, the original `if [
$basic_machine != $1 ]` check to disambiguate between 1- and 2-component
configs is a bit obtuse.
I rewrote the whole chunk of code in what I hope you all agree is a more
readable manner, using sed only to pull out the (up to 4) components and
then doing everything else with simple pure bash. Finally, I whitelisted
and tested `arm*-*-none-eabi`, which I hope a conservative starting point.
Hopefully this all makes sense, and the commit messages add additional
clarity.
Thanks,
John
From 2b71b72b78fa9097c2fd2a8b45ad6d6555e2ca56 Mon Sep 17 00:00:00 2001
From: John Ericson <John.Ericson@Obsidian.Systems>
Date: Sat, 21 Apr 2018 22:01:26 -0400
Subject: [PATCH 1/3] Rewrite basic_machine `if` with `case`
This hopefully makes the condition more readable
---
config.sub | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/config.sub b/config.sub
index 657a862..721d1dc 100755
--- a/config.sub
+++ b/config.sub
@@ -128,9 +128,14 @@ case $maybe_os in
;;
*)
basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
- if [ "$basic_machine" != "$1" ]
- then os=`echo "$1" | sed 's/.*-/-/'`
- else os=; fi
+ case $1 in
+ *-*)
+ os=`echo "$1" | sed 's/.*-/-/'`
+ ;;
+ *)
+ os=
+ ;;
+ esac
;;
esac
--
2.16.2
From 1a9d4e86538b2c8dbd8ad11c4333f0db64febd50 Mon Sep 17 00:00:00 2001
From: John Ericson <John.Ericson@Obsidian.Systems>
Date: Sat, 21 Apr 2018 22:58:24 -0400
Subject: [PATCH 2/3] Rewrite logic handling n `-`-separated components
The old logic was a bit hard to follow due to lots of sed and
unintuitive collapsing of cases. The code now works like this
- 4 components is always parsed as
CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
- 2 components is always parsed as
CPU_TYPE-OPERATING_SYSTEM
- 1 component is always parsed as
CPU_TYPE
- 3 components is ambiguous and parsed as either
CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
CPU_TYPE-KERNEL-OPERATING_SYSTEM
The old code differed semantically in that
- The 4-case was awkwardly folded into the 3-case disambiguation
- The "android-linux" ad-hoc fixdup did something different in the
non-3 cases, but isn't intended to apply in those cases.
---
config.sub | 60 ++++++++++++++++++++++++++++++++++++++----------------------
1 file changed, 38 insertions(+), 22 deletions(-)
diff --git a/config.sub b/config.sub
index 721d1dc..24ffe7c 100755
--- a/config.sub
+++ b/config.sub
@@ -110,33 +110,49 @@ case $# in
exit 1;;
esac
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
- linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* |
kfreebsd*-gnu* | \
- knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
- kopensolaris*-gnu* | cloudabi*-eabi* | \
- storm-chaos* | os2-emx* | rtmk-nova*)
- os=-$maybe_os
- basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- android-linux)
- os=-linux-android
- basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+c1=`echo "$1" | sed 's/^\([^-]*\).*$/\1/'`
+c2=`echo "$1" | sed 's/^[^-]*-\([^-]*\).*$/\1/'`
+c3=`echo "$1" | sed 's/^[^-]*-[^-]*-\([^-]*\).*$/\1/'`
+c4=`echo "$1" | sed 's/^[^-]*-[^-]*-[^-]*-\([^-]*\).*$/\1/'`
+
+# Fix android-linux to be linux-android KERNEL-OS with unknown COMPANY
+if [ "$c2-$c3" = "android-linux" ]; then
+ c2=unknown
+ c3=linux
+ c4=android
+ set $c1-$c2-$c3-$c4
+fi
+
+case $1 in
+ *-*-*-*)
+ basic_machine=$c1-$c2
+ os=-$c3-$c4
;;
- *)
- basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
- case $1 in
- *-*)
- os=`echo "$1" | sed 's/.*-/-/'`
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
parts
+ maybe_os=$c2-$c3
+ case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib*
| \
+ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* |
kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+ kopensolaris*-gnu* | cloudabi*-eabi* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ basic_machine=$c1
+ os=-$maybe_os
;;
*)
- os=
- ;;
+ basic_machine=$c1-$c2
+ os=-$c3
esac
;;
+ *-*)
+ basic_machine=$c1
+ os=-$c2
+ ;;
+ *)
+ basic_machine=$1
+ os=
+ ;;
esac
### Let's recognize common machines as not being operating systems so
--
2.16.2
From dae0366db06652baf43208dab316c652f0bb8090 Mon Sep 17 00:00:00 2001
From: John Ericson <John.Ericson@Obsidian.Systems>
Date: Sat, 21 Apr 2018 23:09:20 -0400
Subject: [PATCH 3/3] Accept arm*-*-none-eabi
These are useful embedded targets.
---
config.sub | 9 +++++++++
testsuite/config-sub.data | 3 +++
2 files changed, 12 insertions(+)
diff --git a/config.sub b/config.sub
index 24ffe7c..030ce89 100755
--- a/config.sub
+++ b/config.sub
@@ -1549,6 +1549,15 @@ case $os in
;;
-none)
;;
+ -*-eabi)
+ case $basic_machine in
+ arm*)
+ ;;
+ *)
+ echo \`eabi\` is only a valid ABI for ARM
+ ;;
+ esac
+ ;;
*)
# Get rid of the `-' at the beginning of $os.
os=`echo $os | sed 's/[^-]*-//'`
diff --git a/testsuite/config-sub.data b/testsuite/config-sub.data
index 474dce8..89a5a24 100644
--- a/testsuite/config-sub.data
+++ b/testsuite/config-sub.data
@@ -59,6 +59,7 @@ arm-sysgo-pikeos arm-sysgo-eabi
arm-tirtos arm-unknown-tirtos
arm-unknown-netbsdelf7.0 arm-unknown-netbsdelf7.0
arm-unknown-riscos arm-unknown-riscos
+arm-unknown-none-eabi arm-unknown-none-eabi
armv2 armv2-unknown-none
armv3l armv3l-unknown-none
armv6-cloudabi-eabihf armv6-unknown-cloudabi-eabihf
@@ -69,6 +70,7 @@ armv6-linux-gnu
armv6-unknown-linux-gnu
armv6-unknown-netbsdelf7.0 armv6-unknown-netbsdelf7.0
armv6-unknown-netbsdelf7.0-eabi
armv6-unknown-netbsdelf7.0-eabi
armv6-unknown-netbsdelf7.0-eabihf
armv6-unknown-netbsdelf7.0-eabihf
+armv6-unknown-none-eabi armv6-unknown-none-eabi
armv7a armv7a-unknown-none
armv7a-linux-gnueabi armv7a-unknown-linux-gnueabi
armv7-apple-ios armv7-apple-ios
@@ -78,6 +80,7 @@ armv7eb-unknown-netbsdelf7.0-eabihf
armv7eb-unknown-netbsdelf7.0-eabihf
armv7-unknown-netbsdelf7.0 armv7-unknown-netbsdelf7.0
armv7-unknown-netbsdelf7.0-eabi
armv7-unknown-netbsdelf7.0-eabi
armv7-unknown-netbsdelf7.0-eabihf
armv7-unknown-netbsdelf7.0-eabihf
+armv7m-unknown-none-eabi armv7m-unknown-none-eabi
armv8b-linux-gnueabi armv8b-unknown-linux-gnueabi
aros i386-pc-aros
asmjs asmjs-unknown-none
--
2.16.2
_______________________________________________
config-patches mailing list
config-patches@gnu.org
https://lists.gnu.org/mailman/listinfo/config-patches