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