When working to handle more vendor assemblers and linkers for the patch
series described in

        [PATCH 0/6] Remove HAVE_GNU_{AS,LD} etc.
        https://gcc.gnu.org/pipermail/gcc-patches/2026-April/715161.html

it turned out that the original plan to follow what I'd done for Solaris
so far with the solaris_{as,ld} variables leads to code that is hard to
understand.

Therefore this patch uses a different approach: it introduces two new
variables, as_flavor, and ld_flavor.  They both default to gnu, i.e. the
GNU Binutils toolchain or compatible assemblers and linkers.

To deal with incompatible vendor toolchains, those variables can take
other values.  In addition to solaris, there are aix, darwin, hpux, and
nvptx. More could be added as necessary.

In preparation for the patch series above, this patch switches existing
code from solaris_{as,ld} to {as,ld}_flavor=solaris.

It also checks the configured assembler and linker for the vendor
toolchains above.  If there's a choice between native and GNU toolchains
(AIX, HP-UX, Solaris), the as and ld version outputs are examined.
Otherwise (Darwin, NVPTX), the values are hardcoded and only used in
configure messages.

In addition to {as,ld}_flavor, HAVE_<FLAVOR>_{AS,LD} macros are defined
in cases they are actually needed, matching existing HAVE_SOLARIS_{AS,LD}.

Tested together with a reworked version of the patch series above on
x86_64-pc-linux-gnu, powerpc-ibm-aix7.3.1.0 (as/ld and gas/gld),
x86_64-apple-darwin17.7.0, i386-pc-solaris2.11 and sparc-sun-solaris2.11
(as/ld, gas/ld, and gas/gld).  Also tested by Dave on HP-UX.

For the time being, I've ignored VMS which would also need handling: the
support status of VMS support in GCC is completely unknown, AFAIK there
are no public build systems and there's no information on the targets in
install.texi.

Ok for trunk?

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


2026-05-03  Rainer Orth  <[email protected]>

        gcc:
        * acinclude.m4: Check as_flavor, ld_flavor instead of solaris_as,
        solaris_ld.
        * configure.ac: Likewise.
        (as_flavor, ld_flavor): New variables.
        Adapt messages.
        Set based on as, ld version output.
        (HAVE_AIX_AS): Define.
        * configure: Regenerate.
        * config.in: Regenerate.

# HG changeset patch
# Parent  c65b3c71fdc102d7e20cd47c766eea062ae5e991
build: Introduce {as,ld}_flavor

diff --git a/gcc/acinclude.m4 b/gcc/acinclude.m4
--- a/gcc/acinclude.m4
+++ b/gcc/acinclude.m4
@@ -308,8 +308,8 @@ int (*fp) (void) __attribute__ ((section
 	    gcc_cv_initfini_array=yes
 	  fi
 	elif test x"$gcc_cv_as" != x -a x"$gcc_cv_ld" != x -a x"$gcc_cv_objdump" != x ; then
-	  case $target:$solaris_as in
-	    i?86-*-solaris2*:yes | x86_64-*-solaris2*:yes)
+	  case $target:$as_flavor in
+	    i?86-*-solaris2*:solaris | x86_64-*-solaris2*:solaris)
 	      sh_flags='"a"'
 	      sh_type='@progbits'
 	      ;;
@@ -323,7 +323,7 @@ int (*fp) (void) __attribute__ ((section
 	      sh_type='%progbits'
 	      ;;
 	  esac
-	  if test x$solaris_ld = xno; then
+	  if test x$ld_flavor = xgnu; then
 	    cat > conftest.s <<EOF
 .section .dtors,$sh_flags,$sh_type
 .balign 4
diff --git a/gcc/config.in b/gcc/config.in
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -373,6 +373,12 @@
 #endif
 
 
+/* Define to 1 if using the AIX assembler. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_AIX_AS
+#endif
+
+
 /* Define if your assembler supports LSX and SCQ for 16B atomic. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_AS_16B_ATOMIC
diff --git a/gcc/configure b/gcc/configure
--- a/gcc/configure
+++ b/gcc/configure
@@ -25498,24 +25498,52 @@ fi
 fi
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Solaris assembler" >&5
-$as_echo_n "checking Solaris assembler... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler flavor" >&5
+$as_echo_n "checking assembler flavor... " >&6; }
+as_flavor=gnu
 case $target in
+  *-*-aix*)
+    if $gcc_cv_as -v 2>&1 | grep '^as V' > /dev/null; then
+      as_flavor=aix
+      gas=no
+    else
+      gas=yes
+    fi
+    ;;
+  *-*-darwin*)
+    as_flavor=darwin
+    gas=no
+    ;;
   *-*-solaris2*)
     if $gcc_cv_as -V 2>&1 | grep 'Compiler Common.*SunOS' > /dev/null; then
-      solaris_as=yes
+      as_flavor=solaris
       gas=no
-    elif $gcc_cv_as --version 2>/dev/null | grep GNU > /dev/null; then
+    else
+      gas=yes
+    fi
+    ;;
+  hppa*64*-*-hpux11*)
+    if $gcc_cv_as -V 2>&1 | grep 'UX.11.*PA-RISC.*Assembler' > /dev/null; then
+      as_flavor=hpux
+      gas=no
+    else
       gas=yes
     fi
     ;;
-  *)
-    solaris_as=no
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $solaris_as" >&5
-$as_echo "$solaris_as" >&6; }
-solaris_as_bool=`if test $solaris_as = yes; then echo 1; else echo 0; fi`
+  nvptx-*-*)
+    as_flavor=nvptx
+    gas=no
+    ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $as_flavor" >&5
+$as_echo "$as_flavor" >&6; }
+aix_as_bool=`if test $as_flavor = aix; then echo 1; else echo 0; fi`
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_AIX_AS $aix_as_bool
+_ACEOF
+
+solaris_as_bool=`if test $as_flavor = solaris; then echo 1; else echo 0; fi`
 
 cat >>confdefs.h <<_ACEOF
 #define HAVE_SOLARIS_AS $solaris_as_bool
@@ -25652,24 +25680,46 @@ fi
 fi
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Solaris linker" >&5
-$as_echo_n "checking Solaris linker... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker flavor" >&5
+$as_echo_n "checking linker flavor... " >&6; }
+ld_flavor=gnu
 case $target in
-  *-*-solaris2*)
-    if $gcc_cv_ld -V 2>/dev/null | grep 'Solaris Link Editors' > /dev/null; then
+  *-*-aix*)
+    if $gcc_cv_ld -V 2>&1 | grep 'ld: LD ' > /dev/null; then
+      ld_flavor=aix
       gnu_ld=no
-      solaris_ld=yes
-    elif $gcc_cv_ld --version 2>/dev/null | grep GNU > /dev/null; then
+    else
       gnu_ld=yes
     fi
     ;;
-  *)
-    solaris_ld=no
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $solaris_ld" >&5
-$as_echo "$solaris_ld" >&6; }
-solaris_ld_bool=`if test $solaris_ld = yes; then echo 1; else echo 0; fi`
+  *-*-darwin*)
+    ld_flavor=darwin
+    gnu_ld=no
+    ;;
+  *-*-solaris2*)
+    if $gcc_cv_ld -V 2>&1 | grep 'Solaris Link Editors' > /dev/null; then
+      ld_flavor=solaris
+      gnu_ld=no
+    else
+      gnu_ld=yes
+    fi
+    ;;
+  hppa*64*-*-hpux11*)
+    if $gcc_cv_ld -V 2>&1 | grep 'linker command.*sgs.*ld PA64' > /dev/null; then
+      ld_flavor=hpux
+      gnu_ld=no
+    else
+      gnu_ld=yes
+    fi
+    ;;
+  nvptx-*-*)
+    ld_flavor=nvptx
+    gnu_ld=no
+    ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_flavor" >&5
+$as_echo "$ld_flavor" >&6; }
+solaris_ld_bool=`if test $ld_flavor = solaris; then echo 1; else echo 0; fi`
 
 cat >>confdefs.h <<_ACEOF
 #define HAVE_SOLARIS_LD $solaris_ld_bool
@@ -25709,16 +25759,16 @@ if test -z "$gnu_ld"; then
   fi
 fi
 
-case "$target:$gnu_ld" in
-  *-*-solaris2*:no)
+case "$target:$ld_flavor" in
+  *-*-solaris2*:solaris)
     # While Solaris ld has -m32/-m64 it usually determines the ELF class
     # from the input objects.
     ;;
-  i?86-*-solaris2*:yes | x86_64-*-solaris2*:yes)
+  i?86-*-solaris2*:gnu | x86_64-*-solaris2*:gnu)
     ld_32_opt=-melf_i386_sol2
     ld_64_opt=-melf_x86_64_sol2
     ;;
-  i?86-*-*:yes | x86_64-*-*:yes)
+  i?86-*-*:gnu | x86_64-*-*:gnu)
     ld_32_opt=-melf_i386
     ld_64_opt=-melf_x86_64
     ;;
@@ -26914,8 +26964,8 @@ fi
 	    gcc_cv_initfini_array=yes
 	  fi
 	elif test x"$gcc_cv_as" != x -a x"$gcc_cv_ld" != x -a x"$gcc_cv_objdump" != x ; then
-	  case $target:$solaris_as in
-	    i?86-*-solaris2*:yes | x86_64-*-solaris2*:yes)
+	  case $target:$as_flavor in
+	    i?86-*-solaris2*:solaris | x86_64-*-solaris2*:solaris)
 	      sh_flags='"a"'
 	      sh_type='@progbits'
 	      ;;
@@ -26929,7 +26979,7 @@ fi
 	      sh_type='%progbits'
 	      ;;
 	  esac
-	  if test x$solaris_ld = xno; then
+	  if test x$ld_flavor = xgnu; then
 	    cat > conftest.s <<EOF
 .section .dtors,$sh_flags,$sh_type
 .balign 4
@@ -28097,7 +28147,7 @@ foo:	.long	25
 .word foo(tlsldo)'
 	;;
   i?86-*-* | x86_64-*-*)
-    if test x$solaris_as = xyes; then
+    if test x$as_flavor = xsolaris; then
       tls_section_flag=t
 
 $as_echo "#define TLS_SECTION_ASM_FLAG 't'" >>confdefs.h
@@ -28345,7 +28395,7 @@ foo:	.long	25
 	.long	foo@TPOFF'
 	;;
   sparc*-*-*)
-    if test x$solaris_as = xyes; then
+    if test x$as_flavor = xsolaris; then
       conftest_s='
       .section ".tdata",#alloc,#write,#tls'
     else
@@ -28522,7 +28572,7 @@ ld_version_script_option=''
 if test $in_tree_ld = yes || test x"$gnu_ld" = xyes; then
   gcc_cv_ld_version_script=yes
   ld_version_script_option='--version-script'
-elif test x$solaris_ld = xyes; then
+elif test x$ld_flavor = xsolaris; then
   # Solaris 2 ld always supports -M.  It also supports a subset of
   # --version-script since Solaris 11.4, but requires
   # -z gnu-version-script-compat to activate.
@@ -32973,7 +33023,7 @@ gcc_cv_ld_ctf=no
 # Check for Solaris ld 1.3315 introduced in Solaris 11.4 SRU 84.  ld -z ctf
 # already went in in SRU 81, but lacked GNU CTF to Solaris CTF conversion.
 if $gcc_cv_ld --help 2>&1 | grep -- '-z ctf' > /dev/null \
-  && test x$solaris_ld = xyes && test "$ld_vers_minor" -ge 3315; then
+  && test x$ld_flavor = xsolaris && test "$ld_vers_minor" -ge 3315; then
   gcc_cv_ld_ctf=yes
 
 $as_echo "#define HAVE_LD_CTF 1" >>confdefs.h
@@ -33256,7 +33306,7 @@ elif test x$gcc_cv_ld != x; then
       gcc_cv_ld_no_as_needed_option='--pop-state'
     fi
   fi
-  if test x$solaris_ld = xyes; then
+  if test x$ld_flavor = xsolaris; then
     # Solaris 2 ld always supports -z ignore/-z record.  Prefer the native
     # forms.
     gcc_cv_ld_as_needed=yes
diff --git a/gcc/configure.ac b/gcc/configure.ac
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2738,22 +2738,48 @@ else
         AC_PATH_PROG(gcc_cv_as, $AS_FOR_TARGET)
 fi])
 
-AC_MSG_CHECKING(Solaris assembler)
+AC_MSG_CHECKING(assembler flavor)
+as_flavor=gnu
 case $target in
-  *-*-solaris2*)
-    if $gcc_cv_as -V 2>&1 | grep 'Compiler Common.*SunOS' > /dev/null; then
-      solaris_as=yes
+  *-*-aix*)
+    if $gcc_cv_as -v 2>&1 | grep '^as V' > /dev/null; then
+      as_flavor=aix
       gas=no
-    elif $gcc_cv_as --version 2>/dev/null | grep GNU > /dev/null; then
+    else
       gas=yes
     fi
     ;;
-  *)
-    solaris_as=no
+  *-*-darwin*)
+    as_flavor=darwin
+    gas=no
+    ;;
+  *-*-solaris2*)
+    if $gcc_cv_as -V 2>&1 | grep 'Compiler Common.*SunOS' > /dev/null; then
+      as_flavor=solaris
+      gas=no
+    else
+      gas=yes
+    fi
+    ;;
+  hppa*64*-*-hpux11*)
+    if $gcc_cv_as -V 2>&1 | grep 'UX.11.*PA-RISC.*Assembler' > /dev/null; then
+      as_flavor=hpux
+      gas=no
+    else
+      gas=yes
+    fi
+    ;;
+  nvptx-*-*)
+    as_flavor=nvptx
+    gas=no
     ;;
 esac
-AC_MSG_RESULT($solaris_as)
-solaris_as_bool=`if test $solaris_as = yes; then echo 1; else echo 0; fi`
+AC_MSG_RESULT($as_flavor)
+dnl Don't define HAVE_GNU_AS, only HAVE_<FLAVOR>_AS when actually used.
+aix_as_bool=`if test $as_flavor = aix; then echo 1; else echo 0; fi`
+AC_DEFINE_UNQUOTED(HAVE_AIX_AS, $aix_as_bool,
+	[Define to 1 if using the AIX assembler.])
+solaris_as_bool=`if test $as_flavor = solaris; then echo 1; else echo 0; fi`
 AC_DEFINE_UNQUOTED(HAVE_SOLARIS_AS, $solaris_as_bool,
 	[Define to 1 if using the Solaris assembler.])
 
@@ -2839,22 +2865,45 @@ else
         AC_PATH_PROG(gcc_cv_ld, $LD_FOR_TARGET)
 fi])
 
-AC_MSG_CHECKING(Solaris linker)
+AC_MSG_CHECKING(linker flavor)
+ld_flavor=gnu
 case $target in
-  *-*-solaris2*)
-    if $gcc_cv_ld -V 2>/dev/null | grep 'Solaris Link Editors' > /dev/null; then
+  *-*-aix*)
+    if $gcc_cv_ld -V 2>&1 | grep 'ld: LD ' > /dev/null; then
+      ld_flavor=aix
       gnu_ld=no
-      solaris_ld=yes
-    elif $gcc_cv_ld --version 2>/dev/null | grep GNU > /dev/null; then
+    else
       gnu_ld=yes
     fi
     ;;
-  *)
-    solaris_ld=no
+  *-*-darwin*)
+    ld_flavor=darwin
+    gnu_ld=no
+    ;;
+  *-*-solaris2*)
+    if $gcc_cv_ld -V 2>&1 | grep 'Solaris Link Editors' > /dev/null; then
+      ld_flavor=solaris
+      gnu_ld=no
+    else
+      gnu_ld=yes
+    fi
+    ;;
+  hppa*64*-*-hpux11*)
+    if $gcc_cv_ld -V 2>&1 | grep 'linker command.*sgs.*ld PA64' > /dev/null; then
+      ld_flavor=hpux
+      gnu_ld=no
+    else
+      gnu_ld=yes
+    fi
+    ;;
+  nvptx-*-*)
+    ld_flavor=nvptx
+    gnu_ld=no
     ;;
 esac
-AC_MSG_RESULT($solaris_ld)
-solaris_ld_bool=`if test $solaris_ld = yes; then echo 1; else echo 0; fi`
+AC_MSG_RESULT($ld_flavor)
+dnl Don't define HAVE_GNU_LD, only HAVE_<FLAVOR>_LD when actually used.
+solaris_ld_bool=`if test $ld_flavor = solaris; then echo 1; else echo 0; fi`
 AC_DEFINE_UNQUOTED(HAVE_SOLARIS_LD, $solaris_ld_bool,
 	[Define to 1 if using the Solaris linker.])
 
@@ -2884,16 +2933,16 @@ if test -z "$gnu_ld"; then
   fi
 fi
 
-case "$target:$gnu_ld" in
-  *-*-solaris2*:no)
+case "$target:$ld_flavor" in
+  *-*-solaris2*:solaris)
     # While Solaris ld has -m32/-m64 it usually determines the ELF class
     # from the input objects.
     ;;
-  i?86-*-solaris2*:yes | x86_64-*-solaris2*:yes)
+  i?86-*-solaris2*:gnu | x86_64-*-solaris2*:gnu)
     ld_32_opt=-melf_i386_sol2
     ld_64_opt=-melf_x86_64_sol2
     ;;
-  i?86-*-*:yes | x86_64-*-*:yes)
+  i?86-*-*:gnu | x86_64-*-*:gnu)
     ld_32_opt=-melf_i386
     ld_64_opt=-melf_x86_64
     ;;
@@ -3993,7 +4042,7 @@ foo:	.long	25
 .word foo(tlsldo)'
 	;;
   i?86-*-* | x86_64-*-*)
-    if test x$solaris_as = xyes; then
+    if test x$as_flavor = xsolaris; then
       tls_section_flag=t
 changequote([,])dnl
       AC_DEFINE(TLS_SECTION_ASM_FLAG, 't',
@@ -4242,7 +4291,7 @@ foo:	.long	25
 	.long	foo@TPOFF'
 	;;
   sparc*-*-*)
-    if test x$solaris_as = xyes; then
+    if test x$as_flavor = xsolaris; then
       conftest_s='
       .section ".tdata",#alloc,#write,#tls'
     else
@@ -4383,7 +4432,7 @@ ld_version_script_option=''
 if test $in_tree_ld = yes || test x"$gnu_ld" = xyes; then
   gcc_cv_ld_version_script=yes
   ld_version_script_option='--version-script'
-elif test x$solaris_ld = xyes; then
+elif test x$ld_flavor = xsolaris; then
   # Solaris 2 ld always supports -M.  It also supports a subset of
   # --version-script since Solaris 11.4, but requires
   # -z gnu-version-script-compat to activate.
@@ -6337,7 +6386,7 @@ gcc_cv_ld_ctf=no
 # Check for Solaris ld 1.3315 introduced in Solaris 11.4 SRU 84.  ld -z ctf
 # already went in in SRU 81, but lacked GNU CTF to Solaris CTF conversion.
 if $gcc_cv_ld --help 2>&1 | grep -- '-z ctf' > /dev/null \
-  && test x$solaris_ld = xyes && test "$ld_vers_minor" -ge 3315; then
+  && test x$ld_flavor = xsolaris && test "$ld_vers_minor" -ge 3315; then
   gcc_cv_ld_ctf=yes
   AC_DEFINE(HAVE_LD_CTF, 1, [Define if your linker supports -z ctf.])
 fi
@@ -6570,7 +6619,7 @@ elif test x$gcc_cv_ld != x; then
       gcc_cv_ld_no_as_needed_option='--pop-state'
     fi
   fi
-  if test x$solaris_ld = xyes; then
+  if test x$ld_flavor = xsolaris; then
     # Solaris 2 ld always supports -z ignore/-z record.  Prefer the native
     # forms.
     gcc_cv_ld_as_needed=yes

Reply via email to