Patchwork [mips] New mips triplet for multilib linux builds

login
register
mail settings
Submitter Steve Ellcey
Date Sept. 7, 2012, 10:34 p.m.
Message ID <1347057281.14333.282.camel@ubuntu-sellcey>
Download mbox | patch
Permalink /patch/182474/
State New
Headers show

Comments

Steve Ellcey - Sept. 7, 2012, 10:34 p.m.
On Fri, 2012-09-07 at 07:52 +0100, Richard Sandiford wrote:

> MIPS_ABI_DEFAULT and MIPS_ISA_DEFAULT are better set in config.gcc.
> That also allows you to handle (say) mipsisa32-mti-linux-gnu vs.
> mipsisa64-mti-linux-gnu.
> 
> I think in general we want more specific header files to come after
> less specific ones, so that the more specific ones can override
> whatever they like.  E.g. the order for the generic config/ *.hs
> is "elfos.h gnu-user.h linux.h" and the order for the MIPS ones
> is "mips.h gnu-user.h gnu-user64.h linux64.h".  linux-common.h
> coming after linux64.h is an odd-one-out really.
> 
> Richard

OK, here is my latest patch.  The only thing I am not sure about is that
you asked me to try building with '--with-arch=mips64 --with-float=hard'
to see if it did something sensible.  I am not sure what sensible is.  I
am building a cross compiler and when I built with these options the GCC
would generate mips64 code by default.  But then the build would fail
because that setup did not match the sysroot that I had built with
mips32r2 as the default set of libraries.  I don't know if that is
considered sensible or not.

Steve Ellcey
sellcey@mips.com


2012-09-07  Steve Ellcey  <sellcey@mips.com>

	* config.gcc: Add mips*-mti-linux* target
	Handle with_synci like other options.
	* config/mips/gnu-user64.h (LINUX64_DRIVER_SELF_SPECS): New.
	(DRIVER_SELF_SPECS): Define in terms of LINUX64_DRIVER_SELF_SPECS.
	* config/mips/mips.h (MIPS_ISA_SYNCI_SPEC): New.
	* mti-linux.h: New file.
	* t-mti-linux: New file.
Richard Sandiford - Sept. 8, 2012, 12:50 p.m.
Steve Ellcey <sellcey@mips.com> writes:
> On Fri, 2012-09-07 at 07:52 +0100, Richard Sandiford wrote:
>
>> MIPS_ABI_DEFAULT and MIPS_ISA_DEFAULT are better set in config.gcc.
>> That also allows you to handle (say) mipsisa32-mti-linux-gnu vs.
>> mipsisa64-mti-linux-gnu.
>> 
>> I think in general we want more specific header files to come after
>> less specific ones, so that the more specific ones can override
>> whatever they like.  E.g. the order for the generic config/ *.hs
>> is "elfos.h gnu-user.h linux.h" and the order for the MIPS ones
>> is "mips.h gnu-user.h gnu-user64.h linux64.h".  linux-common.h
>> coming after linux64.h is an odd-one-out really.
>> 
>> Richard
>
> OK, here is my latest patch.  The only thing I am not sure about is that
> you asked me to try building with '--with-arch=mips64 --with-float=hard'
> to see if it did something sensible.  I am not sure what sensible is.  I
> am building a cross compiler and when I built with these options the GCC
> would generate mips64 code by default.  But then the build would fail
> because that setup did not match the sysroot that I had built with
> mips32r2 as the default set of libraries.  I don't know if that is
> considered sensible or not.

Well, it sounds a bit odd.  Specs are applied in the order:

  OPTION_DEFAULT_SPEC
  DRIVER_SELF_SPECS
  SYSROOT_SUFFIX_SPEC

so I would have hoped even OPTION_DEFAULT_SPEC -mips64s would cause the
right sysroot suffix to be chosen.

> +#undef DRIVER_SELF_SPECS
> +#define DRIVER_SELF_SPECS						\
> +  /* Make sure a -mips option is present.  This helps us to pick	\
> +     the right multilib, and also makes the later specs easier		\
> +     to write.  */							\
> +  MIPS_ISA_LEVEL_SPEC,							\
> +									\
> +  /* Infer the default float setting from -march.  */			\
> +  MIPS_ARCH_FLOAT_SPEC,							\
> +									\
> +  /* Infer the -msynci setting from -march if not explicitly set.  */	\
> +  MIPS_ISA_SYNCI_SPEC,							\
> +									\
> +  /* Use the standard linux specs for everything else.  */		\
> +  LINUX64_DRIVER_SELF_SPECS

Should add BASE_DRIVER_SELF_SPECS too.  OK with that change, thanks.
And thanks for your patience.

Richard
Steve Ellcey - Sept. 10, 2012, 5:29 p.m.
On Sat, 2012-09-08 at 13:50 +0100, Richard Sandiford wrote:

> Should add BASE_DRIVER_SELF_SPECS too.  OK with that change, thanks.
> And thanks for your patience.
> 
> Richard

I added BASE_DRIVER_SELF_SPECS and did the checkin.  Thanks for all
your help and advice.

Steve Ellcey
sellcey@mips.com

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 9ec8a41..23e2bc5 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1685,6 +1685,14 @@  mips*-*-netbsd*)			# NetBSD/mips, either endian.
 	tm_file="elfos.h ${tm_file} mips/elf.h netbsd.h netbsd-elf.h mips/netbsd.h"
 	extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
 	;;
+mips*-mti-linux*)
+	tm_file="dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h mips/mti-linux.h"
+	tmake_file="${tmake_file} mips/t-mti-linux"
+	tm_defines="${tm_defines} MIPS_ISA_DEFAULT=33 MIPS_ABI_DEFAULT=ABI_32"
+	gnu_ld=yes
+	gas=yes
+	test x$with_llsc != x || with_llsc=yes
+	;;
 mips64*-*-linux* | mipsisa64*-*-linux*)
 	tm_file="dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h"
 	tmake_file="${tmake_file} mips/t-linux64"
@@ -3262,10 +3270,11 @@  case "${target}" in
 		yes)
 			with_synci=synci
 			;;
-		"" | no)
-			# No is the default.
+		no)
 			with_synci=no-synci
 			;;
+		"")
+			;;
 		*)
 			echo "Unknown synci type used in --with-synci" 1>&2
 			exit 1
diff --git a/gcc/config/mips/gnu-user64.h b/gcc/config/mips/gnu-user64.h
index ad59ba4..7c2187f 100644
--- a/gcc/config/mips/gnu-user64.h
+++ b/gcc/config/mips/gnu-user64.h
@@ -20,13 +20,17 @@  along with GCC; see the file COPYING3.  If not see
 
 /* Force the default endianness and ABI flags onto the command line
    in order to make the other specs easier to write.  */
-#undef DRIVER_SELF_SPECS
-#define DRIVER_SELF_SPECS \
-  BASE_DRIVER_SELF_SPECS, \
+
+#define LINUX64_DRIVER_SELF_SPECS \
   LINUX_DRIVER_SELF_SPECS \
   " %{!EB:%{!EL:%(endian_spec)}}" \
   " %{!mabi=*: -" MULTILIB_ABI_DEFAULT "}"
 
+#undef DRIVER_SELF_SPECS
+#define DRIVER_SELF_SPECS \
+  BASE_DRIVER_SELF_SPECS, \
+  LINUX64_DRIVER_SELF_SPECS
+
 #undef GNU_USER_TARGET_LINK_SPEC
 #define GNU_USER_TARGET_LINK_SPEC "\
 %{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} %{mips4} \
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 9ce466d..e04f099 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -728,6 +728,11 @@  struct mips_cpu_info {
 #define MIPS_32BIT_OPTION_SPEC \
   "mips1|mips2|mips32*|mgp32"
 
+/* Infer a -msynci setting from a -mips argument, on the assumption that
+   -msynci is desired where possible.  */
+#define MIPS_ISA_SYNCI_SPEC \
+  "%{msynci|mno-synci:;:%{mips32r2|mips64r2:-msynci;:-mno-synci}}"
+
 #if MIPS_ABI_DEFAULT == ABI_O64 \
   || MIPS_ABI_DEFAULT == ABI_N32 \
   || MIPS_ABI_DEFAULT == ABI_64
@@ -762,7 +767,6 @@  struct mips_cpu_info {
   {"mips-plt", "%{!mplt:%{!mno-plt:-m%(VALUE)}}" }, \
   {"synci", "%{!msynci:%{!mno-synci:-m%(VALUE)}}" }
 
-
 /* A spec that infers the -mdsp setting from an -march argument.  */
 #define BASE_DRIVER_SELF_SPECS \
   "%{!mno-dsp: \
diff --git a/gcc/config/mips/mti-linux.h b/gcc/config/mips/mti-linux.h
new file mode 100644
index 0000000..7b1f3f4
--- /dev/null
+++ b/gcc/config/mips/mti-linux.h
@@ -0,0 +1,40 @@ 
+/* Target macros for mips*-mti-linux* targets.
+   Copyright (C) 2012
+   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/>.  */
+
+/* This target is a multilib target, specify the sysroot paths.  */
+#undef SYSROOT_SUFFIX_SPEC
+#define SYSROOT_SUFFIX_SPEC \
+    "%{mips32:/mips32}%{mips64:/mips64}%{mips64r2:/mips64r2}%{msoft-float:/sof}%{mel|EL:/el}%{mabi=64:/64}%{mabi=n32:/n32}"
+
+#undef DRIVER_SELF_SPECS
+#define DRIVER_SELF_SPECS						\
+  /* Make sure a -mips option is present.  This helps us to pick	\
+     the right multilib, and also makes the later specs easier		\
+     to write.  */							\
+  MIPS_ISA_LEVEL_SPEC,							\
+									\
+  /* Infer the default float setting from -march.  */			\
+  MIPS_ARCH_FLOAT_SPEC,							\
+									\
+  /* Infer the -msynci setting from -march if not explicitly set.  */	\
+  MIPS_ISA_SYNCI_SPEC,							\
+									\
+  /* Use the standard linux specs for everything else.  */		\
+  LINUX64_DRIVER_SELF_SPECS
diff --git a/gcc/config/mips/t-mti-linux b/gcc/config/mips/t-mti-linux
new file mode 100644
index 0000000..ba11706
--- /dev/null
+++ b/gcc/config/mips/t-mti-linux
@@ -0,0 +1,24 @@ 
+# Copyright (C) 2012 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 msoft-float EL
+MULTILIB_DIRNAMES = mips32 mips64 mips64r2 sof el
+MULTILIB_MATCHES = EL=mel EB=meb