I also prefer adding a -mabi=auto option rather than change existing behavior.

On Wed, Jun 8, 2022 at 5:06 PM pc.wang via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Thanks for your opinion! I did these just because LLVM has already done the 
> same thing and I wanted to make GCC with the same behavior of LLVM. The only 
> difference is that LLVM has no handling for ilp32f and lp64f and I have sent 
> a patch to do it (sees https://reviews.llvm.org/D125947).
> As for RISC-V specs, there are some descriptions in 
> https://github.com/riscv-non-isa/riscv-toolchain-conventions#specifying-the-target-isa-with--march:
> > A target -march which includes floating point instructions implies a 
> > hardfloat calling convention, but can be overridden using the -mabi flag 
> > (see the next section).
> But I think we can make it clearer.
> ------------------------------------------------------------------
> Sender:Palmer Dabbelt <pal...@dabbelt.com>
> Sent At:2022 Jun. 8 (Wed.) 02:45
> Recipient:gcc-patches <gcc-patches@gcc.gnu.org>
> Cc:pc.wang <pc.w...@linux.alibaba.com>
> Subject:Re: [PATCH] RISC-V: Compute default ABI from -mcpu or -march
>
> On Mon, 06 Jun 2022 19:51:20 PDT (-0700), gcc-patches@gcc.gnu.org wrote:
> > If -mcpu or -march is specified and there is no -mabi, we will calculate
> > default ABI from arch string provided by -march or defined in CPU info.
>
> IMO this is generally a good idea and we've talked about it before, but
> just setting the ABI from the ISA isn't quite the right way to go.  IIRC
> we came up with something slightly more complicated, like picking the
> closest supported multilib.  That's probably more in line with what
> users are asking for, which IIUC is sort of just "I don't care that much
> about ABI, just make my stuff build".
>
> Whatever we do here, we should document in the RISC-V specs as we'll
> want to make sure LLVM does the same thing.  We probably also want some
> sort of "-mabi=auto" argument, as it's always best to have an argument
> that changes back to the no-argument behavior.
>
>
> >
> > gcc/ChangeLog:
> >
> >         * common/config/riscv/riscv-common.cc (compute_default_abi): 
> > Implementation
> >         to calculate -mabi from arch string.
> >         (riscv_expand_abi_from_arch): New spec function to calcalute -mabi 
> > from arch
> >         string provided by -march option.
> >         (riscv_expand_abi_from_cpu): New spec function to find CPU info and 
> > calculate
> >         -mabi from arch string defined in CPU info.
> >         * config/riscv/riscv.h (EXTRA_SPEC_FUNCTIONS): Add above spec 
> > functions.
> >         (OPTION_DEFAULT_SPECS): Use new spec functions to calculate -mabi 
> > and -march
> >         has higher priority than -mcpu.
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * gcc.target/riscv/mabi-1.c: ilp32e test.
> >         * gcc.target/riscv/mabi-2.c: ilp32 test.
> >         * gcc.target/riscv/mabi-3.c: ilp32f test.
> >         * gcc.target/riscv/mabi-4.c: ilp32d test.
> >         * gcc.target/riscv/mabi-5.c: lp64 test.
> >         * gcc.target/riscv/mabi-6.c: lp64f test.
> >         * gcc.target/riscv/mabi-7.c: lp64d test.
> >         * gcc.target/riscv/mabi-8.c: -march override -mcpu.
> > ---
> >  gcc/common/config/riscv/riscv-common.cc | 66 +++++++++++++++++++++++++
> >  gcc/config/riscv/riscv.h                | 15 ++++--
> >  gcc/testsuite/gcc.target/riscv/mabi-1.c |  7 +++
> >  gcc/testsuite/gcc.target/riscv/mabi-2.c |  7 +++
> >  gcc/testsuite/gcc.target/riscv/mabi-3.c |  7 +++
> >  gcc/testsuite/gcc.target/riscv/mabi-4.c |  7 +++
> >  gcc/testsuite/gcc.target/riscv/mabi-5.c |  7 +++
> >  gcc/testsuite/gcc.target/riscv/mabi-6.c |  7 +++
> >  gcc/testsuite/gcc.target/riscv/mabi-7.c |  7 +++
> >  gcc/testsuite/gcc.target/riscv/mabi-8.c |  7 +++
> >  10 files changed, 134 insertions(+), 3 deletions(-)
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/mabi-1.c
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/mabi-2.c
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/mabi-3.c
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/mabi-4.c
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/mabi-5.c
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/mabi-6.c
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/mabi-7.c
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/mabi-8.c
> >
> > diff --git a/gcc/common/config/riscv/riscv-common.cc 
> > b/gcc/common/config/riscv/riscv-common.cc
> > index 0e5be2ce105..f8e40549d18 100644
> > --- a/gcc/common/config/riscv/riscv-common.cc
> > +++ b/gcc/common/config/riscv/riscv-common.cc
> > @@ -1266,6 +1266,72 @@ riscv_default_mtune (int argc, const char **argv)
> >      return default_mtune;
> >  }
> >
> > +/* Compute default -mabi option from arch string.  */
> > +
> > +static const char *
> > +compute_default_abi (const char* arch_str)
> > +{
> > +  location_t loc = UNKNOWN_LOCATION;
> > +
> > +  riscv_parse_arch_string (arch_str, NULL, loc);
> > +
> > +  if (current_subset_list->xlen () == 64)
> > +    {
> > +      if (current_subset_list->lookup ("d", RISCV_DONT_CARE_VERSION,
> > +      RISCV_DONT_CARE_VERSION))
> > + return "lp64d";
> > +      if (current_subset_list->lookup ("f", RISCV_DONT_CARE_VERSION,
> > +      RISCV_DONT_CARE_VERSION))
> > + return "lp64f";
> > +      return "lp64";
> > +    }
> > +  else
> > +    {
> > +      if (current_subset_list->lookup ("e", RISCV_DONT_CARE_VERSION,
> > +      RISCV_DONT_CARE_VERSION))
> > + return "ilp32e";
> > +      if (current_subset_list->lookup ("d", RISCV_DONT_CARE_VERSION,
> > +      RISCV_DONT_CARE_VERSION))
> > + return "ilp32d";
> > +      if (current_subset_list->lookup ("f", RISCV_DONT_CARE_VERSION,
> > +      RISCV_DONT_CARE_VERSION))
> > + return "ilp32f";
> > +      return "ilp32";
> > +    }
> > +}
> > +
> > +/* Expand default -mabi option from -march option.  */
> > +
> > +const char *
> > +riscv_expand_abi_from_arch (int argc, const char **argv)
> > +{
> > +  gcc_assert (argc == 1);
> > +  return xasprintf ("-mabi=%s", compute_default_abi (argv[0]));
> > +}
> > +
> > +/* Expand default -mabi option from -mcpu option.  */
> > +
> > +const char *
> > +riscv_expand_abi_from_cpu (int argc, const char **argv)
> > +{
> > +  gcc_assert (argc > 0 && argc <= 2);
> > +  const char *default_abi_str = NULL;
> > +  if (argc >= 2)
> > +    default_abi_str = argv[1];
> > +
> > +  const riscv_cpu_info *cpu = riscv_find_cpu (argv[0]);
> > +
> > +  if (cpu == NULL)
> > +    {
> > +      if (default_abi_str == NULL)
> > + return "";
> > +      else
> > + return xasprintf ("-mabi=%s", default_abi_str);
> > +    }
> > +  else
> > +    return xasprintf ("-mabi=%s", compute_default_abi (cpu->arch));
> > +}
> > +
> >  /* Expand arch string with implied extensions from -mcpu option.  */
> >
> >  const char *
> > diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h
> > index 6f7f4d3fbdc..14cd695f37f 100644
> > --- a/gcc/config/riscv/riscv.h
> > +++ b/gcc/config/riscv/riscv.h
> > @@ -50,15 +50,20 @@ along with GCC; see the file COPYING3.  If not see
> >  extern const char *riscv_expand_arch (int argc, const char **argv);
> >  extern const char *riscv_expand_arch_from_cpu (int argc, const char 
> > **argv);
> >  extern const char *riscv_default_mtune (int argc, const char **argv);
> > +extern const char *riscv_expand_abi_from_arch (int argc, const char 
> > **argv);
> > +extern const char *riscv_expand_abi_from_cpu (int argc, const char **argv);
> >
> >  # define EXTRA_SPEC_FUNCTIONS      \
> >    { "riscv_expand_arch", riscv_expand_arch },    \
> >    { "riscv_expand_arch_from_cpu", riscv_expand_arch_from_cpu },  \
> > -  { "riscv_default_mtune", riscv_default_mtune },
> > +  { "riscv_default_mtune", riscv_default_mtune },   \
> > +  { "riscv_expand_abi_from_arch", riscv_expand_abi_from_arch },  \
> > +  { "riscv_expand_abi_from_cpu", riscv_expand_abi_from_cpu },
> >
> >  /* Support for a compile-time default CPU, et cetera.  The rules are:
> >     --with-arch is ignored if -march or -mcpu is specified.
> > -   --with-abi is ignored if -mabi is specified.
> > +   --with-abi is ignored if -mabi is specified.  If -mcpu or -march is
> > +     specified, suitable -mabi will be selected from arch string.
> >     --with-tune is ignored if -mtune or -mcpu is specified.
> >     --with-isa-spec is ignored if -misa-spec is specified.
> >
> > @@ -70,7 +75,11 @@ extern const char *riscv_default_mtune (int argc, const 
> > char **argv);
> >    {"arch", "%{!march=*:"      \
> >      "  %{!mcpu=*:-march=%(VALUE)}"    \
> >      "  %{mcpu=*:%:riscv_expand_arch_from_cpu(%* %(VALUE))}}" }, \
> > -  {"abi", "%{!mabi=*:-mabi=%(VALUE)}" }, \
> > +  {"abi", "%{!mabi=*:"       \
> > +    "  %{!march=*:"      \
> > +    "    %{!mcpu=*:-mabi=%(VALUE)}"    \
> > +    "    %{mcpu=*:%:riscv_expand_abi_from_cpu(%* %(VALUE))}}" \
> > +    "  %{march=*:%:riscv_expand_abi_from_arch(%*)}}" },  \
> >    {"isa_spec", "%{!misa-spec=*:-misa-spec=%(VALUE)}" }, \
> >
> >  #ifdef IN_LIBGCC2
> > diff --git a/gcc/testsuite/gcc.target/riscv/mabi-1.c 
> > b/gcc/testsuite/gcc.target/riscv/mabi-1.c
> > new file mode 100644
> > index 00000000000..83bc343f8d8
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/mabi-1.c
> > @@ -0,0 +1,7 @@
> > +/* { dg-do compile } */
> > +/* { dg-skip-if "-mabi given" { *-*-* } { "-mabi=*" } } */
> > +/* { dg-options "-march=rv32e" } */
> > +
> > +#if !((__riscv_xlen == 32) && defined(__riscv_abi_rve))
> > +#error "unexpected abi"
> > +#endif
> > diff --git a/gcc/testsuite/gcc.target/riscv/mabi-2.c 
> > b/gcc/testsuite/gcc.target/riscv/mabi-2.c
> > new file mode 100644
> > index 00000000000..6a97c2ae2a3
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/mabi-2.c
> > @@ -0,0 +1,7 @@
> > +/* { dg-do compile } */
> > +/* { dg-skip-if "-mabi given" { *-*-* } { "-mabi=*" } } */
> > +/* { dg-options "-march=rv32ima" } */
> > +
> > +#if !((__riscv_xlen == 32) && defined(__riscv_float_abi_soft))
> > +#error "unexpected abi"
> > +#endif
> > diff --git a/gcc/testsuite/gcc.target/riscv/mabi-3.c 
> > b/gcc/testsuite/gcc.target/riscv/mabi-3.c
> > new file mode 100644
> > index 00000000000..cef04313e19
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/mabi-3.c
> > @@ -0,0 +1,7 @@
> > +/* { dg-do compile } */
> > +/* { dg-skip-if "-mabi given" { *-*-* } { "-mabi=*" } } */
> > +/* { dg-options "-march=rv32imaf" } */
> > +
> > +#if !((__riscv_xlen == 32) && defined(__riscv_float_abi_single))
> > +#error "unexpected abi"
> > +#endif
> > diff --git a/gcc/testsuite/gcc.target/riscv/mabi-4.c 
> > b/gcc/testsuite/gcc.target/riscv/mabi-4.c
> > new file mode 100644
> > index 00000000000..d62dcf6ed75
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/mabi-4.c
> > @@ -0,0 +1,7 @@
> > +/* { dg-do compile } */
> > +/* { dg-skip-if "-mabi given" { *-*-* } { "-mabi=*" } } */
> > +/* { dg-options "-march=rv32imafd" } */
> > +
> > +#if !((__riscv_xlen == 32) && defined(__riscv_float_abi_double))
> > +#error "unexpected abi"
> > +#endif
> > diff --git a/gcc/testsuite/gcc.target/riscv/mabi-5.c 
> > b/gcc/testsuite/gcc.target/riscv/mabi-5.c
> > new file mode 100644
> > index 00000000000..000e5e282c2
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/mabi-5.c
> > @@ -0,0 +1,7 @@
> > +/* { dg-do compile } */
> > +/* { dg-skip-if "-mabi given" { *-*-* } { "-mabi=*" } } */
> > +/* { dg-options "-march=rv64ima" } */
> > +
> > +#if !((__riscv_xlen == 64) && defined(__riscv_float_abi_soft))
> > +#error "unexpected abi"
> > +#endif
> > diff --git a/gcc/testsuite/gcc.target/riscv/mabi-6.c 
> > b/gcc/testsuite/gcc.target/riscv/mabi-6.c
> > new file mode 100644
> > index 00000000000..ed1458d4158
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/mabi-6.c
> > @@ -0,0 +1,7 @@
> > +/* { dg-do compile } */
> > +/* { dg-skip-if "-mabi given" { *-*-* } { "-mabi=*" } } */
> > +/* { dg-options "-march=rv64imaf" } */
> > +
> > +#if !((__riscv_xlen == 64) && defined(__riscv_float_abi_single))
> > +#error "unexpected abi"
> > +#endif
> > diff --git a/gcc/testsuite/gcc.target/riscv/mabi-7.c 
> > b/gcc/testsuite/gcc.target/riscv/mabi-7.c
> > new file mode 100644
> > index 00000000000..675fe359cfd
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/mabi-7.c
> > @@ -0,0 +1,7 @@
> > +/* { dg-do compile } */
> > +/* { dg-skip-if "-mabi given" { *-*-* } { "-mabi=*" } } */
> > +/* { dg-options "-march=rv64imafd" } */
> > +
> > +#if !((__riscv_xlen == 64) && defined(__riscv_float_abi_double))
> > +#error "unexpected abi"
> > +#endif
> > diff --git a/gcc/testsuite/gcc.target/riscv/mabi-8.c 
> > b/gcc/testsuite/gcc.target/riscv/mabi-8.c
> > new file mode 100644
> > index 00000000000..8c7e08e4289
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/mabi-8.c
> > @@ -0,0 +1,7 @@
> > +/* { dg-do compile } */
> > +/* { dg-skip-if "-mabi given" { *-*-* } { "-mabi=*" } } */
> > +/* { dg-options "-mcpu=sifive-s21 -march=rv64imafd" } */
> > +
> > +#if !((__riscv_xlen == 64) && defined(__riscv_float_abi_double))
> > +#error "unexpected abi"
> > +#endif

Reply via email to