{NULL, NULL}
};
+/* Alternate/alias name for a CPU we know about. */
+struct riscv_cpu_alias_info {
+ /* This CPU's canonical name. */
+ const char *name;
+
+ /* This CPU's alternate name. */
+ const char *alias;
+};
+
+static const riscv_cpu_alias_info riscv_cpu_alias_table[] =
+{
+#define RISCV_CORE_ALIAS(CANONICAL_NAME, ALIAS_NAME) \
+ {CANONICAL_NAME, ALIAS_NAME},
+#include "../../../config/riscv/riscv-cores.def"
+ {NULL, NULL}
+};
+
static const riscv_cpu_info riscv_cpu_tables[] =
{
#define RISCV_CORE(CORE_NAME, ARCH, TUNE) \
if (strcmp (cpu, name) == 0)
return cpu_info;
}
+
+ /* We did not find CPU, check if CPU is a core's alias name and look it
+ up using its canonical name. */
+ const riscv_cpu_alias_info *alias_info = &riscv_cpu_alias_table[0];
+ for (; alias_info->alias != NULL; alias_info++)
+ if (strcmp (cpu, alias_info->alias) == 0)
+ return riscv_find_cpu (alias_info->name);
+
return NULL;
}
int i;
const char *str;
FOR_EACH_VEC_ELT (v, i, str)
- {
- if (!strcmp (str, cpu_info->name))
+ if (!strcmp (str, cpu_info->name))
+ {
skip = true;
- }
+ break;
+ }
if (!skip)
v.safe_push (cpu_info->name);
}
+
+ const riscv_cpu_alias_info *alias_info = &riscv_cpu_alias_table[0];
+ for (; alias_info->alias; alias_info++)
+ {
+ /* Skip duplicates. */
+ bool skip = false;
+ int i;
+ const char *str;
+ FOR_EACH_VEC_ELT (v, i, str)
+ if (!strcmp (str, alias_info->alias))
+ {
+ skip = true;
+ break;
+ }
+ if (!skip)
+ v.safe_push (alias_info->alias);
+ }
}
break;
case OPT_mcpu_:
const riscv_cpu_info *cpu_info = &riscv_cpu_tables[0];
for (;cpu_info->name; ++cpu_info)
v.safe_push (cpu_info->name);
+
+ const riscv_cpu_alias_info *alias_info = &riscv_cpu_alias_table[0];
+ for (; alias_info->alias; alias_info++)
+ v.safe_push (alias_info->alias);
}
break;
default:
The ARCH is the default arch of the core, represented as a string,
can be NULL if no default arch.
The MICRO_ARCH is the name of the core for which scheduling decisions
- will be made, represented as an identifier. */
+ will be made, represented as an identifier.
+
+ If the core has an alternate name(s), an alias(es) can be created to map
+ an alternate name to the core's canonical name. Before using #include
+ to read this file, define a macro:
+
+ RISCV_CORE_ALIAS(CANONICAL_NAME, ALIAS_NAME)
+
+ CANONICAL_NAME is the normal name of the core, represented as a string.
+ ALIAS_NAME is the alternate name for the core, represented as a string. */
#ifndef RISCV_CORE
#define RISCV_CORE(CORE_NAME, ARCH, MICRO_ARCH)
#endif
+#ifndef RISCV_CORE_ALIAS
+#define RISCV_CORE_ALIAS(CANONICAL_NAME, ALIAS_NAME)
+#endif
RISCV_CORE("sifive-e20", "rv32imc", "rocket")
RISCV_CORE("sifive-e21", "rv32imac", "rocket")
"spacemit-x60")
#undef RISCV_CORE
+#undef RISCV_CORE_ALIAS