On Oct 29, 2025, Alexandre Oliva <[email protected]> wrote: > On Oct 26, 2025, Uros Bizjak <[email protected]> wrote: >>> * config.gcc [x86_64-*-*]: Match *m32 target, default to m32 >>> abi and multilib. Accept 32 or m32 for --with-abi.
>> Shouldn't this target be named x86_64-linux-gnu32? > In an ideal world, it should. m32 makes it easier to match, > distinguishing from x32, and, more importantly, doesn't clash with > existing uses such as x86_64-mingw32. (We are actually relying on this > config for 32-bit mingw builds running in x86_64 native mode as well) Here's the complete patch, that, on top of the above, should make it clear why matching *32 rather than *m32 would be impractical: there are places where we currently match %m32 or *m32 patterns, to enable both bootstrap and nonbootstrap builds, where %32 or *32 would match unintended preexisting triplets. Bootstrap and nonbootstrap builds need to be distinguished because the final stage is built for 64 or 32 bits, respectively, assuming we start from a 64-bit-targeting toolchain. I suppose we could go for something like abi32 instead, if m32 is deemed unacceptable. This was regstrapped on x86_64-linux-gnu, and built for x86_64-linux-gnum32 with and without bootstrap. Ok to install? From: Olivier Hainque <[email protected]> Co-Authored-By: Alexandre Oliva <[email protected]> Enable a 32-bit "native" toolchain on x86_64-linux-gnu, i.e., one that targets -m32 by default, despite supporting and potentially running in 64-bit mode. Adjust libada and gnattools build machinery to support this configuration in both bootstrap and non-bootstrap modes. for gcc/ChangeLog * config.gcc [x86_64-*-*]: Match *m32 target, default to m32 abi. Accept 32 or m32 for --with-abi. for gcc/ada/ChangeLog * gcc-interface/Make-lang.in (m32_target): Set. (not_m32_target, native_target, native_gnattools1): Set. (ADA_TOOLS_FLAGS_TO_PASS, gnattools): Handle x86_64 natives defaulting to -m32 as cross for gnattools. * gcc-interface/Makefile.in (target_cpu): Set to i686 for x86_64 configurations defaulting to -m32. for gnattools/ChangeLog * configure.ac (default_gnattools_target): Use gnattools-cross when not bootstrapping x86_64 configurations defaulting to -m32. * configure: Rebuild. --- gcc/ada/gcc-interface/Make-lang.in | 25 +++++++++++++++++++------ gcc/ada/gcc-interface/Makefile.in | 7 +++++++ gcc/config.gcc | 25 +++++++++++++++++++++++++ gnattools/configure | 10 ++++++++++ gnattools/configure.ac | 10 ++++++++++ 5 files changed, 71 insertions(+), 6 deletions(-) diff --git a/gcc/ada/gcc-interface/Make-lang.in b/gcc/ada/gcc-interface/Make-lang.in index e768ef60ddf79..c264caa4c94ec 100644 --- a/gcc/ada/gcc-interface/Make-lang.in +++ b/gcc/ada/gcc-interface/Make-lang.in @@ -192,10 +192,20 @@ GNATLS_FOR_HOST = $(subst gnatmake,gnatls,$(GNATMAKE)) # There are too many Ada sources to check against here. Let's # always force the recursive make. + +# A native x86_64 compiler defaulting to -m32 is not suitable to build +# 64bit host tools. Arrange to build the tools with the base compiler +# in this case, as we do for cross configurations. + +m32_target=$(filter x86_64%m32, $(target)) +not_m32_target=$(if $(m32_target),,$(target)) + ifeq ($(build), $(host)) - ifeq ($(host), $(target)) - # This is a regular native. So use the compiler from our current build - # tree. + native_target=$(filter $(host), $(target)) + + ifneq ($(and $(native_target), $(not_m32_target)),) + # This is a regular native. Use the compiler from our + # current build tree. ADA_TOOLS_FLAGS_TO_PASS=\ CC="../../xgcc -B../../" \ CXX="$(CXX)" \ @@ -205,8 +215,8 @@ ifeq ($(build), $(host)) GNATLINK="../../gnatlink" \ GNATBIND="../../gnatbind" else - # This is a regular cross compiler. Use the native compiler to compile - # the tools. + # This is a regular cross compiler or a 64bit native defaulting to -m32. + # Use the base native compiler to compile the tools. # put the host RTS dir first in the PATH to hide the default runtime # files that are among the sources @@ -792,8 +802,11 @@ gnatbind$(exeext): ada/b_gnatb.o $(CONFIG_H) $(GNATBIND_OBJS) $(EXTRA_HOST_OBJS) +$(GCC_LINK) -o $@ $(CFLAGS) ada/b_gnatb.o $(GNATBIND_OBJS) $(EXTRA_HOST_OBJS) ggc-none.o libcommon-target.a $(LIBS) $(SYSLIBS) $(GNATLIB) # use target-gcc target-gnatmake target-gnatbind target-gnatlink + +native_gnattools1=$(if $(not_m32_target),gnattools1,gnattools1-re) + gnattools: $(CONFIG_H) prefix.o force - $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) gnattools1 + $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) $(native_gnattools1) $(MAKE) -C ada $(ADA_TOOLS_FLAGS_TO_PASS) gnattools2 regnattools: diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in index f37893e93feed..2eadf996a1a7e 100644 --- a/gcc/ada/gcc-interface/Makefile.in +++ b/gcc/ada/gcc-interface/Makefile.in @@ -358,6 +358,13 @@ ifeq ($(strip $(filter-out x86_64 linux-gnux32%, $(target_cpu) $(target_os))),) endif endif +# The x86_64-*m32 compilers are x86_64 compilers defaulting to -m32 +ifeq ($(strip $(filter-out x86_64 %m32, $(target_cpu) $(target_os))),) + ifneq ($(strip $(MULTISUBDIR)),/64) + target_cpu:=i686 + endif +endif + # Configuration of host tools # Under linux, host tools need to be linked with -ldl diff --git a/gcc/config.gcc b/gcc/config.gcc index ed862ca12f475..fe0136b162ef5 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -678,6 +678,28 @@ i[34567]86-*-*) x86_64-*-darwin*) ;; x86_64-*-*) + # Pick a default with_abi and with_multilib_list for m32 + # restricted toolchains + case ${target} in + *m32) + case ${with_abi} in + "" | 32 | m32) + with_abi=m32 + ;; + *) + echo "Invalid --with-abi=$with_abi for m32 target" + exit 1 + esac + case ${with_multilib_list} in + default | *m32*) + ;; + *) + echo "Invalid multilib list for m32 target" + exit 1 + esac + ;; + esac + case ${with_abi} in "") if test "x$with_multilib_list" = xmx32; then @@ -692,6 +714,9 @@ x86_64-*-*) x32 | mx32) tm_file="i386/biarchx32.h ${tm_file}" ;; + 32 | m32) + tm_defines="${tm_defines} TARGET_BI_ARCH=1" + ;; *) echo "Unknown ABI used in --with-abi=$with_abi" exit 1 diff --git a/gnattools/configure b/gnattools/configure index b3b6aab1b72ed..16f0b42d7920a 100755 --- a/gnattools/configure +++ b/gnattools/configure @@ -3683,6 +3683,16 @@ fi # ../gcc/ada/gcc-interface/config-lang.in as well. if test "x$cross_compiling/$build/$host" = "xno/$host/$target" ; then default_gnattools_target="gnattools-native" + # When natively-building x86_64-*m32 tools without bootstrap, + # use the native toolchain to build gnattools, expecting its + # libraries to be compatible with whichever multilib was used to + # build other tools. This requires the compiler being built to be + # gnatbind-compatible with the one used for the build. + case $enable_bootstrap/$target in + no/x86_64-*m32) + default_gnattools_target="gnattools-cross" + ;; + esac else default_gnattools_target="gnattools-cross" fi diff --git a/gnattools/configure.ac b/gnattools/configure.ac index ff07179b3ba80..9a30864cb91b6 100644 --- a/gnattools/configure.ac +++ b/gnattools/configure.ac @@ -125,6 +125,16 @@ AC_SUBST(LD_PICFLAG) # ../gcc/ada/gcc-interface/config-lang.in as well. if test "x$cross_compiling/$build/$host" = "xno/$host/$target" ; then default_gnattools_target="gnattools-native" + # When natively-building x86_64-*m32 tools without bootstrap, + # use the native toolchain to build gnattools, expecting its + # libraries to be compatible with whichever multilib was used to + # build other tools. This requires the compiler being built to be + # gnatbind-compatible with the one used for the build. + case $enable_bootstrap/$target in + no/x86_64-*m32) + default_gnattools_target="gnattools-cross" + ;; + esac else default_gnattools_target="gnattools-cross" fi -- Alexandre Oliva, happy hacker https://blog.lx.oliva.nom.br/ Free Software Activist FSFLA co-founder GNU Toolchain Engineer More tolerance and less prejudice are key for inclusion and diversity. Excluding neuro-others for not behaving ""normal"" is *not* inclusive!
