[PATCH v2 4/9] RISC-V: Support configure options to set ISA versions by default.

Nelson Chu
2020-05-06T02:55:56Z

Support new configure options --with-arch and --with-isa-spec to set
ISA versions if we do not set the -march and -misa-spec options.

* --with-arch = <ISA-string>
The syntax of <ISA-string> is same as -march option. Assembler will
check this if -march option and ELF arch attributes are not set.

* --with-isa-spec = [2.2|20190608|20191213]
The syntax is same as -misa-spec option. Assembler will check this if
-misa-spec option is not set.

The Priority of these options,

* ELF arch attributes > Assembler options > Default configure options
* For GAS options, -march > -misa-spec
* For configure options, --with-arch > --with-isa-spec

gas/
* config/tc-riscv.c (DEFAULT_RISCV_ARCH_WITH_EXT,
DEFAULT_RISCV_ISA_SPEC): Default configure option settings.
You can set them by configure options --with-arch and
--with-isa-spec, respectively.
(riscv_set_default_isa_spec): New function used to set the
default ISA spec.
(md_parse_option): Call riscv_set_default_isa_spec rather than
call riscv_get_isa_spec_class directly.
(riscv_after_parse_args): If the -isa-spec is not set, then we
set the default ISA spec according to DEFAULT_RISCV_ISA_SPEC by
calling riscv_set_default_isa_spec.

* testsuite/gas/riscv/attribute-01.d: Add -misa-spec=2.2, since
the --with-isa-spec may be set to different ISA spec.
* testsuite/gas/riscv/attribute-02.d: Likewise.
* testsuite/gas/riscv/attribute-03.d: Likewise.
* testsuite/gas/riscv/attribute-04.d: Likewise.
* testsuite/gas/riscv/attribute-05.d: Likewise.
* testsuite/gas/riscv/attribute-06.d: Likewise.
* testsuite/gas/riscv/attribute-07.d: Likewise.

* configure.ac: Add configure options, --with-arch and
--with-isa-spec.
* configure: Regenerated.
* config.in: Regenerated.
---
gas/config.in | 6 ++++
gas/config/tc-riscv.c | 58 ++++++++++++++++++++++++++--------
gas/configure | 39 ++++++++++++++++++++++-
gas/configure.ac | 25 ++++++++++++++-
gas/testsuite/gas/riscv/attribute-01.d | 2 +-
gas/testsuite/gas/riscv/attribute-02.d | 2 +-
gas/testsuite/gas/riscv/attribute-03.d | 2 +-
gas/testsuite/gas/riscv/attribute-04.d | 2 +-
gas/testsuite/gas/riscv/attribute-05.d | 2 +-
gas/testsuite/gas/riscv/attribute-06.d | 2 +-
gas/testsuite/gas/riscv/attribute-07.d | 2 +-
11 files changed, 119 insertions(+), 23 deletions(-)

diff --git a/gas/config.in b/gas/config.in
index 8724eb1..e20d3c3 100644
--- a/gas/config.in
+++ b/gas/config.in
@@ -53,9 +53,15 @@
/* Define to 1 if you want to fix Loongson3 LLSC Errata by default. */
#undef DEFAULT_MIPS_FIX_LOONGSON3_LLSC

+/* Define default value for RISC-V -march. */
+#undef DEFAULT_RISCV_ARCH_WITH_EXT
+
/* Define to 1 if you want to generate RISC-V arch attribute by default. */
#undef DEFAULT_RISCV_ATTR

+/* Define default value for RISC-V -misa-spec. */
+#undef DEFAULT_RISCV_ISA_SPEC
+
/* Define to 1 if you want to generate GNU x86 used ISA and feature properties
by default. */
#undef DEFAULT_X86_USED_NOTE
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 5ef257e..3b6c429 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -63,8 +63,24 @@ struct riscv_cl_insn
#define DEFAULT_RISCV_ATTR 0
#endif

+/* Let riscv_after_parse_args set the default value according to xlen. */
+
+#ifndef DEFAULT_RISCV_ARCH_WITH_EXT
+#define DEFAULT_RISCV_ARCH_WITH_EXT NULL
+#endif
+
+/* The default ISA spec is set to 2.2 rather than the lastest version.
+ The reason is that compiler generates the ISA string with fixed 2p0
+ verisons only for the RISCV ELF architecture attributes, but not for
+ the -march option. Therefore, we should update the compiler or linker
+ to resolve this problem. */
+
+#ifndef DEFAULT_RISCV_ISA_SPEC
+#define DEFAULT_RISCV_ISA_SPEC "2.2"
+#endif
+
static const char default_arch[] = DEFAULT_ARCH;
-static const char *default_arch_with_ext = NULL;
+static const char *default_arch_with_ext = DEFAULT_RISCV_ARCH_WITH_EXT;
static enum riscv_isa_spec_class default_isa_spec = ISA_SPEC_CLASS_NONE;

static unsigned xlen = 0; /* width of an x-register */
@@ -76,6 +92,24 @@ static bfd_boolean rve_abi = FALSE;

static unsigned elf_flags = 0;

+/* Set the default_isa_spec. Return 0 if the input spec string isn't
+ supported. Otherwise, return 1. */
+
+static int
+riscv_set_default_isa_spec (const char *s)
+{
+ enum riscv_isa_spec_class class;
+ if (!riscv_get_isa_spec_class (s, &class))
+ {
+ as_bad ("Unknown default ISA spec `%s' set by "
+ "-misa-spec or --with-isa-spec", s);
+ return 0;
+ }
+ else
+ default_isa_spec = class;
+ return 1;
+}
+
/* This is the set of options which the .option pseudo-op may modify. */

struct riscv_set_options
@@ -2522,12 +2556,7 @@ md_parse_option (int c, const char *arg)
break;

case OPTION_MISA_SPEC:
- if (!riscv_get_isa_spec_class (arg, &default_isa_spec))
- {
- as_bad ("Unknown default ISA spec `%s' set by -misa-spec", arg);
- return 0;
- }
- break;
+ return riscv_set_default_isa_spec (arg);

default:
return 0;
@@ -2539,6 +2568,10 @@ md_parse_option (int c, const char *arg)
void
riscv_after_parse_args (void)
{
+ /* The --with-arch is optional for now, so we have to set the xlen
+ according to the default_arch, which is set by the --targte, first.
+ Then, we use the xlen to set the default_arch_with_ext if the
+ -march and --with-arch are not set. */
if (xlen == 0)
{
if (strcmp (default_arch, "riscv32") == 0)
@@ -2554,15 +2587,12 @@ riscv_after_parse_args (void)
/* Initialize the hash table for extensions with default version. */
ext_version_hash = init_ext_version_hash (riscv_ext_version_table);

- /* The default ISA spec is set to 2.2 rather than the lastest version.
- The reason is that compiler generates the ISA string with fixed 2p0
- verisons only for the RISCV ELF architecture attributes, but not for
- the -march option. Therefore, we should update the compiler or linker
- to resolve this problem. */
+ /* If the -misa-spec isn't set, then we set the default ISA spec according
+ to DEFAULT_RISCV_ISA_SPEC. */
if (default_isa_spec == ISA_SPEC_CLASS_NONE)
- default_isa_spec = ISA_SPEC_CLASS_2P2;
+ riscv_set_default_isa_spec (DEFAULT_RISCV_ISA_SPEC);

- /* Set the architecture according to -march. */
+ /* Set the architecture according to -march or or --with-arch. */
riscv_set_arch (default_arch_with_ext);

/* Add the RVC extension, regardless of -march, to support .option rvc. */
diff --git a/gas/configure b/gas/configure
index 1515787..cc21e0a 100755
--- a/gas/configure
+++ b/gas/configure
@@ -13009,7 +13009,7 @@ $as_echo "#define NDS32_DEFAULT_ZOL_EXT 1" >>confdefs.h
$as_echo "$enable_zol_ext" >&6; }
;;

- aarch64 | i386 | riscv | s390 | sparc)
+ aarch64 | i386 | s390 | sparc)
if test $this_target = $target ; then

cat >>confdefs.h <<_ACEOF
@@ -13019,6 +13019,43 @@ _ACEOF
fi
;;

+ riscv)
+ # --target=riscv[32|64]-*-*. */
+ if test $this_target = $target ; then
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_ARCH "${arch}"
+_ACEOF
+
+ fi
+
+ # --with-arch=<value>. The syntax of <value> is same as Gas option -march.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default configuration of --with-arch" >&5
+$as_echo_n "checking for default configuration of --with-arch... " >&6; }
+ if test "x${with_arch}" != x; then
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_RISCV_ARCH_WITH_EXT "$with_arch"
+_ACEOF
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_arch" >&5
+$as_echo "$with_arch" >&6; }
+
+ # --with-isa-spec=[2.2|20190608|20191213].
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default configuration of --with-isa-spec" >&5
+$as_echo_n "checking for default configuration of --with-isa-spec... " >&6; }
+ if test "x${with_isa_spec}" != x; then
+
+cat >>confdefs.h <<_ACEOF
+#define DEFAULT_RISCV_ISA_SPEC "$with_isa_spec"
+_ACEOF
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_isa_spec" >&5
+$as_echo "$with_isa_spec" >&6; }
+ ;;
+
rl78)
f=rl78-parse.o
case " $extra_objects " in
diff --git a/gas/configure.ac b/gas/configure.ac
index 6f32e55..8a5f5c5 100644
--- a/gas/configure.ac
+++ b/gas/configure.ac
@@ -569,12 +569,35 @@ changequote([,])dnl
AC_MSG_RESULT($enable_zol_ext)
;;

- aarch64 | i386 | riscv | s390 | sparc)
+ aarch64 | i386 | s390 | sparc)
if test $this_target = $target ; then
AC_DEFINE_UNQUOTED(DEFAULT_ARCH, "${arch}", [Default architecture.])
fi
;;

+ riscv)
+ # --target=riscv[32|64]-*-*. */
+ if test $this_target = $target ; then
+ AC_DEFINE_UNQUOTED(DEFAULT_ARCH, "${arch}", [Default architecture.])
+ fi
+
+ # --with-arch=<value>. The syntax of <value> is same as Gas option -march.
+ AC_MSG_CHECKING(for default configuration of --with-arch)
+ if test "x${with_arch}" != x; then
+ AC_DEFINE_UNQUOTED(DEFAULT_RISCV_ARCH_WITH_EXT, "$with_arch",
+ [Define default value for RISC-V -march.])
+ fi
+ AC_MSG_RESULT($with_arch)
+
+ # --with-isa-spec=[2.2|20190608|20191213].
+ AC_MSG_CHECKING(for default configuration of --with-isa-spec)
+ if test "x${with_isa_spec}" != x; then
+ AC_DEFINE_UNQUOTED(DEFAULT_RISCV_ISA_SPEC, "$with_isa_spec",
+ [Define default value for RISC-V -misa-spec.])
+ fi
+ AC_MSG_RESULT($with_isa_spec)
+ ;;
+
rl78)
f=rl78-parse.o
case " $extra_objects " in
diff --git a/gas/testsuite/gas/riscv/attribute-01.d b/gas/testsuite/gas/riscv/attribute-01.d
index e22773e..2e19e09 100644
--- a/gas/testsuite/gas/riscv/attribute-01.d
+++ b/gas/testsuite/gas/riscv/attribute-01.d
@@ -1,4 +1,4 @@
-#as: -march=rv32g -march-attr
+#as: -march=rv32g -march-attr -misa-spec=2.2
#readelf: -A
#source: empty.s
Attribute Section: riscv
diff --git a/gas/testsuite/gas/riscv/attribute-02.d b/gas/testsuite/gas/riscv/attribute-02.d
index e1e8ce3..ae0195e 100644
--- a/gas/testsuite/gas/riscv/attribute-02.d
+++ b/gas/testsuite/gas/riscv/attribute-02.d
@@ -1,4 +1,4 @@
-#as: -march=rv32gxargle -march-attr
+#as: -march=rv32gxargle -march-attr -misa-spec=2.2
#readelf: -A
#source: empty.s
Attribute Section: riscv
diff --git a/gas/testsuite/gas/riscv/attribute-03.d b/gas/testsuite/gas/riscv/attribute-03.d
index fa38bf3..9916ff6 100644
--- a/gas/testsuite/gas/riscv/attribute-03.d
+++ b/gas/testsuite/gas/riscv/attribute-03.d
@@ -1,4 +1,4 @@
-#as: -march=rv32gxargle_xfoo -march-attr
+#as: -march=rv32gxargle_xfoo -march-attr -misa-spec=2.2
#readelf: -A
#source: empty.s
Attribute Section: riscv
diff --git a/gas/testsuite/gas/riscv/attribute-04.d b/gas/testsuite/gas/riscv/attribute-04.d
index c97bf03..408464d 100644
--- a/gas/testsuite/gas/riscv/attribute-04.d
+++ b/gas/testsuite/gas/riscv/attribute-04.d
@@ -1,4 +1,4 @@
-#as: -march-attr
+#as: -march-attr -misa-spec=2.2
#readelf: -A
#source: attribute-04.s
Attribute Section: riscv
diff --git a/gas/testsuite/gas/riscv/attribute-05.d b/gas/testsuite/gas/riscv/attribute-05.d
index f9b65f2..ad24834 100644
--- a/gas/testsuite/gas/riscv/attribute-05.d
+++ b/gas/testsuite/gas/riscv/attribute-05.d
@@ -1,4 +1,4 @@
-#as: -march-attr
+#as: -march-attr -misa-spec=2.2
#readelf: -A
#source: attribute-05.s
Attribute Section: riscv
diff --git a/gas/testsuite/gas/riscv/attribute-06.d b/gas/testsuite/gas/riscv/attribute-06.d
index 1abeb47..a2dd9fb 100644
--- a/gas/testsuite/gas/riscv/attribute-06.d
+++ b/gas/testsuite/gas/riscv/attribute-06.d
@@ -1,4 +1,4 @@
-#as: -march=rv32g2p0 -march-attr
+#as: -march=rv32g2p0 -march-attr -misa-spec=2.2
#readelf: -A
#source: attribute-06.s
Attribute Section: riscv
diff --git a/gas/testsuite/gas/riscv/attribute-07.d b/gas/testsuite/gas/riscv/attribute-07.d
index dfd7e6b..342a537 100644
--- a/gas/testsuite/gas/riscv/attribute-07.d
+++ b/gas/testsuite/gas/riscv/attribute-07.d
@@ -1,4 +1,4 @@
-#as: -march=rv64g2p0 -march-attr
+#as: -march=rv64g2p0 -march-attr -misa-spec=2.2
#readelf: -A
#source: attribute-07.s
Attribute Section: riscv
--
2.7.4