Re: [patch, mips] New mips triplet for multilib linux builds
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 sell...@mips.com
Re: [patch, mips] New mips triplet for multilib linux builds
Steve Ellcey sell...@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
Re: [patch, mips] New mips triplet for multilib linux builds
Steve Ellcey sell...@mips.com writes: On Thu, 2012-09-06 at 06:47 +0100, Richard Sandiford wrote: Is this an 'if-then-else' usage? Yeah, but I typoed, sorry. It should be: %{mips32r2|mips64r2:-msynci;:-mno-synci} Richard OK, I got that working now. I am still having some issues though. My original patch was setup to include mti-linux.h before mips.h and I think that is good for setting MIPS_ABI_DEFAULT and MIPS_ISA_DEFAULT because mips.h is going to look and see if those values are set. But now that I am setting DRIVER_SELF_SPECS in the header it seems like I should include it after mips.h (so I can override the setting of DRIVER_SELF_SPECS in mips.h). Do I need two header files? One to include before mips.h and one to include after mips.h? 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
Re: [patch, mips] New mips triplet for multilib linux builds
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 sell...@mips.com 2012-09-07 Steve Ellcey sell...@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. 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 12 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 000..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
Re: [patch, mips] New mips triplet for multilib linux builds
On Thu, 2012-09-06 at 06:47 +0100, Richard Sandiford wrote: Is this an 'if-then-else' usage? Yeah, but I typoed, sorry. It should be: %{mips32r2|mips64r2:-msynci;:-mno-synci} Richard OK, I got that working now. I am still having some issues though. My original patch was setup to include mti-linux.h before mips.h and I think that is good for setting MIPS_ABI_DEFAULT and MIPS_ISA_DEFAULT because mips.h is going to look and see if those values are set. But now that I am setting DRIVER_SELF_SPECS in the header it seems like I should include it after mips.h (so I can override the setting of DRIVER_SELF_SPECS in mips.h). Do I need two header files? One to include before mips.h and one to include after mips.h? Steve Ellcey sell...@mips.com
Re: [patch, mips] New mips triplet for multilib linux builds
On Tue, 2012-09-04 at 23:55 +0100, Richard Sandiford wrote: If we do that, then your DRIVER_SELF_SPECS can further have: MIPS_ISA_SYNCI_SPEC where the definition: /* 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}} can go in mips.h. OPTION_DEFAULT_SPECS would then handle synci in just the same way as the other options, without the special SYNCI_SPEC macro. I am having trouble with this part. The newly built compiler is choking on this config spec when building libgcc and I am not sure how to read it. I tried looking in gcc/doc to find a description of the spec syntax but I couldn't find where it was documented. I don't know what the semicolon does and I have never seen a 3 part spec like %{mips32r2|mips64r2:-msynci:-mno-synci} Is this an 'if-then-else' usage? I have only ever seen two part usages like: %{mips32r2|mips64r2:-msynci} Steve Ellcey sell...@mips.com
Re: [patch, mips] New mips triplet for multilib linux builds
Steve Ellcey sell...@mips.com writes: On Tue, 2012-09-04 at 23:55 +0100, Richard Sandiford wrote: If we do that, then your DRIVER_SELF_SPECS can further have: MIPS_ISA_SYNCI_SPEC where the definition: /* 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}} can go in mips.h. OPTION_DEFAULT_SPECS would then handle synci in just the same way as the other options, without the special SYNCI_SPEC macro. I am having trouble with this part. The newly built compiler is choking on this config spec when building libgcc and I am not sure how to read it. I tried looking in gcc/doc to find a description of the spec syntax but I couldn't find where it was documented. I don't know what the semicolon does and I have never seen a 3 part spec like %{mips32r2|mips64r2:-msynci:-mno-synci} Is this an 'if-then-else' usage? Yeah, but I typoed, sorry. It should be: %{mips32r2|mips64r2:-msynci;:-mno-synci} Richard
[patch, mips] New mips triplet for multilib linux builds
I would like to create a new mips target triplet (mips-mti-linux-gnu). This target would be multilib by default and would have --enable-synci on by default. It would mainly be used for building mips cross compilers with glibc. I hope to extend this target to support the n32 and 64 bit ABIs in the future and add a corresponding mips-mti-elf triplet that would be like mips-sde-elf but have fewer/different multilib versions. Other then adding the new target the only changes are to the --enable-synci default setting (enabled for mips-mti-linux-gnu, still disabled for other targets) and in mips.h to use a new macro SYNCI_SPEC so that I don't have to copy all of OPTION_DEFAULT_SPECS into mti-linux.h just to change the -msynci handling. I tested the changes by building and running the testsuite with the qemu simulator. No glibc or binutils changes were needed for this. OK to checkin? Steve Ellcey sell...@mips.com 2012-09-04 Steve Ellcey sell...@mips.com * config.gcc: Add mips*-mti-linux* target and make with_synci true by default for that target. * config/mips/mips.h (SYNCI_SPEC): New. (OPTION_DEFAULT_SPECS): Use new SYNCI_SPEC. * mti-linux.h: New file. * t-mti-linux: New file. diff --git a/gcc/config.gcc b/gcc/config.gcc index 9ec8a41..6923211 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1685,6 +1685,13 @@ 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 mips/mti-linux.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h + tmake_file=${tmake_file} mips/t-mti-linux + 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 +3269,19 @@ case ${target} in yes) with_synci=synci ;; -| no) - # No is the default. + no) with_synci=no-synci ;; + ) + case ${target} in + mips*-mti-*) + with_synci=synci + ;; + *) + with_synci=no-synci + ;; + esac + ;; *) echo Unknown synci type used in --with-synci 12 exit 1 diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 9ce466d..b98b434 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -748,6 +748,9 @@ struct mips_cpu_info { specified. --with-divide is ignored if -mdivide-traps or -mdivide-breaks are specified. */ +#ifndef SYNCI_SPEC +#define SYNCI_SPEC -m%(VALUE) +#endif #define OPTION_DEFAULT_SPECS \ {arch, %{ MIPS_ARCH_OPTION_SPEC :;: -march=%(VALUE)} }, \ {arch_32, %{ OPT_ARCH32 :%{ MIPS_ARCH_OPTION_SPEC :;: -march=%(VALUE)}} }, \ @@ -760,7 +763,7 @@ struct mips_cpu_info { {divide, %{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}} }, \ {llsc, %{!mllsc:%{!mno-llsc:-m%(VALUE)}} }, \ {mips-plt, %{!mplt:%{!mno-plt:-m%(VALUE)}} }, \ - {synci, %{!msynci:%{!mno-synci:-m%(VALUE)}} } + {synci, %{!msynci:%{!mno-synci: SYNCI_SPEC }} } /* A spec that infers the -mdsp setting from an -march argument. */ diff --git a/gcc/config/mips/mti-linux.h b/gcc/config/mips/mti-linux.h new file mode 100644 index 000..af3d71f --- /dev/null +++ b/gcc/config/mips/mti-linux.h @@ -0,0 +1,35 @@ +/* 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/. */ + +/* Use the (o)32 ABI and the mips32r2 architecture by default. */ +#undef MIPS_ABI_DEFAULT +#define MIPS_ABI_DEFAULT ABI_32 +#undef MIPS_ISA_DEFAULT +#define
Re: [patch, mips] New mips triplet for multilib linux builds
Steve Ellcey sell...@mips.com writes: --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -748,6 +748,9 @@ struct mips_cpu_info { specified. --with-divide is ignored if -mdivide-traps or -mdivide-breaks are specified. */ +#ifndef SYNCI_SPEC +#define SYNCI_SPEC -m%(VALUE) +#endif #define OPTION_DEFAULT_SPECS \ {arch, %{ MIPS_ARCH_OPTION_SPEC :;: -march=%(VALUE)} }, \ {arch_32, %{ OPT_ARCH32 :%{ MIPS_ARCH_OPTION_SPEC :;: -march=%(VALUE)}} }, \ @@ -760,7 +763,7 @@ struct mips_cpu_info { {divide, %{!mdivide-traps:%{!mdivide-breaks:-mdivide-%(VALUE)}} }, \ {llsc, %{!mllsc:%{!mno-llsc:-m%(VALUE)}} }, \ {mips-plt, %{!mplt:%{!mno-plt:-m%(VALUE)}} }, \ - {synci, %{!msynci:%{!mno-synci:-m%(VALUE)}} } + {synci, %{!msynci:%{!mno-synci: SYNCI_SPEC }} } /* A spec that infers the -mdsp setting from an -march argument. */ diff --git a/gcc/config/mips/mti-linux.h b/gcc/config/mips/mti-linux.h new file mode 100644 index 000..af3d71f --- /dev/null +++ b/gcc/config/mips/mti-linux.h @@ -0,0 +1,35 @@ +/* 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/. */ + +/* Use the (o)32 ABI and the mips32r2 architecture by default. */ +#undef MIPS_ABI_DEFAULT +#define MIPS_ABI_DEFAULT ABI_32 +#undef MIPS_ISA_DEFAULT +#define MIPS_ISA_DEFAULT 33 + +/* If -msynci/-mno-synci is not specified, default to -msynci on architectures + that support it and -mno-synci on architectures that do not. */ +#undef SYNCI_SPEC +#define SYNCI_SPEC %{!mips32:%{!mips64:-m%(VALUE)}} One drawback of this is that it won't cope with -march=4kf, etc. AFAICT, the configuration also won't pick the soft-float multilib for things like -march=4kc. I think the configuration should define: #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, \ (which is boilerplate) so that the right multilibs get selected. The problem (though not really, see below) is that DRIVER_SELF_SPECS are applied after OPTION_DEFAULT_SPECS, so this won't help with SYNCI_SPEC. I hadn't realised until reading your patch that the --with-synci handling is inconsistent with the other options. It should be: case ${with_synci} in yes) with_synci=synci ;; no) with_synci=no-synci ;; ) ;; so that the default configure behaviour is not to override the setting either way. If we do that, then your DRIVER_SELF_SPECS can further have: MIPS_ISA_SYNCI_SPEC where the definition: /* 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}} can go in mips.h. OPTION_DEFAULT_SPECS would then handle synci in just the same way as the other options, without the special SYNCI_SPEC macro. You'll probably want to replace: #undef DRIVER_SELF_SPECS #define DRIVER_SELF_SPECS \ BASE_DRIVER_SELF_SPECS, \ LINUX_DRIVER_SELF_SPECS \ %{!EB:%{!EL:%(endian_spec)}} \ %{!mabi=*: - MULTILIB_ABI_DEFAULT } with: #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 in gnu-user64.h, so that you can reuse LINUX64_DRIVER_SELF_SPECS (and BASE_DRIVER_SELF_SPECS) in your DRIVER_SELF_SPECS. LINUX_* is really a misnomer here, but let's leave that for a later clean-up... Could you check whether a --with-arch=mips64 --with-float=hard build does something sensible?