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

Nelson Chu nelson.chu@sifive.com
Wed May 6 02:55:42 GMT 2020


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



More information about the Binutils mailing list