[01/61] Multilib changes

Message ID 20250131171232.1018281-3-aleksandar.rakic@htecgroup.com
State New
Headers
Series Improve Mips target |

Commit Message

Aleksandar Rakic Jan. 31, 2025, 5:13 p.m. UTC
  From: Robert Suchanek <robert.suchanek@imgtec.com>

Remove single-float and short-double axes from multilib spec.

The single-float/short-double combination is not immediately supportable
from GCC 6 as the -fshort-double option has been removed and we do not
have backend logic to implement a direct replacement. If/when we do this
then it needs appropriate ABI markers to describe the additional
variant.

Remove final remnant of single/short config.

Add the mips32r2 mips16 little endian soft-float multilib.

Add big-endian, MIPS64R6, soft-float, N32/N64 Linux libs.

Add MIPS32R1 HF LE Linux libraries.

Add big endian microMIPSr2 hard/soft float support.

Disable microMIPSr6 multilib configs.

Cherry-picked 2b2481cc71284ad9db3dff60bd6cab2be678e87e,
0e3416279af1417b85d1a09b1e74327c31899a5d,
e50ab07265fd8188bd4275c14b744ed2dc39116d,
32f7098d7d5bee9754c7728639a0e1cdb24d63f7,
24e261b2c9a9bea1c205cfab761c218ad50f938e, and
796ddebed418e953ba7cd5de1da42311fb1fe096
from https://github.com/MIPS/gcc

Signed-off-by: Robert Suchanek <robert.suchanek@imgtec.com>
Signed-off-by: Matthew Fortune <matthew.fortune@imgtec.com>
Signed-off-by: Chao-ying Fu <cfu@mips.com>
Signed-off-by: Faraz Shahbazker <fshahbazker@wavecomp.com>
Signed-off-by: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
---
 config-ml.in                 |  25 ++-
 configure                    |  25 +++
 configure.ac                 |  25 +++
 gcc/Makefile.in              |  20 ++
 gcc/config.gcc               |  12 +-
 gcc/config/mips/ml-img-elf   |  12 +
 gcc/config/mips/ml-img-linux |  10 +
 gcc/config/mips/ml-mti-elf   |  31 +++
 gcc/config/mips/ml-mti-linux |  27 +++
 gcc/config/mips/mti-elf.h    |   2 +
 gcc/config/mips/mti-linux.h  |   2 +
 gcc/config/mips/t-img-elf    |  33 ---
 gcc/config/mips/t-img-linux  |  38 ----
 gcc/config/mips/t-mips-multi | 409 +++++++++++++++++++++++++++++++++++
 gcc/config/mips/t-mti-elf    |  48 ----
 gcc/config/mips/t-mti-linux  | 158 --------------
 gcc/configure                |   8 +-
 gcc/configure.ac             |   3 +
 gcc/genmultilib              |   3 -
 19 files changed, 604 insertions(+), 287 deletions(-)
 create mode 100644 gcc/config/mips/ml-img-elf
 create mode 100644 gcc/config/mips/ml-img-linux
 create mode 100644 gcc/config/mips/ml-mti-elf
 create mode 100644 gcc/config/mips/ml-mti-linux
 delete mode 100644 gcc/config/mips/t-img-elf
 delete mode 100644 gcc/config/mips/t-img-linux
 create mode 100644 gcc/config/mips/t-mips-multi
 delete mode 100644 gcc/config/mips/t-mti-elf
 delete mode 100644 gcc/config/mips/t-mti-linux
  

Comments

Jeffrey Law April 19, 2025, 2:42 p.m. UTC | #1
On 1/31/25 10:13 AM, Aleksandar Rakic wrote:
> From: Robert Suchanek <robert.suchanek@imgtec.com>
> 
> Remove single-float and short-double axes from multilib spec.
> 
> The single-float/short-double combination is not immediately supportable
> from GCC 6 as the -fshort-double option has been removed and we do not
> have backend logic to implement a direct replacement. If/when we do this
> then it needs appropriate ABI markers to describe the additional
> variant.
> 
> Remove final remnant of single/short config.
> 
> Add the mips32r2 mips16 little endian soft-float multilib.
> 
> Add big-endian, MIPS64R6, soft-float, N32/N64 Linux libs.
> 
> Add MIPS32R1 HF LE Linux libraries.
> 
> Add big endian microMIPSr2 hard/soft float support.
> 
> Disable microMIPSr6 multilib configs.
> 
> Cherry-picked 2b2481cc71284ad9db3dff60bd6cab2be678e87e,
> 0e3416279af1417b85d1a09b1e74327c31899a5d,
> e50ab07265fd8188bd4275c14b744ed2dc39116d,
> 32f7098d7d5bee9754c7728639a0e1cdb24d63f7,
> 24e261b2c9a9bea1c205cfab761c218ad50f938e, and
> 796ddebed418e953ba7cd5de1da42311fb1fe096
> from https://github.com/MIPS/gcc
> 
> Signed-off-by: Robert Suchanek <robert.suchanek@imgtec.com>
> Signed-off-by: Matthew Fortune <matthew.fortune@imgtec.com>
> Signed-off-by: Chao-ying Fu <cfu@mips.com>
> Signed-off-by: Faraz Shahbazker <fshahbazker@wavecomp.com>
> Signed-off-by: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
> ---
>   config-ml.in                 |  25 ++-
>   configure                    |  25 +++
>   configure.ac                 |  25 +++
>   gcc/Makefile.in              |  20 ++
>   gcc/config.gcc               |  12 +-
>   gcc/config/mips/ml-img-elf   |  12 +
>   gcc/config/mips/ml-img-linux |  10 +
>   gcc/config/mips/ml-mti-elf   |  31 +++
>   gcc/config/mips/ml-mti-linux |  27 +++
>   gcc/config/mips/mti-elf.h    |   2 +
>   gcc/config/mips/mti-linux.h  |   2 +
>   gcc/config/mips/t-img-elf    |  33 ---
>   gcc/config/mips/t-img-linux  |  38 ----
>   gcc/config/mips/t-mips-multi | 409 +++++++++++++++++++++++++++++++++++
>   gcc/config/mips/t-mti-elf    |  48 ----
>   gcc/config/mips/t-mti-linux  | 158 --------------
>   gcc/configure                |   8 +-
>   gcc/configure.ac             |   3 +
>   gcc/genmultilib              |   3 -
>   19 files changed, 604 insertions(+), 287 deletions(-)
>   create mode 100644 gcc/config/mips/ml-img-elf
>   create mode 100644 gcc/config/mips/ml-img-linux
>   create mode 100644 gcc/config/mips/ml-mti-elf
>   create mode 100644 gcc/config/mips/ml-mti-linux
>   delete mode 100644 gcc/config/mips/t-img-elf
>   delete mode 100644 gcc/config/mips/t-img-linux
>   create mode 100644 gcc/config/mips/t-mips-multi
>   delete mode 100644 gcc/config/mips/t-mti-elf
>   delete mode 100644 gcc/config/mips/t-mti-linux
So I'm not at all concerned about the mips specific bits of this patch. 
After all, they only affect mips ports and the changes seem sensible. 
They would need a ChangeLog entry to go forward through.

What is concerning is the config.ml change which has no comments about 
what it's doing or justification in the cover ltter.

Similarly it's not clear why we need a blob of mips specific code in 
configure.ac and the files autogenerated from that.

Jeff
  
Aleksandar Rakic April 22, 2025, 7 p.m. UTC | #2
HTEC Public

Hi,

> So I'm not at all concerned about the mips specific bits of this patch.
> After all, they only affect mips ports and the changes seem sensible.
> They would need a ChangeLog entry to go forward through.

> What is concerning is the config.ml change which has no comments about
> what it's doing or justification in the cover letter.

> Similarly it's not clear why we need a blob of mips specific code in
> configure.ac and the files autogenerated from that.

> Jeff

I would like to inform you that the version 2 of this patch is available
at the following link:

https://gcc.gnu.org/pipermail/gcc-patches/2025-March/677811.html

Kind regards,
Aleksandar
  
Aleksandar Rakic May 28, 2025, 12:52 p.m. UTC | #3
HTEC Public

Hi,

Could you please let us know if you have any comments
on the latest reply on this patch?

Kind regards,
Aleksandar Rakic
  

Patch

diff --git a/config-ml.in b/config-ml.in
index 645cac822fd..44bfd616f62 100644
--- a/config-ml.in
+++ b/config-ml.in
@@ -382,6 +382,23 @@  mips*-*-*)
 	    esac
 	  done
 	fi
+	if [ x$with_multi_buildlist != x ]
+	then
+	  old_multidirs="${multidirs}"
+	  if [ ! -f $with_multi_buildlist ]
+	  then
+	    echo "config-ml.in: Failed to find $with_multi_buildlist"
+	    exit 1
+	  fi
+	  multidirs=""
+	  for x in ${old_multidirs}; do
+	    found=`grep "^${x}$" $with_multi_buildlist`
+	    if [ -n "$found" ]
+	    then
+	      multidirs="${multidirs} ${x}"
+	    fi
+	  done
+	fi
 	;;
 msp430-*-*)
 	if [ x$enable_no_exceptions = xno ]
@@ -597,7 +614,8 @@  else
 fi
 
 if [ -z "${with_multisubdir}" ]; then
-  ml_subdir=
+  ml_top_subdir=`${CC-gcc} --print-multi-directory 2>/dev/null`
+  ml_subdir=/$ml_top_subdir
   ml_builddotdot=
   : # ml_srcdotdot= # already set
 else
@@ -676,6 +694,11 @@  if [ -n "${multidirs}" ] && [ -z "${ml_norecursion}" ]; then
 
   for ml_dir in ${multidirs}; do
 
+    if [ "${ml_dir}" == "${ml_top_subdir}" ]; then
+      echo "Skipping configure in multilib subdir ${ml_dir}"
+      continue
+    fi
+
     if [ "${ml_verbose}" = --verbose ]; then
       echo "Running configure in multilib subdir ${ml_dir}"
       echo "pwd: `${PWDCMD-pwd}`"
diff --git a/configure b/configure
index a2e86731b08..c84ce115bea 100755
--- a/configure
+++ b/configure
@@ -11338,6 +11338,31 @@  if test x${enable_multilib} = x ; then
   target_configargs="--enable-multilib ${target_configargs}"
 fi
 
+# Select default multilib build variants
+if test x${with_multi_buildlist} = x ; then
+  case "$target" in
+    mips*-img-linux*) multi_buildlist=${srcdir}/gcc/config/mips/ml-img-linux ;;
+    mips*-mti-linux*) multi_buildlist=${srcdir}/gcc/config/mips/ml-mti-linux ;;
+    mips*-img-elf*) multi_buildlist=${srcdir}/gcc/config/mips/ml-img-elf ;;
+    mips*-mti-elf*) multi_buildlist=${srcdir}/gcc/config/mips/ml-mti-elf ;;
+  esac
+  # Verify the file exists before using it in case the gcc component is not
+  # present in the tree.
+  if test -f "${multi_buildlist}" ; then
+    with_multi_buildlist=$multi_buildlist
+  fi
+fi
+
+# Pass through with_multi_buildlist to host and target.  'gcc' needs it for the
+# fixed includes which are multilib'd and target libraries need it as they use
+# config-ml.in.
+if test x${with_multi_buildlist} != x ; then
+  target_configargs="--with-multi-buildlist=${with_multi_buildlist} \
+  ${target_configargs}"
+  host_configargs="--with-multi-buildlist=${with_multi_buildlist} \
+  ${host_configargs}"
+fi
+
 # Pass --with-newlib if appropriate.  Note that target_configdirs has
 # changed from the earlier setting of with_newlib.
 if test x${with_newlib} != xno && echo " ${target_configdirs} " | grep " newlib " > /dev/null 2>&1 && test -d ${srcdir}/newlib ; then
diff --git a/configure.ac b/configure.ac
index 25419a1d2ab..091707ab6bf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3577,6 +3577,31 @@  if test x${enable_multilib} = x ; then
   target_configargs="--enable-multilib ${target_configargs}"
 fi
 
+# Select default multilib build variants
+if test x${with_multi_buildlist} = x ; then
+  case "$target" in
+    mips*-img-linux*) multi_buildlist=${srcdir}/gcc/config/mips/ml-img-linux ;;
+    mips*-mti-linux*) multi_buildlist=${srcdir}/gcc/config/mips/ml-mti-linux ;;
+    mips*-img-elf*) multi_buildlist=${srcdir}/gcc/config/mips/ml-img-elf ;;
+    mips*-mti-elf*) multi_buildlist=${srcdir}/gcc/config/mips/ml-mti-elf ;;
+  esac
+  # Verify the file exists before using it in case the gcc component is not
+  # present in the tree.
+  if test -f "${multi_buildlist}" ; then
+    with_multi_buildlist=$multi_buildlist
+  fi
+fi
+
+# Pass through with_multi_buildlist to host and target.  'gcc' needs it for the
+# fixed includes which are multilib'd and target libraries need it as they use
+# config-ml.in.
+if test x${with_multi_buildlist} != x ; then
+  target_configargs="--with-multi-buildlist=${with_multi_buildlist} \
+  ${target_configargs}"
+  host_configargs="--with-multi-buildlist=${with_multi_buildlist} \
+  ${host_configargs}"
+fi
+
 # Pass --with-newlib if appropriate.  Note that target_configdirs has
 # changed from the earlier setting of with_newlib.
 if test x${with_newlib} != xno && echo " ${target_configdirs} " | grep " newlib " > /dev/null 2>&1 && test -d ${srcdir}/newlib ; then
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index e8b2a38c8b3..e1a515504ab 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -642,6 +642,9 @@  else
   endif
 endif
 
+# Multilib control
+with_multi_buildlist = @with_multi_buildlist@
+
 # ------------------------
 # Installation directories
 # ------------------------
@@ -3383,10 +3386,27 @@  fixinc_list: s-fixinc_list; @true
 s-fixinc_list : $(GCC_PASSES)
 # Build up a list of multilib directories and corresponding sysroot
 # suffixes, in form sysroot;multilib.
+# Use a filtered multilib list if requested.
 	if $(GCC_FOR_TARGET) -print-sysroot-headers-suffix > /dev/null 2>&1; then \
 	  set -e; for ml in `$(GCC_FOR_TARGET) -print-multi-lib`; do \
 	    multi_dir=`echo $${ml} | sed -e 's/;.*$$//'`; \
 	    flags=`echo $${ml} | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
+	    case "$(target)" in \
+	    mips*-*-*) \
+	      if [ x$(with_multi_buildlist) != x ]; then \
+		if [ ! -f $(with_multi_buildlist) ]; then \
+		  echo "fixinc_list: Failed to find $(with_multi_buildlist)"; \
+		  exit 1; \
+		fi; \
+		set +e; \
+		found=`grep "^$${multi_dir}$$" $(with_multi_buildlist)`; \
+		set -e; \
+		if [ -z "$$found" ]; then \
+		  continue; \
+		fi; \
+	      fi; \
+	      ;; \
+	    esac; \
 	    sfx=`$(GCC_FOR_TARGET) $${flags} -print-sysroot-headers-suffix`; \
 	    if [ "$${multi_dir}" = "." ]; \
 	      then multi_dir=""; \
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 9b616bd6e1f..9ec3001527a 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -2625,22 +2625,24 @@  mips*-*-netbsd*)			# NetBSD/mips, either endian.
 mips*-img-linux*)
 	tm_file="elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h mips/linux-common.h mips/mti-linux.h"
 	extra_options="${extra_options} linux-android.opt"
-	tmake_file="${tmake_file} mips/t-img-linux"
+	tmake_file="${tmake_file} mips/t-mips-multi"
 	tm_defines="${tm_defines} MIPS_ISA_DEFAULT=MIPS_ISA_MIPS32R6 MIPS_ABI_DEFAULT=ABI_32"
 	with_arch_32="mips32r6"
 	with_arch_64="mips64r6"
 	gnu_ld=yes
 	gas=yes
+	TM_MULTILIB_EXCEPTIONS_CONFIG="*mclib=*"
 	;;
 mips*-mti-linux*)
 	tm_file="elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h mips/linux-common.h mips/mti-linux.h"
 	extra_options="${extra_options} linux-android.opt"
-	tmake_file="${tmake_file} mips/t-mti-linux"
+	tmake_file="${tmake_file} mips/t-mips-multi"
 	tm_defines="${tm_defines} MIPS_ISA_DEFAULT=MIPS_ISA_MIPS32R2 MIPS_ABI_DEFAULT=ABI_32"
 	with_arch_32="mips32r2"
 	with_arch_64="mips64r2"
 	gnu_ld=yes
 	gas=yes
+	TM_MULTILIB_EXCEPTIONS_CONFIG="*mclib=*"
 	;;
 mips*-*-linux*)				# Linux MIPS, either endian.
 	tm_file="elfos.h gnu-user.h linux.h linux-android.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/linux.h mips/linux-common.h"
@@ -2705,17 +2707,19 @@  mips*-*-linux*)				# Linux MIPS, either endian.
 	;;
 mips*-mti-elf*)
 	tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/n32-elf.h mips/sde.h mips/mti-elf.h"
-	tmake_file="mips/t-mti-elf"
+	tmake_file="mips/t-mips-multi"
 	tm_defines="${tm_defines} MIPS_ISA_DEFAULT=MIPS_ISA_MIPS32R2 MIPS_ABI_DEFAULT=ABI_32"
 	with_arch_32="mips32r2"
 	with_arch_64="mips64r2"
+	TM_MULTILIB_EXCEPTIONS_CONFIG="*mglibc* *muclibc*"
 	;;
 mips*-img-elf*)
 	tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/n32-elf.h mips/sde.h mips/mti-elf.h"
-	tmake_file="mips/t-img-elf"
+	tmake_file="mips/t-mips-multi"
 	tm_defines="${tm_defines} MIPS_ISA_DEFAULT=MIPS_ISA_MIPS32R6 MIPS_ABI_DEFAULT=ABI_32"
 	with_arch_32="mips32r6"
 	with_arch_64="mips64r6"
+	TM_MULTILIB_EXCEPTIONS_CONFIG="*mglibc* *muclibc* *mandroid*"
 	;;
 mips*-sde-elf*)
 	tm_file="elfos.h newlib-stdint.h ${tm_file} mips/elf.h mips/n32-elf.h mips/sde.h"
diff --git a/gcc/config/mips/ml-img-elf b/gcc/config/mips/ml-img-elf
new file mode 100644
index 00000000000..91204f825ed
--- /dev/null
+++ b/gcc/config/mips/ml-img-elf
@@ -0,0 +1,12 @@ 
+mips-r6-hard-newlib/lib
+mips-r6-hard-newlib/lib32
+mips-r6-hard-newlib/lib64
+mips-r6-soft-newlib/lib
+mips-r6-soft-newlib/lib32
+mips-r6-soft-newlib/lib64
+mipsel-r6-hard-newlib/lib
+mipsel-r6-hard-newlib/lib32
+mipsel-r6-hard-newlib/lib64
+mipsel-r6-soft-newlib/lib
+mipsel-r6-soft-newlib/lib32
+mipsel-r6-soft-newlib/lib64
diff --git a/gcc/config/mips/ml-img-linux b/gcc/config/mips/ml-img-linux
new file mode 100644
index 00000000000..c9a58272f55
--- /dev/null
+++ b/gcc/config/mips/ml-img-linux
@@ -0,0 +1,10 @@ 
+mips-r6-hard/lib
+mips-r6-soft/lib
+mips-r6-hard/lib32
+mips-r6-soft/lib32
+mips-r6-hard/lib64
+mips-r6-soft/lib64
+mipsel-r6-hard/lib
+mipsel-r6-soft/lib
+mipsel-r6-hard/lib32
+mipsel-r6-hard/lib64
diff --git a/gcc/config/mips/ml-mti-elf b/gcc/config/mips/ml-mti-elf
new file mode 100644
index 00000000000..ba61eb3efa6
--- /dev/null
+++ b/gcc/config/mips/ml-mti-elf
@@ -0,0 +1,31 @@ 
+mips-r2-hard-newlib/lib
+mips-r2-hard-newlib/lib32
+mips-r2-hard-newlib/lib64
+mips-r2-hard-nan2008-newlib/lib
+mips-r2-soft-newlib/lib
+mips-r2-soft-newlib/lib32
+mips-r2-soft-newlib/lib64
+mipsel-r2-hard-newlib/lib
+mipsel-r2-hard-newlib/lib32
+mipsel-r2-hard-newlib/lib64
+mipsel-r2-soft-newlib/lib
+mipsel-r2-soft-newlib/lib32
+mipsel-r2-soft-newlib/lib64
+mipsel-r2-mips16-soft-newlib/lib
+mipsel-r2-hard-nan2008-newlib/lib
+micromips-r2-hard-nan2008-newlib/lib
+micromips-r2-soft-newlib/lib
+micromipsel-r2-hard-nan2008-newlib/lib
+micromipsel-r2-soft-newlib/lib
+mips-r6-hard-newlib/lib
+mips-r6-hard-newlib/lib32
+mips-r6-hard-newlib/lib64
+mips-r6-soft-newlib/lib
+mips-r6-soft-newlib/lib32
+mips-r6-soft-newlib/lib64
+mipsel-r6-hard-newlib/lib
+mipsel-r6-hard-newlib/lib32
+mipsel-r6-hard-newlib/lib64
+mipsel-r6-soft-newlib/lib
+mipsel-r6-soft-newlib/lib32
+mipsel-r6-soft-newlib/lib64
diff --git a/gcc/config/mips/ml-mti-linux b/gcc/config/mips/ml-mti-linux
new file mode 100644
index 00000000000..aabd81bceb9
--- /dev/null
+++ b/gcc/config/mips/ml-mti-linux
@@ -0,0 +1,27 @@ 
+mips-r2-hard/lib
+mips-r2-soft/lib
+mips-r2-hard/lib32
+mips-r2-hard/lib64
+mips-r2-hard-nan2008/lib
+mipsel-r1-hard/lib
+mipsel-r2-hard/lib
+mipsel-r2-soft/lib
+mipsel-r2-hard/lib32
+mipsel-r2-hard/lib64
+mipsel-r2-hard-nan2008/lib
+micromipsel-r2-hard-nan2008/lib
+micromipsel-r2-soft/lib
+mips-r2-hard-uclibc/lib
+mips-r2-hard-nan2008-uclibc/lib
+mipsel-r2-hard-uclibc/lib
+mipsel-r2-hard-nan2008-uclibc/lib
+mips-r6-hard/lib
+mips-r6-soft/lib
+mips-r6-hard/lib32
+mips-r6-soft/lib32
+mips-r6-hard/lib64
+mips-r6-soft/lib64
+mipsel-r6-hard/lib
+mipsel-r6-soft/lib
+mipsel-r6-hard/lib32
+mipsel-r6-hard/lib64
diff --git a/gcc/config/mips/mti-elf.h b/gcc/config/mips/mti-elf.h
index 5dd7e2f4f5a..5cd1d30f245 100644
--- a/gcc/config/mips/mti-elf.h
+++ b/gcc/config/mips/mti-elf.h
@@ -17,6 +17,8 @@  You should have received a copy of the GNU General Public License
 along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
+#undef MULTILIB_DEFAULTS
+
 #undef DRIVER_SELF_SPECS
 #define DRIVER_SELF_SPECS						\
   /* Set the ISA for the default multilib.  */				\
diff --git a/gcc/config/mips/mti-linux.h b/gcc/config/mips/mti-linux.h
index a6698d3ad97..eac4228b1c0 100644
--- a/gcc/config/mips/mti-linux.h
+++ b/gcc/config/mips/mti-linux.h
@@ -23,6 +23,8 @@  along with GCC; see the file COPYING3.  If not see
    mips64r3, and mips64r5 will all default to 'r2'.  See MULTILIB_MATCHES
    definition in t-mti-linux.  */
 
+#undef MULTILIB_DEFAULTS
+
 #define MIPS_SYSVERSION_SPEC \
     "%{mips32|mips64:r1;mips32r6|mips64r6:r6;:r2}%{mips16:-mips16}"
 
diff --git a/gcc/config/mips/t-img-elf b/gcc/config/mips/t-img-elf
deleted file mode 100644
index 25d33eda9fb..00000000000
--- a/gcc/config/mips/t-img-elf
+++ /dev/null
@@ -1,33 +0,0 @@ 
-# Copyright (C) 2014-2024 Free Software Foundation, Inc.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-# The default build is mips32r6, hard-float big-endian.
-# A multilib for mips32r6+LE
-# A multilib for mips64r6
-# A multilib for mips64r6+LE
-
-MULTILIB_OPTIONS = mips64r6 mabi=64 EL msoft-float/msingle-float
-MULTILIB_DIRNAMES = mips64r6 64 el sof sgl
-MULTILIB_MATCHES = EL=mel EB=meb
-
-# Don't build 64r6 with single-float
-MULTILIB_EXCEPTIONS += mips64r6/*msingle-float*
-
-MULTILIB_EXCEPTIONS += mabi=64*
-MULTILIB_EXCEPTIONS += msingle-float*
-MULTILIB_EXCEPTIONS += *msingle-float
diff --git a/gcc/config/mips/t-img-linux b/gcc/config/mips/t-img-linux
deleted file mode 100644
index b899080cd37..00000000000
--- a/gcc/config/mips/t-img-linux
+++ /dev/null
@@ -1,38 +0,0 @@ 
-# Copyright (C) 2014-2024 Free Software Foundation, Inc.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-# The default build is mips32r6, hard-float big-endian.  Add mips64r6,
-# 64-bit ABI and little-endian variations.
-
-MULTILIB_OPTIONS = mips64r6 mabi=64 EL
-MULTILIB_DIRNAMES = mips64r6 64 el
-MULTILIB_MATCHES = EL=mel EB=meb
-
-MULTILIB_REQUIRED =
-MULTILIB_OSDIRNAMES = .=mips-r6-hard/lib
-MULTILIB_REQUIRED += mips64r6
-MULTILIB_OSDIRNAMES += mips64r6=!mips-r6-hard/lib32
-MULTILIB_REQUIRED += mips64r6/mabi=64
-MULTILIB_OSDIRNAMES += mips64r6/mabi.64=!mips-r6-hard/lib64
-
-MULTILIB_REQUIRED += EL
-MULTILIB_OSDIRNAMES += EL=!mipsel-r6-hard/lib
-MULTILIB_REQUIRED += mips64r6/EL
-MULTILIB_OSDIRNAMES += mips64r6/EL=!mipsel-r6-hard/lib32
-MULTILIB_REQUIRED += mips64r6/mabi=64/EL
-MULTILIB_OSDIRNAMES += mips64r6/mabi.64/EL=!mipsel-r6-hard/lib64
diff --git a/gcc/config/mips/t-mips-multi b/gcc/config/mips/t-mips-multi
new file mode 100644
index 00000000000..b6797a98811
--- /dev/null
+++ b/gcc/config/mips/t-mips-multi
@@ -0,0 +1,409 @@ 
+# Copyright (C) 2024 Free Software Foundation, Inc.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# There is no default build in this multilib setup.  This
+# unfortunately does not prevent config-ml.in from building a default
+# but this can be removed via post install scripts.
+#
+# All possible MIPS multilibs are shown in this file.  They are
+# limited via a file that lists required multilibs for each vendor/OS
+# combination which can be overridden at build time as well.
+#
+# The benefit to describing all multilibs is that the compiler driver
+# can use any multilib if it is present and therefore additional
+# library variants can be added to an installation after initial
+# build.  This could be achieved by building all libraries and
+# removing the ones we don't want to ship but this would massively
+# increase build times in situations where only a few are required
+# immediately.
+
+MULTILIB_OPTIONS = mclib=small/mclib=tiny/muclibc \
+		   mips32/mips32r2/mips32r6/mips64/mips64r2/mips64r6 \
+				   mips16/mmicromips \
+				   mabi=32/mabi=n32/mabi=64 \
+				   EB/EL \
+				   msoft-float \
+				   mnan=2008
+MULTILIB_DIRNAMES = small tiny uclibc mips32 mips32r2 mips32r6 mips64 \
+		    mips64r2 mips64r6 mips16 micromips 32 n32 64 \
+					eb el sof nan2008
+MULTILIB_MATCHES = EL=mel EB=meb \
+		   mips32r2=mips32r3 mips32r2=mips32r5 \
+				   mips64r2=mips64r3 mips64r2=mips64r5
+
+# Allow the exceptions list to be controlled by configure time options
+MULTILIB_EXCEPTIONS = $(TM_MULTILIB_EXCEPTIONS_CONFIG)
+
+# Determine if this is a bare metal target with a newlib default library
+is_newlib = $(if $(filter elf, $(lastword $(subst -, ,$(target)))),-newlib)
+
+MULTILIB_EXCLUSIONS := !mclib=small/!mclib=tiny/!muclibc/!mips32/!mips32r2
+MULTILIB_EXCLUSIONS := $(MULTILIB_EXCLUSIONS)/!mips32r6/!mips64/!mips64r2
+MULTILIB_EXCLUSIONS := $(MULTILIB_EXCLUSIONS)/!mips64r6/!mips16/!mmicromips
+MULTILIB_EXCLUSIONS := $(MULTILIB_EXCLUSIONS)/!mabi=32/!mabi=n32/!mabi=64/!EB
+MULTILIB_EXCLUSIONS := $(MULTILIB_EXCLUSIONS)/!EL/!msoft-float/!mnan=2008
+
+# MIPS32R6/MIPS64R6
+MULTILIB_REQUIRED   = mips32r6/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES = mips32r6/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-hard$(is_newlib)/lib
+MULTILIB_REUSE      = mips32r6/mabi.32/EB/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r6/mabi.32/EB/mnan.2008
+MULTILIB_REQUIRED   += mips64r6/mabi=n32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r6/mabi.n32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-hard$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r6/mabi=64/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r6/mabi.64/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-hard$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32r6/mabi=32/EB/msoft-float/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r6/mabi.32/EB/msoft-float/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-soft$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r6/mabi.32/EB/msoft-float/mnan.2008=mips64r6
+MULTILIB_REUSE      := $(MULTILIB_REUSE)/mabi.32/EB/msoft-float/mnan.2008
+MULTILIB_REQUIRED   += mips64r6/mabi=n32/EB/msoft-float/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r6/mabi.n32/EB/msoft-float/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-soft$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r6/mabi=64/EB/msoft-float/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r6/mabi.64/EB/msoft-float/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-soft$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32r6/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r6/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-hard$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r6/mabi.32/EL/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r6/mabi.32/EL/mnan.2008
+MULTILIB_REQUIRED   += mips64r6/mabi=n32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r6/mabi.n32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-hard$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r6/mabi=64/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r6/mabi.64/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-hard$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32r6/mabi=32/EL/msoft-float/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r6/mabi.32/EL/msoft-float/mnan.2008=
+MULTILIB_OSDIRNAMES :=$(MULTILIB_OSDIRNAMES)!mipsel-r6-soft$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r6/mabi.32/EL/msoft-float/mnan.2008=mips64r6
+MULTILIB_REUSE      := $(MULTILIB_REUSE)/mabi.32/EL/msoft-float/mnan.2008
+MULTILIB_REQUIRED   += mips64r6/mabi=n32/EL/msoft-float/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r6/mabi.n32/EL/msoft-float/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-soft$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r6/mabi=64/EL/msoft-float/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r6/mabi.64/EL/msoft-float/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-soft$(is_newlib)/lib64
+
+# MIPS32R2/MIPS64R2
+MULTILIB_REQUIRED   += mips32r2/mabi=32/EB
+MULTILIB_OSDIRNAMES += mips32r2/mabi.32/EB=!mips-r2-hard$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r2/mabi.32/EB=mips64r2/mabi.32/EB
+MULTILIB_REQUIRED   += mips64r2/mabi=n32/EB
+MULTILIB_OSDIRNAMES += mips64r2/mabi.n32/EB=!mips-r2-hard$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r2/mabi=64/EB
+MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EB=!mips-r2-hard$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32r2/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r2/mabi.32/EB/mnan.2008=!mips-r2-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r2/mabi.32/EB/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EB/mnan.2008
+MULTILIB_REQUIRED   += mips64r2/mabi=n32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r2/mabi.n32/EB/mnan.2008=!mips-r2-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r2/mabi=64/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EB/mnan.2008=!mips-r2-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32r2/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips32r2/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-soft$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r2/mabi.32/EB/msoft-float=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EB/msoft-float
+MULTILIB_REQUIRED   += mips64r2/mabi=n32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips64r2/mabi.n32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-soft$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r2/mabi=64/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-soft$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32r2/mabi=32/EL
+MULTILIB_OSDIRNAMES += mips32r2/mabi.32/EL=!mipsel-r2-hard$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r2/mabi.32/EL=mips64r2/mabi.32/EL
+MULTILIB_REQUIRED   += mips64r2/mabi=n32/EL
+MULTILIB_OSDIRNAMES += mips64r2/mabi.n32/EL=!mipsel-r2-hard$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r2/mabi=64/EL
+MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EL=!mipsel-r2-hard$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32r2/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r2/mabi.32/EL/mnan.2008=!mipsel-r2-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r2/mabi.32/EL/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EL/mnan.2008
+MULTILIB_REQUIRED   += mips64r2/mabi=n32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r2/mabi.n32/EL/mnan.2008=!mipsel-r2-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r2/mabi=64/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EL/mnan.2008=!mipsel-r2-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32r2/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips32r2/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-soft$(is_newlib)/lib
+MULTILIB_REUSE      += mips32r2/mabi.32/EL/msoft-float=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EL/msoft-float
+MULTILIB_REQUIRED   += mips64r2/mabi=n32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips64r2/mabi.n32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-soft$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64r2/mabi=64/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-soft$(is_newlib)/lib64
+
+# MIPS16 - We will not include any 64 bit mips16 combinations.
+MULTILIB_REQUIRED   += mips32r2/mips16/mabi=32/EB
+MULTILIB_OSDIRNAMES += mips32r2/mips16/mabi.32/EB=!mips-r2-mips16-hard
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REQUIRED   += mips32r2/mips16/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r2/mips16/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-mips16-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REQUIRED   += mips32r2/mips16/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips32r2/mips16/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-mips16-soft
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+
+MULTILIB_REQUIRED   += mips32r2/mips16/mabi=32/EL
+MULTILIB_OSDIRNAMES += mips32r2/mips16/mabi.32/EL=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-mips16-hard
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REQUIRED   += mips32r2/mips16/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r2/mips16/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-mips16-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REQUIRED   += mips32r2/mips16/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips32r2/mips16/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-mips16-soft
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+
+# microMIPS32R3 - We will not include any 64 bit microMIPS combinations
+MULTILIB_REQUIRED   += mips32r2/mmicromips/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r2/mmicromips/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromips-r2-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REQUIRED   += mips32r2/mmicromips/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips32r2/mmicromips/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromips-r2-soft$(is_newlib)/lib
+
+MULTILIB_REQUIRED   += mips32r2/mmicromips/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mips32r2/mmicromips/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromipsel-r2-hard-nan2008
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REQUIRED   += mips32r2/mmicromips/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips32r2/mmicromips/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromipsel-r2-soft
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+
+# Version 1 multilibs
+
+MULTILIB_REQUIRED   += mips32/mabi=32/EB
+MULTILIB_OSDIRNAMES += mips32/mabi.32/EB=!mips-r1-hard$(is_newlib)/lib
+MULTILIB_REUSE      += mips32/mabi.32/EB=mips64/mabi.32/EB
+MULTILIB_REQUIRED   += mips64/mabi=n32/EB
+MULTILIB_OSDIRNAMES += mips64/mabi.n32/EB=!mips-r1-hard$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64/mabi=64/EB
+MULTILIB_OSDIRNAMES += mips64/mabi.64/EB=!mips-r1-hard$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips32/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r1-soft$(is_newlib)/lib
+MULTILIB_REUSE      += mips32/mabi.32/EB/msoft-float=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64/mabi.32/EB/msoft-float
+MULTILIB_REQUIRED   += mips64/mabi=n32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips64/mabi.n32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r1-soft$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64/mabi=64/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips64/mabi.64/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r1-soft$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32/mabi=32/EL
+MULTILIB_OSDIRNAMES += mips32/mabi.32/EL=!mipsel-r1-hard$(is_newlib)/lib
+MULTILIB_REUSE      += mips32/mabi.32/EL=mips64/mabi.32/EL
+MULTILIB_REQUIRED   += mips64/mabi=n32/EL
+MULTILIB_OSDIRNAMES += mips64/mabi.n32/EL=!mipsel-r1-hard$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64/mabi=64/EL
+MULTILIB_OSDIRNAMES += mips64/mabi.64/EL=!mipsel-r1-hard$(is_newlib)/lib64
+
+MULTILIB_REQUIRED   += mips32/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips32/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r1-soft$(is_newlib)/lib
+MULTILIB_REUSE      += mips32/mabi.32/EL/msoft-float=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64/mabi.32/EL/msoft-float
+MULTILIB_REQUIRED   += mips64/mabi=n32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips64/mabi.n32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r1-soft$(is_newlib)/lib32
+MULTILIB_REQUIRED   += mips64/mabi=64/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips64/mabi.64/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r1-soft$(is_newlib)/lib64
+
+# We will not include any 64 bit mips16 combinations.
+MULTILIB_REQUIRED   += mips32/mips16/mabi=32/EB
+MULTILIB_OSDIRNAMES += mips32/mips16/mabi.32/EB=!mips-r1-mips16-hard
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REQUIRED   += mips32/mips16/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mips32/mips16/mabi.32/EB/msoft-float=!mips-r1-mips16-soft
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+
+MULTILIB_REQUIRED   += mips32/mips16/mabi=32/EL
+MULTILIB_OSDIRNAMES += mips32/mips16/mabi.32/EL=!mipsel-r1-mips16-hard
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+MULTILIB_REQUIRED   += mips32/mips16/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mips32/mips16/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r1-mips16-soft
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)$(is_newlib)/lib
+
+# Uclibc variants
+MULTILIB_REQUIRED   += muclibc/mips32r2/mabi=32/EB
+MULTILIB_OSDIRNAMES += muclibc/mips32r2/mabi.32/EB=!mips-r2-hard-uclibc/lib
+MULTILIB_REUSE      += muclibc/mips32r2/mabi.32/EB=muclibc/mips64r2/mabi.32/EB
+MULTILIB_REQUIRED   += muclibc/mips32r2/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += muclibc/mips32r2/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-hard-nan2008-uclibc/lib
+MULTILIB_REUSE      += muclibc/mips32r2/mabi.32/EB/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)muclibc/mips64r2/mabi.32/EB/mnan.2008
+
+MULTILIB_REQUIRED   += muclibc/mips32r2/mabi=32/EL
+MULTILIB_OSDIRNAMES += muclibc/mips32r2/mabi.32/EL=!mipsel-r2-hard-uclibc/lib
+MULTILIB_REUSE      += muclibc/mips32r2/mabi.32/EL=muclibc/mips64r2/mabi.32/EL
+MULTILIB_REQUIRED   += muclibc/mips32r2/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += muclibc/mips32r2/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-hard-nan2008-uclibc/lib
+MULTILIB_REUSE      += muclibc/mips32r2/mabi.32/EL/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)muclibc/mips64r2/mabi.32/EL/mnan.2008
+
+# MIPS Small/Tiny C library variants
+MULTILIB_REQUIRED   += mclib=small/mips32r6/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.small/mips32r6/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-hard-small/lib
+MULTILIB_REUSE      += mclib.small/mips32r6/mabi.32/EB/mnan.2008=mclib.small/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r6/mabi.32/EB/mnan.2008
+MULTILIB_REQUIRED   += mclib=small/mips32r6/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.small/mips32r6/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-hard-small/lib
+MULTILIB_REUSE      += mclib.small/mips32r6/mabi.32/EL/mnan.2008=mclib.small/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r6/mabi.32/EL/mnan.2008
+MULTILIB_REQUIRED   += mclib=small/mips32r6/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mclib.small/mips32r6/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-soft-small/lib
+MULTILIB_REUSE      += mclib.small/mips32r6/mabi.32/EB/msoft-float=mclib.small/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r6/mabi.32/EB/msoft-float
+MULTILIB_REQUIRED   += mclib=small/mips32r6/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mclib.small/mips32r6/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-soft-small/lib
+MULTILIB_REUSE      += mclib.small/mips32r6/mabi.32/EL/msoft-float=mclib.small/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r6/mabi.32/EL/msoft-float
+
+MULTILIB_REQUIRED   += mclib=small/mips32r2/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.small/mips32r2/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-hard-nan2008-small/lib
+MULTILIB_REUSE      += mclib.small/mips32r2/mabi.32/EB/mnan.2008=mclib.small/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EB/mnan.2008
+MULTILIB_REQUIRED   += mclib=small/mips32r2/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.small/mips32r2/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-hard-nan2008-small/lib
+MULTILIB_REUSE      += mclib.small/mips32r2/mabi.32/EL/mnan.2008=mclib.small/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EL/mnan.2008
+MULTILIB_REQUIRED   += mclib=small/mips32r2/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mclib.small/mips32r2/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-soft-small/lib
+MULTILIB_REUSE      += mclib.small/mips32r2/mabi.32/EB/msoft-float=mclib.small/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EB/msoft-float
+MULTILIB_REQUIRED   += mclib=small/mips32r2/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mclib.small/mips32r2/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-soft-small/lib
+MULTILIB_REUSE      += mclib.small/mips32r2/mabi.32/EL/msoft-float=mclib.small/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EL/msoft-float
+
+MULTILIB_REQUIRED   += mclib=tiny/mips32r6/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r6/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-hard-tiny/lib
+MULTILIB_REUSE      += mclib.tiny/mips32r6/mabi.32/EB/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mclib.tiny/mips64r6/mabi.32/EB/mnan.2008
+MULTILIB_REQUIRED   += mclib=tiny/mips32r6/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r6/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-hard-tiny/lib
+MULTILIB_REUSE      += mclib.tiny/mips32r6/mabi.32/EL/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mclib.tiny/mips64r6/mabi.32/EL/mnan.2008
+MULTILIB_REQUIRED   += mclib=tiny/mips32r6/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r6/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r6-soft-tiny/lib
+MULTILIB_REUSE      += mclib.tiny/mips32r6/mabi.32/EB/msoft-float=mclib.tiny/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r6/mabi.32/EB/msoft-float
+MULTILIB_REQUIRED   += mclib=tiny/mips32r6/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r6/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r6-soft-tiny/lib
+MULTILIB_REUSE      += mclib.tiny/mips32r6/mabi.32/EL/msoft-float=mclib.tiny/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r6/mabi.32/EL/msoft-float
+
+MULTILIB_REQUIRED   += mclib=tiny/mips32r2/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r2/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-hard-nan2008-tiny/lib
+MULTILIB_REUSE      += mclib.tiny/mips32r2/mabi.32/EB/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mclib.tiny/mips64r2/mabi.32/EB/mnan.2008
+MULTILIB_REQUIRED   += mclib=tiny/mips32r2/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r2/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-hard-nan2008-tiny/lib
+MULTILIB_REUSE      += mclib.tiny/mips32r2/mabi.32/EL/mnan.2008=
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mclib.tiny/mips64r2/mabi.32/EL/mnan.2008
+MULTILIB_REQUIRED   += mclib=tiny/mips32r2/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r2/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mips-r2-soft-tiny/lib
+MULTILIB_REUSE      += mclib.tiny/mips32r2/mabi.32/EB/msoft-float=mclib.tiny/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EB/msoft-float
+MULTILIB_REQUIRED   += mclib=tiny/mips32r2/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r2/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!mipsel-r2-soft-tiny/lib
+MULTILIB_REUSE      += mclib.tiny/mips32r2/mabi.32/EL/msoft-float=mclib.tiny/
+MULTILIB_REUSE      := $(MULTILIB_REUSE)mips64r2/mabi.32/EL/msoft-float
+
+# microMIPS Small/Tiny C library variants
+MULTILIB_REQUIRED   += mclib=small/mips32r2/mmicromips/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.small/mips32r2/mmicromips/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromips-r2-hard-nan2008-small
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)/lib
+MULTILIB_REQUIRED   += mclib=small/mips32r2/mmicromips/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.small/mips32r2/mmicromips/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromipsel-r2-hard-nan2008-small
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)/lib
+MULTILIB_REQUIRED   += mclib=small/mips32r2/mmicromips/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mclib.small/mips32r2/mmicromips/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromips-r2-soft-small/lib
+MULTILIB_REQUIRED   += mclib=small/mips32r2/mmicromips/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mclib.small/mips32r2/mmicromips/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromipsel-r2-soft-small/lib
+
+MULTILIB_REQUIRED   += mclib=tiny/mips32r2/mmicromips/mabi=32/EB/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r2/mmicromips/mabi.32/EB/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromips-r2-hard-nan2008-tiny/lib
+MULTILIB_REQUIRED   += mclib=tiny/mips32r2/mmicromips/mabi=32/EL/mnan=2008
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r2/mmicromips/mabi.32/EL/mnan.2008=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromipsel-r2-hard-nan2008-tiny
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)/lib
+MULTILIB_REQUIRED   += mclib=tiny/mips32r2/mmicromips/mabi=32/EB/msoft-float
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r2/mmicromips/mabi.32/EB/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromips-r2-soft-tiny/lib
+MULTILIB_REQUIRED   += mclib=tiny/mips32r2/mmicromips/mabi=32/EL/msoft-float
+MULTILIB_OSDIRNAMES += mclib.tiny/mips32r2/mmicromips/mabi.32/EL/msoft-float=
+MULTILIB_OSDIRNAMES := $(MULTILIB_OSDIRNAMES)!micromipsel-r2-soft-tiny/lib
diff --git a/gcc/config/mips/t-mti-elf b/gcc/config/mips/t-mti-elf
deleted file mode 100644
index 9655397e4de..00000000000
--- a/gcc/config/mips/t-mti-elf
+++ /dev/null
@@ -1,48 +0,0 @@ 
-# Copyright (C) 2012-2024 Free Software Foundation, Inc.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-# The default build is mips32r2, hard-float big-endian.  Add mips32,
-# soft-float, and little-endian variations.
-
-MULTILIB_OPTIONS = mips32/mips64/mips64r2 mips16/mmicromips mabi=64 EL msoft-float mnan=2008
-MULTILIB_DIRNAMES = mips32 mips64 mips64r2 mips16 micromips 64 el sof nan2008
-MULTILIB_MATCHES = EL=mel EB=meb mips32r2=mips32r3 mips32r2=mips32r5 mips64r2=mips64r3 mips64r2=mips64r5
-
-# The 64 bit ABI is not supported on the mips32 architecture.
-MULTILIB_EXCEPTIONS += *mips32*/*mabi=64*
-
-# The 64 bit ABI is not supported on the mips32r2 architecture.
-# Because mips32r2 is the default we can't use that flag to trigger
-# the exception so we check for mabi=64 with no specific mips
-# architecture flag instead.
-MULTILIB_EXCEPTIONS += mabi=64*
-
-# We do not want to build mips16 versions of mips64* architectures.
-MULTILIB_EXCEPTIONS += *mips64*/*mips16*
-MULTILIB_EXCEPTIONS += *mips16/mabi=64*
-
-# We only want micromips for mips32r2 architecture.
-MULTILIB_EXCEPTIONS += *mips32/mmicromips*
-MULTILIB_EXCEPTIONS += *mips64*/mmicromips*
-MULTILIB_EXCEPTIONS += *mmicromips/mabi=64*
-
-# We do not want nan2008 libraries for soft-float,
-# mips32[r1], or mips64[r1].
-MULTILIB_EXCEPTIONS += *msoft-float*/*mnan=2008*
-MULTILIB_EXCEPTIONS += *mips32/*mnan=2008*
-MULTILIB_EXCEPTIONS += *mips64/*mnan=2008*
diff --git a/gcc/config/mips/t-mti-linux b/gcc/config/mips/t-mti-linux
deleted file mode 100644
index 4919fd9bc45..00000000000
--- a/gcc/config/mips/t-mti-linux
+++ /dev/null
@@ -1,158 +0,0 @@ 
-# Copyright (C) 2012-2024 Free Software Foundation, Inc.
-#
-# 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-# The default build is mips32r2, hard-float big-endian.  Add mips32,
-# soft-float, and little-endian variations.
-
-MULTILIB_OPTIONS = mips32/mips64/mips64r2 mips16/mmicromips mabi=64 EL msoft-float mnan=2008
-MULTILIB_DIRNAMES = mips32 mips64 mips64r2 mips16 micromips 64 el sof nan2008
-MULTILIB_MATCHES = EL=mel EB=meb mips32r2=mips32r3 mips32r2=mips32r5 mips64r2=mips64r3 mips64r2=mips64r5
-
-MULTILIB_REQUIRED    =
-MULTILIB_OSDIRNAMES  = .=mips-r2-hard/lib
-MULTILIB_REQUIRED   += mips64r2
-MULTILIB_OSDIRNAMES += mips64r2=!mips-r2-hard/lib32
-MULTILIB_REQUIRED   += mips64r2/mabi=64
-MULTILIB_OSDIRNAMES += mips64r2/mabi.64=!mips-r2-hard/lib64
-
-MULTILIB_REQUIRED   += mnan=2008
-MULTILIB_OSDIRNAMES += mnan.2008=!mips-r2-hard-nan2008/lib
-MULTILIB_REQUIRED   += mips64r2/mnan=2008
-MULTILIB_OSDIRNAMES += mips64r2/mnan.2008=!mips-r2-hard-nan2008/lib32
-MULTILIB_REQUIRED   += mips64r2/mabi=64/mnan=2008
-MULTILIB_OSDIRNAMES += mips64r2/mabi.64/mnan.2008=!mips-r2-hard-nan2008/lib64
-
-MULTILIB_REQUIRED   += msoft-float
-MULTILIB_OSDIRNAMES += msoft-float=!mips-r2-soft/lib
-MULTILIB_REQUIRED   += mips64r2/msoft-float
-MULTILIB_OSDIRNAMES += mips64r2/msoft-float=!mips-r2-soft/lib32
-MULTILIB_REQUIRED   += mips64r2/mabi=64/msoft-float
-MULTILIB_OSDIRNAMES += mips64r2/mabi.64/msoft-float=!mips-r2-soft/lib64
-
-#MULTILIB_REQUIRED   += msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += msoft-float/mnan.2008=!mips-r2-soft-nan2008/lib
-#MULTILIB_REQUIRED   += mips64r2/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += mips64r2/msoft-float/mnan.2008=!mips-r2-soft-nan2008/lib32
-#MULTILIB_REQUIRED   += mips64r2/mabi=64/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += mips64r2/mabi.64/msoft-float/mnan.2008=!mips-r2-soft-nan2008/lib64
-
-MULTILIB_REQUIRED   += EL
-MULTILIB_OSDIRNAMES += EL=!mipsel-r2-hard/lib
-MULTILIB_REQUIRED   += mips64r2/EL
-MULTILIB_OSDIRNAMES += mips64r2/EL=!mipsel-r2-hard/lib32
-MULTILIB_REQUIRED   += mips64r2/mabi=64/EL
-MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EL=!mipsel-r2-hard/lib64
-
-MULTILIB_REQUIRED   += EL/mnan=2008
-MULTILIB_OSDIRNAMES += EL/mnan.2008=!mipsel-r2-hard-nan2008/lib
-MULTILIB_REQUIRED   += mips64r2/EL/mnan=2008
-MULTILIB_OSDIRNAMES += mips64r2/EL/mnan.2008=!mipsel-r2-hard-nan2008/lib32
-MULTILIB_REQUIRED   += mips64r2/mabi=64/EL/mnan=2008
-MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EL/mnan.2008=!mipsel-r2-hard-nan2008/lib64
-
-MULTILIB_REQUIRED   += EL/msoft-float
-MULTILIB_OSDIRNAMES += EL/msoft-float=!mipsel-r2-soft/lib
-MULTILIB_REQUIRED   += mips64r2/EL/msoft-float
-MULTILIB_OSDIRNAMES += mips64r2/EL/msoft-float=!mipsel-r2-soft/lib32
-MULTILIB_REQUIRED   += mips64r2/mabi=64/EL/msoft-float
-MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EL/msoft-float=!mipsel-r2-soft/lib64
-
-#MULTILIB_REQUIRED   += EL/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += EL/msoft-float/mnan.2008=!mipsel-r2-soft-nan2008/lib
-#MULTILIB_REQUIRED   += mips64r2/EL/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += mips64r2/EL/msoft-float/mnan.2008=!mipsel-r2-soft-nan2008/lib32
-#MULTILIB_REQUIRED   += mips64r2/mabi=64/EL/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += mips64r2/mabi.64/EL/msoft-float/mnan.2008=!mipsel-r2-soft-nan2008/lib64
-
-# We will not include any 64 bit mips16 combinations.
-MULTILIB_REQUIRED   += mips16
-MULTILIB_OSDIRNAMES += mips16=!mips-r2-mips16-hard/lib
-MULTILIB_REQUIRED   += mips16/mnan=2008
-MULTILIB_OSDIRNAMES += mips16/mnan.2008=!mips-r2-mips16-hard-nan2008/lib
-MULTILIB_REQUIRED   += mips16/msoft-float
-MULTILIB_OSDIRNAMES += mips16/msoft-float=!mips-r2-mips16-soft/lib
-#MULTILIB_REQUIRED   += mips16/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += mips16/msoft-float/mnan.2008=!mips-r2-mips16-soft-nan2008/lib
-
-MULTILIB_REQUIRED   += mips16/EL
-MULTILIB_OSDIRNAMES += mips16/EL=!mipsel-r2-mips16-hard/lib
-MULTILIB_REQUIRED   += mips16/EL/mnan=2008
-MULTILIB_OSDIRNAMES += mips16/EL/mnan.2008=!mipsel-r2-mips16-hard-nan2008/lib
-MULTILIB_REQUIRED   += mips16/EL/msoft-float
-MULTILIB_OSDIRNAMES += mips16/EL/msoft-float=!mipsel-r2-mips16-soft/lib
-#MULTILIB_REQUIRED   += mips16/EL/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += mips16/EL/msoft-float/mnan.2008=!mipsel-r2-mips16-soft-nan2008/lib
-
-MULTILIB_REQUIRED   += mmicromips
-MULTILIB_OSDIRNAMES += mmicromips=!micromips-r2-hard/lib
-MULTILIB_REQUIRED   += mmicromips/mnan=2008
-MULTILIB_OSDIRNAMES += mmicromips/mnan.2008=!micromips-r2-hard-nan2008/lib
-MULTILIB_REQUIRED   += mmicromips/msoft-float
-MULTILIB_OSDIRNAMES += mmicromips/msoft-float=!micromips-r2-soft/lib
-#MULTILIB_REQUIRED   += mmicromips/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += mmicromips/msoft-float/mnan.2008=!micromips-r2-soft-nan2008/lib
-
-MULTILIB_REQUIRED   += mmicromips/EL
-MULTILIB_OSDIRNAMES += mmicromips/EL=!micromipsel-r2-hard/lib
-MULTILIB_REQUIRED   += mmicromips/EL/mnan=2008
-MULTILIB_OSDIRNAMES += mmicromips/EL/mnan.2008=!micromipsel-r2-hard-nan2008/lib
-MULTILIB_REQUIRED   += mmicromips/EL/msoft-float
-MULTILIB_OSDIRNAMES += mmicromips/EL/msoft-float=!micromipsel-r2-soft/lib
-#MULTILIB_REQUIRED   += mmicromips/EL/msoft-float/mnan=2008
-#MULTILIB_OSDIRNAMES += mmicromips/EL/msoft-float/mnan.2008=!micromipsel-r2-soft-nan2008/lib
-
-# Version 1 multilibs
-
-MULTILIB_REQUIRED   += mips32
-MULTILIB_OSDIRNAMES += mips32=!mips-r1-hard/lib
-MULTILIB_REQUIRED   += mips64
-MULTILIB_OSDIRNAMES += mips64=!mips-r1-hard/lib32
-MULTILIB_REQUIRED   += mips64/mabi=64
-MULTILIB_OSDIRNAMES += mips64/mabi.64=!mips-r1-hard/lib64
-
-MULTILIB_REQUIRED   += mips32/msoft-float
-MULTILIB_OSDIRNAMES += mips32/msoft-float=!mips-r1-soft/lib
-MULTILIB_REQUIRED   += mips64/msoft-float
-MULTILIB_OSDIRNAMES += mips64/msoft-float=!mips-r1-soft/lib32
-MULTILIB_REQUIRED   += mips64/mabi=64/msoft-float
-MULTILIB_OSDIRNAMES += mips64/mabi.64/msoft-float=!mips-r1-soft/lib64
-
-MULTILIB_REQUIRED   += mips32/EL
-MULTILIB_OSDIRNAMES += mips32/EL=!mipsel-r1-hard/lib
-MULTILIB_REQUIRED   += mips64/EL
-MULTILIB_OSDIRNAMES += mips64/EL=!mipsel-r1-hard/lib32
-MULTILIB_REQUIRED   += mips64/mabi=64/EL
-MULTILIB_OSDIRNAMES += mips64/mabi.64/EL=!mipsel-r1-hard/lib64
-
-MULTILIB_REQUIRED   += mips32/EL/msoft-float
-MULTILIB_OSDIRNAMES += mips32/EL/msoft-float=!mipsel-r1-soft/lib
-MULTILIB_REQUIRED   += mips64/EL/msoft-float
-MULTILIB_OSDIRNAMES += mips64/EL/msoft-float=!mipsel-r1-soft/lib32
-MULTILIB_REQUIRED   += mips64/mabi=64/EL/msoft-float
-MULTILIB_OSDIRNAMES += mips64/mabi.64/EL/msoft-float=!mipsel-r1-soft/lib64
-
-# We will not include any 64 bit mips16 combinations.
-MULTILIB_REQUIRED   += mips32/mips16
-MULTILIB_OSDIRNAMES += mips32/mips16=!mips-r1-mips16-hard/lib
-MULTILIB_REQUIRED   += mips32/mips16/msoft-float
-MULTILIB_OSDIRNAMES += mips32/mips16/msoft-float=!mips-r1-mips16-soft/lib
-
-MULTILIB_REQUIRED   += mips32/mips16/EL
-MULTILIB_OSDIRNAMES += mips32/mips16/EL=!mipsel-r1-mips16-hard/lib
-MULTILIB_REQUIRED   += mips32/mips16/EL/msoft-float
-MULTILIB_OSDIRNAMES += mips32/mips16/EL/msoft-float=!mipsel-r1-mips16-soft/lib
diff --git a/gcc/configure b/gcc/configure
index 150ab616414..1341e1cbd3f 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -853,6 +853,7 @@  enable_fixed_point
 enable_decimal_float
 DEFAULT_INSNEMIT_PARTITIONS
 DEFAULT_MATCHPD_PARTITIONS
+with_multi_buildlist
 with_float
 with_cpu
 enable_multiarch
@@ -7870,6 +7871,9 @@  $as_echo "$enable_multiarch$ma_msg_suffix" >&6; }
 
 
 
+# needed for restricting the fixedincludes multilibs that we install
+
+
 # default stack clash protection guard size as power of twos in bytes.
 # Please keep these in sync with params.def.
 stk_clash_min=12
@@ -21454,7 +21458,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 21457 "configure"
+#line 21461 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -21560,7 +21564,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 21563 "configure"
+#line 21567 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
diff --git a/gcc/configure.ac b/gcc/configure.ac
index bdb22d53e2c..ee98191411e 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -877,6 +877,9 @@  AC_MSG_RESULT($enable_multiarch$ma_msg_suffix)
 AC_SUBST(with_cpu)
 AC_SUBST(with_float)
 
+# needed for restricting the fixedincludes multilibs that we install
+AC_SUBST(with_multi_buildlist)
+
 # default stack clash protection guard size as power of twos in bytes.
 # Please keep these in sync with params.def.
 stk_clash_min=12
diff --git a/gcc/genmultilib b/gcc/genmultilib
index 85b241cd72a..5df8148e031 100644
--- a/gcc/genmultilib
+++ b/gcc/genmultilib
@@ -500,9 +500,6 @@  for rrule in ${multilib_reuse}; do
       echo "The rule ${rrule} contains an option absent from MULTILIB_OPTIONS." >&2
       exit 1
     fi
-  else
-    echo "The rule ${rrule} is trying to reuse nonexistent multilib." >&2
-    exit 1
   fi
 done