We have multiple cpus with different abis (combinations of 32 vs 64, float vs no-float, etc). It's annoying having to specify both -mcpu=thing and the correct -mabi=thing. Just as with -mcpu selecting a default ISA set, this adds smarts for it to select a default ABI.

You can still specify -mabi if you want to go off-road, but this gives us one source of truth. It's possible I've made a mistake with selecting the default abi for the current set of cpus.

Also while there, cleaned up riscv_expend_arch_from_cpu. I found it over complex, and as it's potentially getting data from a user-provided specs file, best not to use asserts for errors, just fail safely.

nathan
--
Nathan Sidwell
From 4ae4af17882c2e21b46f3486f68d213498d1c54b Mon Sep 17 00:00:00 2001
From: Nathan Sidwell <[email protected]>
Date: Sat, 1 Nov 2025 20:17:04 -0400
Subject: [PATCH] Riscv: Per-cpu default ABI

Per-cpu abis are helpful when supporting multiple cpus with different
ABIs.

	gcc/
	* common/config/rsicv/riscv-common.cc (riscv_cpu_tables): Adjust
	RISCV_CORE definition.
	(riscv_expand_arch_from_cpu): Simplify.
	(riscv_expand_abi_from_cpu): New.
	* config/riscv/gen-riscv-mcpu-texi.cc (main): Adjust RISCV_CORE
	definition.
	* config/riscv/risdcv-cores.def: Add per-cpu default ABI.
	* config/riscv/riscv-protos.h (struct riscv_cpu_info): Add
	per-cpu default ABI.
	* config/riscv/riscv.h (riscv_expand_abi_from_cpu): Declare.
	(EXTRA_SPEC_FUNCTIONS): Add it.
	(OPTION_DEFAULT_SPECS): Default abi from cpu.
	(DRIVER_SELF_SPECS): Likewise.
---
 gcc/common/config/riscv/riscv-common.cc | 53 ++++++++++++++---------
 gcc/config/riscv/gen-riscv-mcpu-texi.cc |  2 +-
 gcc/config/riscv/riscv-cores.def        | 56 ++++++++++++-------------
 gcc/config/riscv/riscv-protos.h         |  3 ++
 gcc/config/riscv/riscv.h                |  9 +++-
 5 files changed, 72 insertions(+), 51 deletions(-)

diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
index adfd22019a9..b0d6da5537a 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -281,10 +281,10 @@ static const riscv_profiles riscv_profiles_table[] =
 
 static const riscv_cpu_info riscv_cpu_tables[] =
 {
-#define RISCV_CORE(CORE_NAME, ARCH, TUNE) \
-    {CORE_NAME, ARCH, TUNE},
+#define RISCV_CORE(CORE_NAME, ARCH, ABI, TUNE)	\
+  {CORE_NAME, ARCH, ABI, TUNE},
 #include "../../../config/riscv/riscv-cores.def"
-    {NULL, NULL, NULL}
+  {NULL, NULL, NULL, NULL}
 };
 
 static const char *riscv_tunes[] =
@@ -1810,34 +1810,47 @@ riscv_default_mtune (int argc, const char **argv)
 /* Expand arch string with implied extensions from -mcpu option.  */
 
 const char *
-riscv_expand_arch_from_cpu (int argc ATTRIBUTE_UNUSED,
-			    const char **argv)
+riscv_expand_arch_from_cpu (int argc, const char **argv)
 {
-  gcc_assert (argc > 0 && argc <= 2);
-  const char *default_arch_str = NULL;
-  const char *arch_str = NULL;
-  if (argc >= 2)
-    default_arch_str = argv[1];
+  const char *arch_str = nullptr;
 
-  const riscv_cpu_info *cpu = riscv_find_cpu (argv[0]);
+  if (argc > 0)
+    if (const riscv_cpu_info *cpu = riscv_find_cpu (argv[0]))
+      arch_str = cpu->arch;
 
-  if (cpu == NULL)
+  if (!arch_str)
     {
-      if (default_arch_str == NULL)
+      if (argc < 2)
 	return "";
-      else
-	arch_str = default_arch_str;
+      arch_str = argv[1];
     }
-  else
-    arch_str = cpu->arch;
 
-  location_t loc = UNKNOWN_LOCATION;
-
-  riscv_parse_arch_string (arch_str, NULL, loc);
+  riscv_parse_arch_string (arch_str, NULL, UNKNOWN_LOCATION);
   const std::string arch = riscv_arch_str (false);
   return xasprintf ("-march=%s", arch.c_str());
 }
 
+/* Expand abi string from -mcpu option.  */
+
+const char *
+riscv_expand_abi_from_cpu (int argc, const char **argv)
+{
+  const char *abi_str = nullptr;
+
+  if (argc > 0)
+    if (const riscv_cpu_info *cpu = riscv_find_cpu (argv[0]))
+      abi_str = cpu->abi;
+
+  if (!abi_str)
+    {
+      if (argc < 2)
+	return "";
+      abi_str = argv[1];
+    }
+
+  return xasprintf ("-mabi=%s", abi_str);
+}
+
 /* Report error if not found suitable multilib.  */
 const char *
 riscv_multi_lib_check (int argc ATTRIBUTE_UNUSED,
diff --git a/gcc/config/riscv/gen-riscv-mcpu-texi.cc b/gcc/config/riscv/gen-riscv-mcpu-texi.cc
index 9681438fb9f..bcc820cda8e 100644
--- a/gcc/config/riscv/gen-riscv-mcpu-texi.cc
+++ b/gcc/config/riscv/gen-riscv-mcpu-texi.cc
@@ -26,7 +26,7 @@ main ()
 
   std::vector<std::string> coreNames;
 
-#define RISCV_CORE(CORE_NAME, ARCH, MICRO_ARCH) \
+#define RISCV_CORE(CORE_NAME, ARCH, ABI, MICRO_ARCH)	\
   coreNames.push_back (CORE_NAME);
 #include "riscv-cores.def"
 #undef RISCV_CORE
diff --git a/gcc/config/riscv/riscv-cores.def b/gcc/config/riscv/riscv-cores.def
index cc9d5c03cb8..6a8d01f2464 100644
--- a/gcc/config/riscv/riscv-cores.def
+++ b/gcc/config/riscv/riscv-cores.def
@@ -60,7 +60,7 @@ RISCV_TUNE("mips-p8700", mips_p8700, mips_p8700_tune_info)
 
    Before using #include to read this file, define a macro:
 
-      RISCV_CORE(CORE_NAME, ARCH, MICRO_ARCH)
+      RISCV_CORE(CORE_NAME, ARCH, ABI, MICRO_ARCH)
 
    The CORE_NAME is the name of the core, represented as a string.
    The ARCH is the default arch of the core, represented as a string,
@@ -69,57 +69,57 @@ RISCV_TUNE("mips-p8700", mips_p8700, mips_p8700_tune_info)
    will be made, represented as an identifier.  */
 
 #ifndef RISCV_CORE
-#define RISCV_CORE(CORE_NAME, ARCH, MICRO_ARCH)
+#define RISCV_CORE(CORE_NAME, ARCH, ABI, MICRO_ARCH)
 #endif
 
-RISCV_CORE("sifive-e20",      "rv32imc",    "rocket")
-RISCV_CORE("sifive-e21",      "rv32imac",   "rocket")
-RISCV_CORE("sifive-e24",      "rv32imafc",  "rocket")
-RISCV_CORE("sifive-e31",      "rv32imac",   "sifive-3-series")
-RISCV_CORE("sifive-e34",      "rv32imafc",  "sifive-3-series")
-RISCV_CORE("sifive-e76",      "rv32imafc",  "sifive-7-series")
+RISCV_CORE("sifive-e20",      "rv32imc",    "ilp32",  "rocket")
+RISCV_CORE("sifive-e21",      "rv32imac",   "ilp32",  "rocket")
+RISCV_CORE("sifive-e24",      "rv32imafc",  "ilp32f", "rocket")
+RISCV_CORE("sifive-e31",      "rv32imac",   "ilp32",  "sifive-3-series")
+RISCV_CORE("sifive-e34",      "rv32imafc",  "ilp32f", "sifive-3-series")
+RISCV_CORE("sifive-e76",      "rv32imafc",  "ilp32f", "sifive-7-series")
 
-RISCV_CORE("sifive-s21",      "rv64imac",   "rocket")
-RISCV_CORE("sifive-s51",      "rv64imac",   "sifive-5-series")
-RISCV_CORE("sifive-s54",      "rv64imafdc", "sifive-5-series")
-RISCV_CORE("sifive-s76",      "rv64imafdc", "sifive-7-series")
+RISCV_CORE("sifive-s21",      "rv64imac",   "lp64",  "rocket")
+RISCV_CORE("sifive-s51",      "rv64imac",   "lp64",  "sifive-5-series")
+RISCV_CORE("sifive-s54",      "rv64imafdc", "lp64d", "sifive-5-series")
+RISCV_CORE("sifive-s76",      "rv64imafdc", "lp64d", "sifive-7-series")
 
-RISCV_CORE("sifive-u54",      "rv64imafdc", "sifive-5-series")
-RISCV_CORE("sifive-u74",      "rv64imafdc", "sifive-7-series")
-RISCV_CORE("sifive-x280",     "rv64imafdcv_zfh_zba_zbb_zvfh_zvl512b", "sifive-7-series")
+RISCV_CORE("sifive-u54",      "rv64imafdc", "lp64d", "sifive-5-series")
+RISCV_CORE("sifive-u74",      "rv64imafdc", "lp64d", "sifive-7-series")
+RISCV_CORE("sifive-x280",     "rv64imafdcv_zfh_zba_zbb_zvfh_zvl512b", "lp64d", "sifive-7-series")
 RISCV_CORE("sifive-p450",     "rv64imafdc_za64rs_zic64b_zicbom_zicbop_zicboz_"
 			      "ziccamoa_ziccif_zicclsm_ziccrse_zicsr_zifencei_"
 			      "zihintntl_zihintpause_zihpm_zfhmin_zba_zbb_zbs",
-			      "sifive-p400-series")
+			      "lp64d", "sifive-p400-series")
 RISCV_CORE("sifive-p670",     "rv64imafdcv_za64rs_zic64b_zicbom_zicbop_zicboz_"
 			      "ziccamoa_ziccif_zicclsm_ziccrse_zicsr_zifencei_"
 			      "zihintntl_zihintpause_zihpm_zfhmin_zba_zbb_zbs_"
 			      "zvl128b_zvbb_zvknc_zvkng_zvksc_zvksg",
-			      "sifive-p600-series")
+			      "lp64d", "sifive-p600-series")
 
 RISCV_CORE("thead-c906",      "rv64imafdc_xtheadba_xtheadbb_xtheadbs_xtheadcmo_"
 			      "xtheadcondmov_xtheadfmemidx_xtheadmac_"
 			      "xtheadmemidx_xtheadmempair_xtheadsync",
-			      "thead-c906")
+			      "lp64d", "thead-c906")
 
 RISCV_CORE("xt-c908",         "rv64imafdc_zicbom_zicbop_zicboz_zicntr_zicsr_"
 			      "zifencei_zihintpause_zihpm_zfh_zba_zbb_zbc_zbs_"
 			      "sstc_svinval_svnapot_svpbmt_xtheadba_xtheadbb_"
 			      "xtheadbs_xtheadcmo_xtheadcondmov_xtheadfmemidx_"
 			      "xtheadmac_xtheadmemidx_xtheadmempair_xtheadsync",
-			      "xt-c908")
+			      "lp64d", "xt-c908")
 RISCV_CORE("xt-c908v",        "rv64imafdcv_zicbom_zicbop_zicboz_zicntr_zicsr_"
 			      "zifencei_zihintpause_zihpm_zfh_zba_zbb_zbc_zbs_"
 			      "zvfh_sstc_svinval_svnapot_svpbmt__xtheadba_"
 			      "xtheadbb_xtheadbs_xtheadcmo_xtheadcondmov_"
 			      "xtheadfmemidx_xtheadmac_xtheadmemidx_"
 			      "xtheadmempair_xtheadsync",
-			      "xt-c908")
+			      "lp64d", "xt-c908")
 RISCV_CORE("xt-c910",         "rv64imafdc_zicntr_zicsr_zifencei_zihpm_zfh_"
 			      "xtheadba_xtheadbb_xtheadbs_xtheadcmo_"
 			      "xtheadcondmov_xtheadfmemidx_xtheadmac_"
 			      "xtheadmemidx_xtheadmempair_xtheadsync",
-			      "xt-c910")
+			      "lp64d", "xt-c910")
 RISCV_CORE("xt-c910v2",       "rv64imafdc_zicbom_zicbop_zicboz_zicntr_zicond_"
 			      "zicsr_zifencei_zihintntl_zihintpause_zihpm_"
 			      "zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zba_zbb_zbc_"
@@ -127,13 +127,13 @@ RISCV_CORE("xt-c910v2",       "rv64imafdc_zicbom_zicbop_zicboz_zicntr_zicond_"
 			      "xtheadba_xtheadbb_xtheadbs_xtheadcmo_"
 			      "xtheadcondmov_xtheadfmemidx_xtheadmac_"
 			      "xtheadmemidx_xtheadmempair_xtheadsync",
-			      "xt-c910v2")
+			      "lp64d", "xt-c910v2")
 RISCV_CORE("xt-c920",         "rv64imafdc_zicntr_zicsr_zifencei_zihpm_zfh_"
 			      "xtheadba_xtheadbb_xtheadbs_xtheadcmo_"
 			      "xtheadcondmov_xtheadfmemidx_xtheadmac_"
 			      "xtheadmemidx_xtheadmempair_xtheadsync_"
 			      "xtheadvector",
-			      "xt-c910")
+			      "lp64d", "xt-c910")
 RISCV_CORE("xt-c920v2",       "rv64imafdcv_zicbom_zicbop_zicboz_zicntr_zicond_"
 			      "zicsr_zifencei_zihintntl_zihintpause_zihpm_"
 			      "zawrs_zfa_zfbfmin_zfh_zca_zcb_zcd_zba_zbb_zbc_"
@@ -142,19 +142,19 @@ RISCV_CORE("xt-c920v2",       "rv64imafdcv_zicbom_zicbop_zicboz_zicntr_zicond_"
 			      "xtheadbs_xtheadcmo_xtheadcondmov_xtheadfmemidx_"
 			      "xtheadmac_xtheadmemidx_xtheadmempair_"
 			      "xtheadsync",
-			       "xt-c920v2")
+			      "lp64d", "xt-c920v2")
 
 RISCV_CORE("tt-ascalon-d8",   "rv64imafdcv_zic64b_zicbom_zicbop_zicboz_"
 			      "ziccamoa_ziccif_zicclsm_ziccrse_zicond_zicsr_"
 			      "zifencei_zihintntl_zihintpause_zimop_za64rs_"
 			      "zawrs_zfa_zfbfmin_zfh_zcb_zcmop_zba_zbb_zbs_"
 			      "zvbb_zvbc_zvfbfwma_zvfh_zvkng_zvl256b",
-			      "tt-ascalon-d8")
+			      "lp64d", "tt-ascalon-d8")
 
 RISCV_CORE("xiangshan-nanhu",      "rv64imafdc_zba_zbb_zbc_zbs_"
 			      "zbkb_zbkc_zbkx_zknd_zkne_zknh_zksed_zksh_"
 			      "svinval_zicbom_zicboz",
-			      "xiangshan-nanhu")
+			      "lp64d", "xiangshan-nanhu")
 
 RISCV_CORE("xiangshan-kunminghu",   "rv64imafdcbvh_sdtrig_sha_shcounterenw_"
 			      "shgatpa_shlcofideleg_shtvala_shvsatpa_shvstvala_shvstvecd_"
@@ -167,8 +167,8 @@ RISCV_CORE("xiangshan-kunminghu",   "rv64imafdcbvh_sdtrig_sha_shcounterenw_"
 			      "zicclsm_ziccrse_zicntr_zicond_zicsr_zifencei_zihintpause_"
 			      "zihpm_zimop_zkn_zknd_zkne_zknh_zksed_zksh_zkt_zvbb_zvfh_"
 			      "zvfhmin_zvkt_zvl128b_zvl32b_zvl64b",
-			      "xiangshan-kunminghu")
+			      "lp64d", "xiangshan-kunminghu")
 
 RISCV_CORE("mips-p8700",      "rv64imfd_zicsr_zifencei_zalrsc_zba_zbb",
-			      "mips-p8700")
+			      "lp64d", "mips-p8700")
 #undef RISCV_CORE
diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-protos.h
index cdb706ab82a..3f6cc829209 100644
--- a/gcc/config/riscv/riscv-protos.h
+++ b/gcc/config/riscv/riscv-protos.h
@@ -223,6 +223,9 @@ struct riscv_cpu_info {
   /* Default arch for this CPU, could be NULL if no default arch.  */
   const char *arch;
 
+  /* Default ABI for this CPU, can be nullptr if no default abi.  */
+  const char *abi;
+
   /* Which automaton to use for tuning.  */
   const char *tune;
 };
diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h
index a0ad75c765a..74892c63635 100644
--- a/gcc/config/riscv/riscv.h
+++ b/gcc/config/riscv/riscv.h
@@ -48,11 +48,13 @@ 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_expand_abi_from_cpu (int argc, const char **argv);
 extern const char *riscv_default_mtune (int argc, const char **argv);
 extern const char *riscv_multi_lib_check (int argc, const char **argv);
 extern const char *riscv_arch_help (int argc, const char **argv);
 
 # define EXTRA_SPEC_FUNCTIONS						\
+  { "riscv_expand_abi_from_cpu", riscv_expand_abi_from_cpu },		\
   { "riscv_expand_arch", riscv_expand_arch },				\
   { "riscv_expand_arch_from_cpu", riscv_expand_arch_from_cpu },		\
   { "riscv_default_mtune", riscv_default_mtune },			\
@@ -74,7 +76,9 @@ extern const char *riscv_arch_help (int argc, const char **argv);
   {"arch", "%{!march=*|march=unset:"					\
 	   "  %{!mcpu=*:-march=%(VALUE)}"				\
 	   "  %{mcpu=*:%:riscv_expand_arch_from_cpu(%* %(VALUE))}}" },	\
-  {"abi", "%{!mabi=*:-mabi=%(VALUE)}" },				\
+  {"abi", "%{!mabi=*:"							\
+	   "  %{!mcpu=*:-mabi=%(VALUE)}"				\
+	   "  %{mcpu=*:%:riscv_expand_abi_from_cpu(%* %(VALUE))}}" },	\
   {"isa_spec", "%{!misa-spec=*:-misa-spec=%(VALUE)}" },			\
   {"tls", "%{!mtls-dialect=*:-mtls-dialect=%(VALUE)}"},         	\
 
@@ -123,7 +127,8 @@ ARCH_UNSET_CLEANUP_SPECS \
 "%{-print-supported-extensions:%:riscv_arch_help()} "		\
 "%{march=*:%:riscv_expand_arch(%*)} "				\
 "%{!march=*|march=unset:%{mcpu=*:%:riscv_expand_arch_from_cpu(%*)}} " \
-"%{march=unset:%{!mcpu=*:%eAt least one valid -mcpu option must be given after -march=unset}} "
+"%{march=unset:%{!mcpu=*:%eAt least one valid -mcpu option must be given after -march=unset}} " \
+"%{!mabi=*:%{mcpu=*:%:riscv_expand_abi_from_cpu(%*)}} "
 
 #define LOCAL_LABEL_PREFIX	"."
 #define USER_LABEL_PREFIX	""
-- 
2.51.1

Reply via email to