Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org>
于2023年2月3日周五 20:29写道:
>
> YunQiang Su <yunqiang...@cipunited.com> writes:
> > The value of default_mips_arch will be always used for -march by default,
> > no matter what value is given to -mabi.
> > It will produce abnormal elf file like:
> >  ELF 32-bit LSB relocatable, MIPS, MIPS64 rel2 version 1 (SYSV)
>
> Is that really wrong though?  There's nothing in principle that
> prevents a 64-bit ISA being used with a 32-bit ABI, even in the
> object file's metadata.
>

To make sure that there is no misunderstanding.
The "wrong" format is
     ELF 32-bit LSB relocatable, MIPS, MIPS64 rel2 version 1 (SYSV)
                                                                      ^^
and the "correct" O32 ABI file is
     ELF 32-bit LSB relocatable, MIPS, MIPS32 rel2 version 1 (SYSV)
                                                                      ^^
and the linker refuses to interlink them together.

Do you mean that the "wrong" format is quite interesting?
Yes, While this format is never used at all.

> > So we use with_arch_32 and with_arch_64 instead of default_mips_arch
> > for all mipsisa[32,64]rN triples.
>
> I agree there's no benefit to using a stock MIPS64rN ISA over
> a stock MIPS32rN ISA with a 32-bit ABI, and the patch is only
> changing those cases.  But things are different when using
> (say) MIPS4 with a 32-bit ABI, or a 64-bit processor that has
> proprietary extensions.
>
> And, for example, a mips-linux-gnu toolchain would (IIRC) require
> an -march as well as an -mabi in order to generate 64-bit code.
> There would be no implicit selection of a new -march.
>

In fact, no: if we wish to use the default march of GCC configured,
we can use -mabi=64 only.

$ mipsel-linux-gnu-gcc -mabi=64 -c xx.c && file xx.o
xx.o: ELF 64-bit LSB relocatable, MIPS, MIPS64 rel2 version 1 (SYSV),
not stripped

There does be a problem:
$ mipsel-linux-gnu-gcc -mabi=32 -march=mips64r2 -c xx.c && file xx.o
xx.o: ELF 32-bit LSB relocatable, MIPS, MIPS64 rel2 version 1 (SYSV),
not stripped
                                                                         ^^
> I'm not opposed to the patch.  I just think we should be clear
> about the underlying principle.  If it's just that all MIPS32/64rN
> toolchains should behave in the same way (like the sde and mti ones
> do), then the patch looks good.  But I don't think we should create
> a general principle that -mabi determines/changes/downgrades -march.
>

In fact, I prefer what x86 does now:
$ gcc -m32 -march=haswell -c -O3 xx.c && file xx.o
xx.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

But MIPS does like:
$ mipsel-linux-gnu-gcc -mabi=32 -march=octeon -c yy.c && file yy.o
yy.o: ELF 32-bit LSB relocatable, MIPS, MIPS64 rel2 version 1 (SYSV),
not stripped
                                                                         ^^
$ mipsel-linux-gnu-gcc -mabi=32 -march=mips64r2 -c yy.c && file yy.o
yy.o: ELF 32-bit LSB relocatable, MIPS, MIPS64 rel2 version 1 (SYSV),
not stripped
                                                                         ^^

I hope I can fix this problem for MIPS, although I have no idea how to
do so yet.

> Thanks,
> Richard
>
> >
> > gcc/ChangeLog:
> >       * config.gcc: use with_arch_32 and with_arch_64 instead of
> >       default_mips_arch for mipsisa[32,64]rN triples.
> > ---
> >  gcc/config.gcc | 21 ++++++++++++++-------
> >  1 file changed, 14 insertions(+), 7 deletions(-)
> >
> > diff --git a/gcc/config.gcc b/gcc/config.gcc
> > index f0958e1c959..0b6d093d847 100644
> > --- a/gcc/config.gcc
> > +++ b/gcc/config.gcc
> > @@ -2518,13 +2518,16 @@ mips*-*-linux*)                               # 
> > Linux MIPS, either endian.
> >       extra_options="${extra_options} linux-android.opt"
> >       case ${target} in
> >               mipsisa32r6*)
> > -                     default_mips_arch=mips32r6
> > +                     with_arch_32="mips32r6"
> > +                     with_arch_64="mips64r6"
> >                       ;;
> >               mipsisa32r2*)
> > -                     default_mips_arch=mips32r2
> > +                     with_arch_32="mips32r2"
> > +                     with_arch_64="mips64r2"
> >                       ;;
> >               mipsisa32*)
> > -                     default_mips_arch=mips32
> > +                     with_arch_32="mips32"
> > +                     with_arch_64="mips64"
> >                       ;;
> >               mips64el-st-linux-gnu)
> >                       default_mips_abi=n32
> > @@ -2540,22 +2543,26 @@ mips*-*-linux*)                               # 
> > Linux MIPS, either endian.
> >                       ;;
> >               mipsisa64r6*-*-linux-gnuabi64)
> >                       default_mips_abi=64
> > -                     default_mips_arch=mips64r6
> > +                     with_arch_32="mips32r6"
> > +                     with_arch_64="mips64r6"
> >                       enable_mips_multilibs="yes"
> >                       ;;
> >               mipsisa64r6*-*-linux*)
> >                       default_mips_abi=n32
> > -                     default_mips_arch=mips64r6
> > +                     with_arch_32="mips32r6"
> > +                     with_arch_64="mips64r6"
> >                       enable_mips_multilibs="yes"
> >                       ;;
> >               mipsisa64r2*-*-linux-gnuabi64)
> >                       default_mips_abi=64
> > -                     default_mips_arch=mips64r2
> > +                     with_arch_32="mips32r2"
> > +                     with_arch_64="mips64r2"
> >                       enable_mips_multilibs="yes"
> >                       ;;
> >               mipsisa64r2*-*-linux*)
> >                       default_mips_abi=n32
> > -                     default_mips_arch=mips64r2
> > +                     with_arch_32="mips32r2"
> > +                     with_arch_64="mips64r2"
> >                       enable_mips_multilibs="yes"
> >                       ;;
> >               mips64*-*-linux-gnuabi64 | mipsisa64*-*-linux-gnuabi64)

Reply via email to