sim: unify gettext/intl probing logic
[deliverable/binutils-gdb.git] / sim / common / sim-base.h
index 60072d334d8e18f9f8691a7bf52f74961bb701d6..054b2ba0c6ebd886957922a03f30b10b555fb5fa 100644 (file)
@@ -1,6 +1,6 @@
 /* Simulator pseudo baseclass.
 
-   Copyright 1997-2019 Free Software Foundation, Inc.
+   Copyright 1997-2021 Free Software Foundation, Inc.
 
    Contributed by Cygnus Support.
 
@@ -42,14 +42,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
         sim_cpu_base base;
      };
 
-     struct sim_state {
-       sim_cpu *cpu[MAX_NR_PROCESSORS];
-       ... simulator specific members ...
-       sim_state_base base;
-     };
-
-   Note that `base' appears last.  This makes `base.magic' appear last
-   in the entire struct and helps catch miscompilation errors. */
+   If your sim needs to allocate sim-wide state, use STATE_ARCH_DATA.  */
 
 
 #ifndef SIM_BASE_H
@@ -95,139 +88,144 @@ typedef struct _sim_cpu sim_cpu;
 #include "sim-cpu.h"
 #include "sim-assert.h"
 
-
-/* We require all sims to dynamically allocate cpus.  See comment up top about
-   struct sim_state.  */
+struct sim_state {
+  /* All the cpus for this instance.  */
+  sim_cpu *cpu[MAX_NR_PROCESSORS];
 #if (WITH_SMP)
 # define STATE_CPU(sd, n) ((sd)->cpu[n])
 #else
 # define STATE_CPU(sd, n) ((sd)->cpu[0])
 #endif
 
-
-typedef struct {
-
   /* Simulator's argv[0].  */
   const char *my_name;
-#define STATE_MY_NAME(sd) ((sd)->base.my_name)
+#define STATE_MY_NAME(sd) ((sd)->my_name)
 
   /* Who opened the simulator.  */
   SIM_OPEN_KIND open_kind;
-#define STATE_OPEN_KIND(sd) ((sd)->base.open_kind)
+#define STATE_OPEN_KIND(sd) ((sd)->open_kind)
 
   /* The host callbacks.  */
   struct host_callback_struct *callback;
-#define STATE_CALLBACK(sd) ((sd)->base.callback)
+#define STATE_CALLBACK(sd) ((sd)->callback)
 
   /* The type of simulation environment (user/operating).  */
   enum sim_environment environment;
-#define STATE_ENVIRONMENT(sd) ((sd)->base.environment)
+#define STATE_ENVIRONMENT(sd) ((sd)->environment)
 
 #if 0 /* FIXME: Not ready yet.  */
   /* Stuff defined in sim-config.h.  */
   struct sim_config config;
-#define STATE_CONFIG(sd) ((sd)->base.config)
+#define STATE_CONFIG(sd) ((sd)->config)
 #endif
 
   /* List of installed module `init' handlers.  */
   struct module_list *modules;
-#define STATE_MODULES(sd) ((sd)->base.modules)
+#define STATE_MODULES(sd) ((sd)->modules)
 
   /* Supported options.  */
   struct option_list *options;
-#define STATE_OPTIONS(sd) ((sd)->base.options)
+#define STATE_OPTIONS(sd) ((sd)->options)
 
   /* Non-zero if -v specified.  */
   int verbose_p;
-#define STATE_VERBOSE_P(sd) ((sd)->base.verbose_p)
+#define STATE_VERBOSE_P(sd) ((sd)->verbose_p)
 
   /* Non cpu-specific trace data.  See sim-trace.h.  */
   TRACE_DATA trace_data;
-#define STATE_TRACE_DATA(sd) (& (sd)->base.trace_data)
+#define STATE_TRACE_DATA(sd) (& (sd)->trace_data)
 
   /* If non NULL, the BFD architecture specified on the command line */
   const struct bfd_arch_info *architecture;
-#define STATE_ARCHITECTURE(sd) ((sd)->base.architecture)
+#define STATE_ARCHITECTURE(sd) ((sd)->architecture)
 
   /* If non NULL, the bfd target specified on the command line */
   const char *target;
-#define STATE_TARGET(sd) ((sd)->base.target)
+#define STATE_TARGET(sd) ((sd)->target)
 
   /* In standalone simulator, this is the program's arguments passed
      on the command line.  */
   char **prog_argv;
-#define STATE_PROG_ARGV(sd) ((sd)->base.prog_argv)
+#define STATE_PROG_ARGV(sd) ((sd)->prog_argv)
 
   /* The program's bfd.  */
   struct bfd *prog_bfd;
-#define STATE_PROG_BFD(sd) ((sd)->base.prog_bfd)
+#define STATE_PROG_BFD(sd) ((sd)->prog_bfd)
 
   /* Symbol table for prog_bfd */
   struct bfd_symbol **prog_syms;
-#define STATE_PROG_SYMS(sd) ((sd)->base.prog_syms)
+#define STATE_PROG_SYMS(sd) ((sd)->prog_syms)
 
   /* Number of prog_syms symbols.  */
   long prog_syms_count;
-#define STATE_PROG_SYMS_COUNT(sd) ((sd)->base.prog_syms_count)
+#define STATE_PROG_SYMS_COUNT(sd) ((sd)->prog_syms_count)
 
   /* The program's text section.  */
   struct bfd_section *text_section;
   /* Starting and ending text section addresses from the bfd.  */
   bfd_vma text_start, text_end;
-#define STATE_TEXT_SECTION(sd) ((sd)->base.text_section)
-#define STATE_TEXT_START(sd) ((sd)->base.text_start)
-#define STATE_TEXT_END(sd) ((sd)->base.text_end)
+#define STATE_TEXT_SECTION(sd) ((sd)->text_section)
+#define STATE_TEXT_START(sd) ((sd)->text_start)
+#define STATE_TEXT_END(sd) ((sd)->text_end)
 
   /* Start address, set when the program is loaded from the bfd.  */
   bfd_vma start_addr;
-#define STATE_START_ADDR(sd) ((sd)->base.start_addr)
+#define STATE_START_ADDR(sd) ((sd)->start_addr)
 
   /* Size of the simulator's cache, if any.
      This is not the target's cache.  It is the cache the simulator uses
      to process instructions.  */
   unsigned int scache_size;
-#define STATE_SCACHE_SIZE(sd) ((sd)->base.scache_size)
+#define STATE_SCACHE_SIZE(sd) ((sd)->scache_size)
 
   /* core memory bus */
-#define STATE_CORE(sd) (&(sd)->base.core)
+#define STATE_CORE(sd) (&(sd)->core)
   sim_core core;
 
   /* Record of memory sections added via the memory-options interface.  */
-#define STATE_MEMOPT(sd) ((sd)->base.memopt)
+#define STATE_MEMOPT(sd) ((sd)->memopt)
   sim_memopt *memopt;
 
   /* event handler */
-#define STATE_EVENTS(sd) (&(sd)->base.events)
+#define STATE_EVENTS(sd) (&(sd)->events)
   sim_events events;
 
   /* generic halt/resume engine */
   sim_engine engine;
-#define STATE_ENGINE(sd) (&(sd)->base.engine)
+#define STATE_ENGINE(sd) (&(sd)->engine)
 
   /* generic watchpoint support */
   sim_watchpoints watchpoints;
-#define STATE_WATCHPOINTS(sd) (&(sd)->base.watchpoints)
+#define STATE_WATCHPOINTS(sd) (&(sd)->watchpoints)
 
 #if WITH_HW
   struct sim_hw *hw;
-#define STATE_HW(sd) ((sd)->base.hw)
+#define STATE_HW(sd) ((sd)->hw)
 #endif
 
   /* Should image loads be performed using the LMA or VMA?  Older
      simulators use the VMA while newer simulators prefer the LMA. */
   int load_at_lma_p;
-#define STATE_LOAD_AT_LMA_P(SD) ((SD)->base.load_at_lma_p)
+#define STATE_LOAD_AT_LMA_P(SD) ((SD)->load_at_lma_p)
+
+  /* Pointer for sim target to store arbitrary state data.  Normally the
+     target should define a struct and use it here.  */
+  void *arch_data;
+#define STATE_ARCH_DATA(sd) ((sd)->arch_data)
 
   /* Marker for those wanting to do sanity checks.
      This should remain the last member of this struct to help catch
      miscompilation errors.  */
   int magic;
 #define SIM_MAGIC_NUMBER 0x4242
-#define STATE_MAGIC(sd) ((sd)->base.magic)
-} sim_state_base;
+#define STATE_MAGIC(sd) ((sd)->magic)
+};
 
 /* Functions for allocating/freeing a sim_state.  */
-SIM_DESC sim_state_alloc (SIM_OPEN_KIND kind, host_callback *callback);
+SIM_DESC sim_state_alloc_extra (SIM_OPEN_KIND kind, host_callback *callback,
+                               size_t extra_bytes);
+#define sim_state_alloc(kind, callback) sim_state_alloc_extra(kind, callback, 0)
+
 void sim_state_free (SIM_DESC);
 
 #ifdef __cplusplus
This page took 0.026299 seconds and 4 git commands to generate.