Instead of treating them as OSes, we treat them as their own category.
This is modeled on what LLVM does with its `ObjectFormatType` enum [1],
advancing my long-running project of trying to nudge GNU config and LLVM
towards each other, taking the best ideas of both.

Currently, my emphasis is just on code cleanup. There are just a few
tests for newly supported changes that fall out of this. But down the
road, this also opens the door to parsing configs with more than 4
components, like [2].

[1]:
https://llvm.org/doxygen/classllvm_1_1Triple.html#a83e907e55fa50e093caa96a0aff96201

[2]:
https://github.com/llvm/llvm-project/blob/a18266473be1439d324059afa0e8b124f0466428/llvm/unittests/TargetParser/TripleTest.cpp#L1873C50-L1873C77
added in
https://github.com/llvm/llvm-project/commit/28b82bc39ef076527c07718724913f70b5d60b69
---
 config.sub                | 133 ++++++++++++++++++++++++++------------
 testsuite/config-sub.data |   2 +
 2 files changed, 92 insertions(+), 43 deletions(-)

diff --git a/config.sub b/config.sub
index 6ae2502..c8dc08d 100755
--- a/config.sub
+++ b/config.sub
@@ -1284,11 +1284,12 @@ esac
 
 # Decode manufacturer-specific aliases for certain operating systems.
 
-if test x$basic_os != x
+if test x"$basic_os" != x
 then
 
 # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
 # set os.
+obj=
 case $basic_os in
        gnu/linux*)
                kernel=linux
@@ -1488,10 +1489,16 @@ case $os in
                        os=eabi
                        ;;
                    *)
-                       os=elf
+                       os=
+                       obj=elf
                        ;;
                esac
                ;;
+       aout* | coff* | elf* | pe*)
+               # These are machine code file formats, not OSes
+               obj=$os
+               os=
+               ;;
        *)
                # No normalization, but not necessarily accepted, that comes 
below.
                ;;
@@ -1510,12 +1517,15 @@ else
 # system, and we'll never get to this point.
 
 kernel=
+obj=
 case $cpu-$vendor in
        score-*)
-               os=elf
+               os=
+               obj=elf
                ;;
        spu-*)
-               os=elf
+               os=
+               obj=elf
                ;;
        *-acorn)
                os=riscix1.2
@@ -1525,28 +1535,35 @@ case $cpu-$vendor in
                os=gnu
                ;;
        arm*-semi)
-               os=aout
+               os=
+               obj=aout
                ;;
        c4x-* | tic4x-*)
-               os=coff
+               os=
+               obj=coff
                ;;
        c8051-*)
-               os=elf
+               os=
+               obj=elf
                ;;
        clipper-intergraph)
                os=clix
                ;;
        hexagon-*)
-               os=elf
+               os=
+               obj=elf
                ;;
        tic54x-*)
-               os=coff
+               os=
+               obj=coff
                ;;
        tic55x-*)
-               os=coff
+               os=
+               obj=coff
                ;;
        tic6x-*)
-               os=coff
+               os=
+               obj=coff
                ;;
        # This must come before the *-dec entry.
        pdp10-*)
@@ -1568,19 +1585,24 @@ case $cpu-$vendor in
                os=sunos3
                ;;
        m68*-cisco)
-               os=aout
+               os=
+               obj=aout
                ;;
        mep-*)
-               os=elf
+               os=
+               obj=elf
                ;;
        mips*-cisco)
-               os=elf
+               os=
+               obj=elf
                ;;
        mips*-*)
-               os=elf
+               os=
+               obj=elf
                ;;
        or32-*)
-               os=coff
+               os=
+               obj=coff
                ;;
        *-tti)  # must be before sparc entry or we get the wrong os.
                os=sysv3
@@ -1589,7 +1611,8 @@ case $cpu-$vendor in
                os=sunos4.1.1
                ;;
        pru-*)
-               os=elf
+               os=
+               obj=elf
                ;;
        *-be)
                os=beos
@@ -1670,10 +1693,12 @@ case $cpu-$vendor in
                os=uxpv
                ;;
        *-rom68k)
-               os=coff
+               os=
+               obj=coff
                ;;
        *-*bug)
-               os=coff
+               os=
+               obj=coff
                ;;
        *-apple)
                os=macos
@@ -1691,7 +1716,8 @@ esac
 
 fi
 
-# Now, validate our (potentially fixed-up) OS.
+# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ).
+
 case $os in
        # Sometimes we do "kernel-libc", so those need to count as OSes.
        musl* | newlib* | relibc* | uclibc*)
@@ -1719,11 +1745,11 @@ case $os in
             | mirbsd* | netbsd* | dicos* | openedition* | ose* \
             | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
             | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
-            | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
-            | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+            | bosx* | nextstep* | cxux* | oabi* \
+            | ptx* | ecoff* | winnt* | domain* | vsta* \
             | udi* | lites* | ieee* | go32* | aux* | hcos* \
             | chorusrdb* | cegcc* | glidix* | serenity* \
-            | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+            | cygwin* | msys* | moss* | proelf* | rtems* \
             | midipix* | mingw32* | mingw64* | mint* \
             | uxpv* | beos* | mpeix* | udk* | moxiebox* \
             | interix* | uwin* | mks* | rhapsody* | darwin* \
@@ -1747,60 +1773,81 @@ case $os in
        kernel* | msvc* )
                # Restricted further below
                ;;
+       '')
+               if test x"$obj" = x
+               then
+                       echo "Invalid configuration '$1': Blank OS only allowed 
with explicit machine code file format" 1>&2
+               fi
+               ;;
        *)
                echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2
                exit 1
                ;;
 esac
 
+case $obj in
+       aout* | coff* | elf* | pe*)
+               ;;
+       '')
+               # empty is fine
+               ;;
+       *)
+               echo "Invalid configuration '$1': Machine code format '$obj' 
not recognized" 1>&2
+               exit 1
+               ;;
+esac
+
 # As a final step for OS-related things, validate the OS-kernel combination
 # (given a valid OS), if there is a kernel.
-case $kernel-$os in
-       linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
-                  | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* 
)
+case $kernel-$os-$obj in
+       linux-gnu*- | linux-dietlibc*- | linux-android*- | linux-newlib*- \
+                  | linux-musl*- | linux-relibc*- | linux-uclibc*- | 
linux-mlibc*- )
                ;;
-       uclinux-uclibc* )
+       uclinux-uclibc*- )
                ;;
-       managarm-mlibc* | managarm-kernel* )
+       managarm-mlibc*- | managarm-kernel*- )
                ;;
-       windows*-gnu* | windows*-msvc*)
+       windows*-gnu*- | windows*-msvc*-)
                ;;
-       -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* )
+       -dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- )
                # These are just libc implementations, not actual OSes, and thus
                # require a kernel.
                echo "Invalid configuration '$1': libc '$os' needs explicit 
kernel." 1>&2
                exit 1
                ;;
-       -kernel* )
+       -kernel*- )
                echo "Invalid configuration '$1': '$os' needs explicit kernel." 
1>&2
                exit 1
                ;;
-       *-kernel* )
+       *-kernel*- )
                echo "Invalid configuration '$1': '$kernel' does not support 
'$os'." 1>&2
                exit 1
                ;;
-       *-msvc* )
+       *-msvc*- )
                echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2
                exit 1
                ;;
-       kfreebsd*-gnu* | kopensolaris*-gnu*)
+       kfreebsd*-gnu*- | kopensolaris*-gnu*-)
                ;;
-       vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+       vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-)
                ;;
-       nto-qnx*)
+       nto-qnx*-)
                ;;
-       os2-emx)
+       os2-emx-)
                ;;
-       *-eabi* | *-gnueabi*)
+       *-eabi*- | *-gnueabi*-)
                ;;
-       none-coff* | none-elf*)
+       none--*)
                # None (no kernel, i.e. freestanding / bare metal),
-               # can be paired with an output format "OS"
+               # can be paired with an machine code file format
                ;;
-       -*)
+       -*-)
                # Blank kernel with real OS is always fine.
                ;;
-       *-*)
+       --*)
+               # Blank kernel and OS with real machine code file format is 
always fine.
+               ;;
+       *-*-*)
                echo "Invalid configuration '$1': Kernel '$kernel' not known to 
work with OS '$os'." 1>&2
                exit 1
                ;;
@@ -1884,7 +1931,7 @@ case $vendor in
                ;;
 esac
 
-echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"
 exit
 
 # Local variables:
diff --git a/testsuite/config-sub.data b/testsuite/config-sub.data
index ba934b6..191661c 100644
--- a/testsuite/config-sub.data
+++ b/testsuite/config-sub.data
@@ -91,9 +91,11 @@ arm-sysgo-pikeos                             arm-sysgo-eabi
 arm-tirtos                                     arm-unknown-tirtos
 arm-uclinux-uclibcgnueabi                      
arm-unknown-uclinux-uclibcgnueabi
 arm-unknown-netbsdelf7.0                       arm-unknown-netbsdelf7.0
+arm-unknown-none-aout                          arm-unknown-none-aout
 arm-unknown-none-coff                          arm-unknown-none-coff
 arm-unknown-none-eabi                          arm-unknown-none-eabi
 arm-unknown-none-elf                           arm-unknown-none-elf
+arm-unknown-none-pe                            arm-unknown-none-pe
 arm-unknown-riscos                             arm-unknown-riscos
 arm-zephyr                                     arm-unknown-zephyr
 arm64-apple-darwin20.0.0                       aarch64-apple-darwin20.0.0
-- 
2.40.1


Reply via email to