On Oct 27, 2025, Richard Biener <[email protected]> wrote:

> So on x86-64-linux this is a cross configuration?

It's one of those cross-natives corner cases.

> Or is this able to bootstrap itself but then resulting in a 32bit host
> compiler?

Yeah, it can bootstrap.  (It needs an additional tweak to fix multilibs
in libgnat.)

But the interesting use case for this is the non-bootstrap case.

A variant of this change that enables multilibs, and that could be more
interesting to bootstrap, can also bootstrap starting with an
x86_64-linux-gnu compiler with -m64 added to BOOT_CFLAGS, along with an
-L flag to find the 64-bit libstdc++, but you hit post-bootstrap
incompatibilities building e.g. fixincludes (and gnattools?) between the
64-bit libiberty (and other bootstrapped libraries), and the 32-bit
outputs from the bootstrapped compiler used to build the post-bootstrap
host tools.

Non-bootstrapped builds don't hit this incompatibility, because the
initial 64-bit compiler, rather than the just-built one, is used to
build these host tools.

Here's an incremental change, also by Olivier Hainque, that enables
biarch -m32-defaulting x86_64-linux-gnum32.


[PATCH] Turn x86_64-m32 configurations into biarch defaulting to m32

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 8d96ef00005ad..7c85d04184b88 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -689,8 +689,7 @@ x86_64-*-*)
                        exit 1
               esac
               case ${with_multilib_list} in
-              default | m32)
-                       with_multilib_list=m32
+              default | *m32*)
                        ;;
               *)
                        echo "Invalid multilib list for m32 target"
@@ -714,6 +713,7 @@ x86_64-*-*)
                tm_file="i386/biarchx32.h ${tm_file}"
                ;;
        32 | m32)
+               tm_file="i386/biarch32.h ${tm_file}"
                ;;
        *)
                echo "Unknown ABI used in --with-abi=$with_abi"
diff --git a/gcc/config/i386/biarch32.h b/gcc/config/i386/biarch32.h
new file mode 100644
index 0000000000000..116cd68acc838
--- /dev/null
+++ b/gcc/config/i386/biarch32.h
@@ -0,0 +1,29 @@
+/* Make configure files to produce biarch compiler defaulting to 64bit mode.
+   This file must be included very first, while the OS specific file later
+   to overwrite otherwise wrong defaults.
+   Copyright (C) 2001-2025 Free Software Foundation, Inc.
+   Contributed by Bo Thorsen <[email protected]>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
+
+#define TARGET_64BIT_DEFAULT 0
+#define TARGET_BI_ARCH 3
diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
index dadcf7664c632..443041789555b 100644
--- a/gcc/config/i386/i386-options.cc
+++ b/gcc/config/i386/i386-options.cc
@@ -2018,22 +2018,35 @@ ix86_option_override_internal (bool main_args_p,
 #ifdef TARGET_BI_ARCH
   else
     {
-#if TARGET_BI_ARCH == 1
-      /* When TARGET_BI_ARCH == 1, by default, OPTION_MASK_ABI_64
-        is on and OPTION_MASK_ABI_X32 is off.  We turn off
-        OPTION_MASK_ABI_64 if OPTION_MASK_ABI_X32 is turned on by
-        -mx32.  */
-      if (TARGET_X32_P (opts->x_ix86_isa_flags))
-       opts->x_ix86_isa_flags &= ~OPTION_MASK_ABI_64;
-#else
-      /* When TARGET_BI_ARCH == 2, by default, OPTION_MASK_ABI_X32 is
-        on and OPTION_MASK_ABI_64 is off.  We turn off
-        OPTION_MASK_ABI_X32 if OPTION_MASK_ABI_64 is turned on by
-        -m64 or OPTION_MASK_CODE16 is turned on by -m16.  */
-      if (TARGET_LP64_P (opts->x_ix86_isa_flags)
-         || TARGET_16BIT_P (opts->x_ix86_isa_flags))
-       opts->x_ix86_isa_flags &= ~OPTION_MASK_ABI_X32;
-#endif
+      switch (TARGET_BI_ARCH)
+       {
+       case 1:
+           /* When TARGET_BI_ARCH == 1, by default, OPTION_MASK_ABI_64
+              is on and OPTION_MASK_ABI_X32 is off.  We turn off
+              OPTION_MASK_ABI_64 if OPTION_MASK_ABI_X32 is turned on by
+              -mx32.  */
+           if (TARGET_X32_P (opts->x_ix86_isa_flags))
+             opts->x_ix86_isa_flags &= ~OPTION_MASK_ABI_64;
+           break;
+
+       case 2:
+         /* When TARGET_BI_ARCH == 2, by default, OPTION_MASK_ABI_X32 is
+            on and OPTION_MASK_ABI_64 is off.  We turn off
+            OPTION_MASK_ABI_X32 if OPTION_MASK_ABI_64 is turned on by
+            -m64 or OPTION_MASK_CODE16 is turned on by -m16.  */
+         if (TARGET_LP64_P (opts->x_ix86_isa_flags)
+             || TARGET_16BIT_P (opts->x_ix86_isa_flags))
+           opts->x_ix86_isa_flags &= ~OPTION_MASK_ABI_X32;
+
+       case 3:
+         /* When TARGET_BI_ARCH == 3, by default, OPTION_MASK_ABI_X32 and
+            OPTION_MASK_ABI_64 are both off.  */
+         break;
+
+       default:
+         gcc_unreachable();
+       }
+
       if (TARGET_64BIT_P (opts->x_ix86_isa_flags)
          && TARGET_IAMCU_P (opts->x_target_flags))
        sorry ("Intel MCU psABI isn%'t supported in %s mode",


-- 
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!

Reply via email to