sim: namespace sim_machs

We want to do a single build with all arches in one binary which means
we need to namespace sim_machs on a per-arch basis.  Move it from a
global variable to the sim description structure so it can be setup at
runtime.

Changing the SIM_MODEL->num from an enum to an int is unfortunate, but
we specifically don't want to maintain a centralized list anymore, and
this was never used directly in common code, just passed to per-arch
callbacks.
This commit is contained in:
Mike Frysinger
2021-06-28 21:42:56 -04:00
parent f8261de1b2
commit 1c636da093
35 changed files with 167 additions and 46 deletions

View File

@@ -1,3 +1,27 @@
2021-06-30 Mike Frysinger <vapier@gentoo.org>
* cgen-defs.h (cgen_cpu_max_extra_bytes): Add SIM_DESC arg.
* cgen-utils.c (cgen_cpu_max_extra_bytes): Likewise. Change sim_machs
to STATE_MACHS.
* sim-base.h (struct sim_state): Add machs.
(STATE_MACHS): New define.
* sim-cpu.c (sim_cpu_alloc): Pass sd to cgen_cpu_max_extra_bytes.
* sim-model.c (model_option_handler): Pass sd to sim_model_lookup.
Change sim_machs to STATE_MACHS.
(sim_model_lookup): Add SIM_DESC arg. Change sim_machs to
STATE_MACHS.
(sim_mach_lookup): Likewiwse.
(sim_mach_lookup_bfd_name): Likewise.
(sim_model_init): Pass sd to sim_model_lookup and
sim_mach_lookup_bfd_name.
(sim_machs): Delete.
* sim-model.h (enum mach_attr): Delete.
(SIM_MODEL): Change num to int.
(sim_machs): Delete.
(sim_model_lookup): Add SIM_DESC arg.
(sim_mach_lookup): Likewise.
(sim_mach_lookup_bfd_name): Likewise.
2021-06-29 Mike Frysinger <vapier@gentoo.org>
* Make-common.in (Makefile): Replace $(arch) and pass more files to

View File

@@ -146,7 +146,7 @@ extern CPU_INSN_NAME_FN cgen_insn_name;
/* Return the maximum number of extra bytes required for a sim_cpu struct. */
/* ??? Ok, yes, this is less pretty than it should be. Give me a better
language [or suggest a better way]. */
extern int cgen_cpu_max_extra_bytes (void);
extern int cgen_cpu_max_extra_bytes (SIM_DESC);
/* Target supplied routine to process an invalid instruction. */
extern SEM_PC sim_engine_invalid_insn (SIM_CPU *, IADDR, SEM_PC);

View File

@@ -101,14 +101,16 @@ cgen_insn_name (SIM_CPU *cpu, int i)
/* Return the maximum number of extra bytes required for a SIM_CPU struct. */
int
cgen_cpu_max_extra_bytes (void)
cgen_cpu_max_extra_bytes (SIM_DESC sd)
{
int i;
const SIM_MACH * const *machp;
int extra = 0;
for (i = 0; sim_machs[i] != 0; ++i)
SIM_ASSERT (STATE_MACHS (sd) != NULL);
for (machp = STATE_MACHS (sd); *machp != NULL; ++machp)
{
int size = IMP_PROPS_SIM_CPU_SIZE (MACH_IMP_PROPS (sim_machs[i]));
int size = IMP_PROPS_SIM_CPU_SIZE (MACH_IMP_PROPS (*machp));
if (size > extra)
extra = size;
}

View File

@@ -143,6 +143,10 @@ struct sim_state {
const char *target;
#define STATE_TARGET(sd) ((sd)->target)
/* List of machs available. */
const SIM_MACH * const *machs;
#define STATE_MACHS(sd) ((sd)->machs)
/* In standalone simulator, this is the program's arguments passed
on the command line. */
char **prog_argv;

View File

@@ -48,7 +48,7 @@ sim_cpu_alloc (SIM_DESC sd)
int extra_bytes = 0;
#ifdef CGEN_ARCH
extra_bytes += cgen_cpu_max_extra_bytes ();
extra_bytes += cgen_cpu_max_extra_bytes (sd);
#endif
return zalloc (sizeof (sim_cpu) + extra_bytes);

View File

@@ -62,7 +62,7 @@ model_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
{
case OPTION_MODEL :
{
const SIM_MODEL *model = sim_model_lookup (arg);
const SIM_MODEL *model = sim_model_lookup (sd, arg);
if (! model)
{
sim_io_eprintf (sd, "unknown model `%s'\n", arg);
@@ -76,7 +76,14 @@ model_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt,
{
const SIM_MACH * const *machp;
const SIM_MODEL *model;
for (machp = & sim_machs[0]; *machp != NULL; ++machp)
if (STATE_MACHS (sd) == NULL)
{
sim_io_printf (sd, "This target does not support any models\n");
return SIM_RC_FAIL;
}
for (machp = STATE_MACHS(sd); *machp != NULL; ++machp)
{
sim_io_printf (sd, "Models for architecture `%s':\n",
MACH_NAME (*machp));
@@ -138,12 +145,15 @@ sim_model_set (SIM_DESC sd, sim_cpu *cpu, const SIM_MODEL *model)
Result is pointer to MODEL entry or NULL if not found. */
const SIM_MODEL *
sim_model_lookup (const char *name)
sim_model_lookup (SIM_DESC sd, const char *name)
{
const SIM_MACH * const *machp;
const SIM_MODEL *model;
for (machp = & sim_machs[0]; *machp != NULL; ++machp)
if (STATE_MACHS (sd) == NULL)
return NULL;
for (machp = STATE_MACHS (sd); *machp != NULL; ++machp)
{
for (model = MACH_MODELS (*machp); MODEL_NAME (model) != NULL; ++model)
{
@@ -158,11 +168,14 @@ sim_model_lookup (const char *name)
Result is pointer to MACH entry or NULL if not found. */
const SIM_MACH *
sim_mach_lookup (const char *name)
sim_mach_lookup (SIM_DESC sd, const char *name)
{
const SIM_MACH * const *machp;
for (machp = & sim_machs[0]; *machp != NULL; ++machp)
if (STATE_MACHS (sd) == NULL)
return NULL;
for (machp = STATE_MACHS (sd); *machp != NULL; ++machp)
{
if (strcmp (MACH_NAME (*machp), name) == 0)
return *machp;
@@ -174,11 +187,14 @@ sim_mach_lookup (const char *name)
Result is pointer to MACH entry or NULL if not found. */
const SIM_MACH *
sim_mach_lookup_bfd_name (const char *name)
sim_mach_lookup_bfd_name (SIM_DESC sd, const char *name)
{
const SIM_MACH * const *machp;
for (machp = & sim_machs[0]; *machp != NULL; ++machp)
if (STATE_MACHS (sd) == NULL)
return NULL;
for (machp = STATE_MACHS (sd); *machp != NULL; ++machp)
{
if (strcmp (MACH_BFD_NAME (*machp), name) == 0)
return *machp;
@@ -209,7 +225,7 @@ sim_model_init (SIM_DESC sd)
&& ! CPU_MACH (cpu))
{
/* Set the default model. */
const SIM_MODEL *model = sim_model_lookup (WITH_DEFAULT_MODEL);
const SIM_MODEL *model = sim_model_lookup (sd, WITH_DEFAULT_MODEL);
SIM_ASSERT (model != NULL);
sim_model_set (sd, NULL, model);
}
@@ -230,7 +246,8 @@ sim_model_init (SIM_DESC sd)
{
/* Use the default model for the selected machine.
The default model is the first one in the list. */
const SIM_MACH *mach = sim_mach_lookup_bfd_name (STATE_ARCHITECTURE (sd)->printable_name);
const SIM_MACH *mach =
sim_mach_lookup_bfd_name (sd, STATE_ARCHITECTURE (sd)->printable_name);
if (mach == NULL)
{
@@ -247,12 +264,3 @@ sim_model_init (SIM_DESC sd)
return SIM_RC_OK;
}
#if !WITH_MODEL_P
/* Set up basic model support. This is a stub for ports that do not define
models. See sim-model.h for more details. */
const SIM_MACH * const sim_machs[] =
{
NULL
};
#endif

View File

@@ -48,8 +48,6 @@ typedef struct {
#endif
#ifndef WITH_DEFAULT_MODEL
/* Just a stub for ports that do not define models. */
enum mach_attr { _MACH_NONE };
# define WITH_DEFAULT_MODEL NULL
# define WITH_MODEL_P 0
#else
@@ -92,7 +90,7 @@ typedef struct {
/* This is the argument to bfd_scan_arch. */
const char *bfd_name;
#define MACH_BFD_NAME(m) ((m)->bfd_name)
enum mach_attr num;
int num;
#define MACH_NUM(m) ((m)->num)
int word_bitsize;
@@ -136,19 +134,13 @@ typedef struct model {
#define MODEL_INIT(m) ((m)->init)
} SIM_MODEL;
/* Tables of supported machines. */
/* ??? In a simulator of multiple architectures, will need multiple copies of
this. Have an `archs' array that contains a pointer to the machs array
for each (which in turn has a pointer to the models array for each). */
extern const SIM_MACH * const sim_machs[];
/* Model module handlers. */
extern MODULE_INSTALL_FN sim_model_install;
/* Support routines. */
extern void sim_model_set (SIM_DESC sd_, sim_cpu *cpu_, const SIM_MODEL *model_);
extern const SIM_MODEL *sim_model_lookup (const char *name_);
extern const SIM_MACH *sim_mach_lookup (const char *name_);
extern const SIM_MACH *sim_mach_lookup_bfd_name (const char *bfd_name_);
extern const SIM_MODEL *sim_model_lookup (SIM_DESC, const char *name_);
extern const SIM_MACH *sim_mach_lookup (SIM_DESC, const char *name_);
extern const SIM_MACH *sim_mach_lookup_bfd_name (SIM_DESC, const char *bfd_name_);
#endif /* SIM_MODEL_H */