Adjust gdb.mi/mi-sym-info.exp filename patterns.
[deliverable/binutils-gdb.git] / sim / common / sim-base.h
index 8b1ac932acc9c3d077bc8586a53965445b5afd2f..f07ae52cb951455acd513941c545c89eb8f3e968 100644 (file)
 /* Simulator pseudo baseclass.
 /* Simulator pseudo baseclass.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+
+   Copyright 1997-2020 Free Software Foundation, Inc.
+
    Contributed by Cygnus Support.
 
 This file is part of GDB, the GNU debugger.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
    Contributed by Cygnus Support.
 
 This file is part of GDB, the GNU debugger.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
-with this program; if not, write to the Free Software Foundation, Inc.,
-59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* Simulator state pseudo baseclass.
+
+   Each simulator is required to have the file ``sim-main.h''.  That
+   file includes ``sim-basics.h'', defines the base type ``sim_cia''
+   (the data type that contains complete current instruction address
+   information), include ``sim-base.h'':
+
+     #include "sim-basics.h"
+     /-* If `sim_cia' is not an integral value (e.g. a struct), define
+         CIA_ADDR to return the integral value.  *-/
+     /-* typedef struct {...} sim_cia; *-/
+     /-* #define CIA_ADDR(cia) (...) *-/
+     #include "sim-base.h"
+
+   finally, two data types `struct _sim_cpu' and `struct sim_state'
+   are defined:
+
+     struct _sim_cpu {
+        ... simulator specific members ...
+        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. */
 
 
-/* This file is meant to be included by sim-basics.h.  */
 
 #ifndef SIM_BASE_H
 #define SIM_BASE_H
 
 
 #ifndef SIM_BASE_H
 #define SIM_BASE_H
 
-/* Global pointer to current state while sim_resume is running.
-   On a machine with lots of registers, it might be possible to reserve
-   one of them for current_state.  However on a machine with few registers
-   current_state can't permanently live in one and indirecting through it
-   will be slower [in which case one can have sim_resume set globals from
-   current_state for faster access].
-   If CURRENT_STATE_REG is defined, it means current_state is living in
-   a global register.  */
-
-#ifdef CURRENT_STATE_REG
-/* FIXME: wip */
-#else
-extern struct sim_state *current_state;
+#ifdef __cplusplus
+extern "C" {
 #endif
 
 #endif
 
-/* The simulator may provide different (and faster) definition.  */
-#ifndef CURRENT_STATE
-#define CURRENT_STATE current_state
-#endif
+/* Pre-declare certain types. */
 
 
-/* Simulator state pseudo baseclass.
-   Each simulator is required to have a sim-main.h file that includes
-   sim-basics.h and defines struct sim_state to be:
-
-   struct sim_state {
-     sim_cpu cpu;
-   #define STATE_CPU(sd,n) (&(sd)->cpu)
-     ... simulator specific members ...
-     sim_state_base base;
-   };
-
-   for a single processor or
-
-   struct sim_state {
-     sim_cpu cpu[MAX_CPUS]; -- could be also be array of pointers
-   #define STATE_CPU(sd,n) (&(sd)->cpu[n])
-     ... simulator specific members ...
-     sim_state_base base;
-   };
-
-   for multiprocessors.
-   Note that `base' appears last.  This makes `base.magic' appear last
-   in the entire struct and helps catch miscompilation errors.
+/* typedef <target-dependant> sim_cia; */
+#ifndef NULL_CIA
+#define NULL_CIA ((sim_cia) 0)
+#endif
+/* Return the current instruction address as a number.
+   Some targets treat the current instruction address as a struct
+   (e.g. for delay slot handling).  */
+#ifndef CIA_ADDR
+#define CIA_ADDR(cia) (cia)
+typedef address_word sim_cia;
+#endif
+#ifndef INVALID_INSTRUCTION_ADDRESS
+#define INVALID_INSTRUCTION_ADDRESS ((address_word)0 - 1)
+#endif
 
 
-   sim_cpu is defined to be:
+/* TODO: Probably should just delete SIM_CPU.  */
+typedef struct _sim_cpu SIM_CPU;
+typedef struct _sim_cpu sim_cpu;
+
+#include "sim-module.h"
+
+#include "sim-arange.h"
+#include "sim-trace.h"
+#include "sim-core.h"
+#include "sim-events.h"
+#include "sim-profile.h"
+#include "sim-model.h"
+#include "sim-io.h"
+#include "sim-engine.h"
+#include "sim-watch.h"
+#include "sim-memopt.h"
+#include "sim-cpu.h"
+#include "sim-assert.h"
+
+
+/* We require all sims to dynamically allocate cpus.  See comment up top about
+   struct sim_state.  */
+#if (WITH_SMP)
+# define STATE_CPU(sd, n) ((sd)->cpu[n])
+#else
+# define STATE_CPU(sd, n) ((sd)->cpu[0])
+#endif
 
 
-   typedef struct _sim_cpu {
-      ... simulator specific members ...
-      sim_cpu_base base;
-   } sim_cpu;
-   */
 
 typedef struct {
 
 typedef struct {
+
   /* Simulator's argv[0].  */
   const char *my_name;
 #define STATE_MY_NAME(sd) ((sd)->base.my_name)
   /* Simulator's argv[0].  */
   const char *my_name;
 #define STATE_MY_NAME(sd) ((sd)->base.my_name)
@@ -88,12 +119,20 @@ typedef struct {
   struct host_callback_struct *callback;
 #define STATE_CALLBACK(sd) ((sd)->base.callback)
 
   struct host_callback_struct *callback;
 #define STATE_CALLBACK(sd) ((sd)->base.callback)
 
+  /* The type of simulation environment (user/operating).  */
+  enum sim_environment environment;
+#define STATE_ENVIRONMENT(sd) ((sd)->base.environment)
+
 #if 0 /* FIXME: Not ready yet.  */
   /* Stuff defined in sim-config.h.  */
   struct sim_config config;
 #define STATE_CONFIG(sd) ((sd)->base.config)
 #endif
 
 #if 0 /* FIXME: Not ready yet.  */
   /* Stuff defined in sim-config.h.  */
   struct sim_config config;
 #define STATE_CONFIG(sd) ((sd)->base.config)
 #endif
 
+  /* List of installed module `init' handlers.  */
+  struct module_list *modules;
+#define STATE_MODULES(sd) ((sd)->base.modules)
+
   /* Supported options.  */
   struct option_list *options;
 #define STATE_OPTIONS(sd) ((sd)->base.options)
   /* Supported options.  */
   struct option_list *options;
 #define STATE_OPTIONS(sd) ((sd)->base.options)
@@ -102,41 +141,83 @@ typedef struct {
   int verbose_p;
 #define STATE_VERBOSE_P(sd) ((sd)->base.verbose_p)
 
   int verbose_p;
 #define STATE_VERBOSE_P(sd) ((sd)->base.verbose_p)
 
+  /* Non cpu-specific trace data.  See sim-trace.h.  */
+  TRACE_DATA trace_data;
+#define STATE_TRACE_DATA(sd) (& (sd)->base.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)
+
+  /* If non NULL, the bfd target specified on the command line */
+  const char *target;
+#define STATE_TARGET(sd) ((sd)->base.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)
 
   /* The program's bfd.  */
   /* 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)
 
   /* The program's bfd.  */
-  struct _bfd *prog_bfd;
+  struct bfd *prog_bfd;
 #define STATE_PROG_BFD(sd) ((sd)->base.prog_bfd)
 
 #define STATE_PROG_BFD(sd) ((sd)->base.prog_bfd)
 
+  /* Symbol table for prog_bfd */
+  struct bfd_symbol **prog_syms;
+#define STATE_PROG_SYMS(sd) ((sd)->base.prog_syms)
+
+  /* Number of prog_syms symbols.  */
+  long prog_syms_count;
+#define STATE_PROG_SYMS_COUNT(sd) ((sd)->base.prog_syms_count)
+
   /* The program's text section.  */
   /* The program's text section.  */
-  struct sec *text_section;
+  struct bfd_section *text_section;
   /* Starting and ending text section addresses from the bfd.  */
   /* Starting and ending text section addresses from the bfd.  */
-  SIM_ADDR text_start, text_end;
+  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)
 
   /* Start address, set when the program is loaded from the bfd.  */
 #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)
 
   /* Start address, set when the program is loaded from the bfd.  */
-  SIM_ADDR start_addr;
+  bfd_vma start_addr;
 #define STATE_START_ADDR(sd) ((sd)->base.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.  */
 #define STATE_START_ADDR(sd) ((sd)->base.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 simcache_size;
-#define STATE_SIMCACHE_SIZE(sd) ((sd)->base.simcache_size)
-
-  /* FIXME: Move to top level sim_state struct (as some struct)?  */
-#ifdef SIM_HAVE_FLATMEM
-  unsigned int mem_size;
-#define STATE_MEM_SIZE(sd) ((sd)->base.mem_size)
-  unsigned char *memory;
-#define STATE_MEMORY(sd) ((sd)->base.memory)
+  unsigned int scache_size;
+#define STATE_SCACHE_SIZE(sd) ((sd)->base.scache_size)
+
+  /* core memory bus */
+#define STATE_CORE(sd) (&(sd)->base.core)
+  sim_core core;
+
+  /* Record of memory sections added via the memory-options interface.  */
+#define STATE_MEMOPT(sd) ((sd)->base.memopt)
+  sim_memopt *memopt;
+
+  /* event handler */
+#define STATE_EVENTS(sd) (&(sd)->base.events)
+  sim_events events;
+
+  /* generic halt/resume engine */
+  sim_engine engine;
+#define STATE_ENGINE(sd) (&(sd)->base.engine)
+
+  /* generic watchpoint support */
+  sim_watchpoints watchpoints;
+#define STATE_WATCHPOINTS(sd) (&(sd)->base.watchpoints)
+
+#if WITH_HW
+  struct sim_hw *hw;
+#define STATE_HW(sd) ((sd)->base.hw)
 #endif
 
 #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)
+
   /* Marker for those wanting to do sanity checks.
      This should remain the last member of this struct to help catch
      miscompilation errors.  */
   /* Marker for those wanting to do sanity checks.
      This should remain the last member of this struct to help catch
      miscompilation errors.  */
@@ -145,93 +226,12 @@ typedef struct {
 #define STATE_MAGIC(sd) ((sd)->base.magic)
 } sim_state_base;
 
 #define STATE_MAGIC(sd) ((sd)->base.magic)
 } sim_state_base;
 
-/* Pseudo baseclass for each cpu.  */
-
-typedef struct {
-  /* Backlink to main state struct.  */
-  SIM_DESC sd;
-#define CPU_STATE(cpu) ((cpu)->base.sd)
-
-  /* Maximum number of traceable entities.  */
-#ifndef MAX_TRACE_VALUES
-#define MAX_TRACE_VALUES 12
-#endif
-
-  /* Boolean array of specified tracing flags.  */
-  /* ??? It's not clear that using an array vs a bit mask is faster.
-     Consider the case where one wants to test whether any of several bits
-     are set.  */
-  char trace_flags[MAX_TRACE_VALUES];
-#define CPU_TRACE_FLAGS(cpu) ((cpu)->base.trace_flags)
-  /* Standard values.  */
-#define TRACE_INSN_IDX 0
-#define TRACE_DECODE_IDX 1
-#define TRACE_EXTRACT_IDX 2
-#define TRACE_LINENUM_IDX 3
-#define TRACE_MEMORY_IDX 4
-#define TRACE_MODEL_IDX 5
-#define TRACE_ALU_IDX 6
-#define TRACE_NEXT_IDX 8 /* simulator specific trace bits begin here */
-
-  /* Tracing output goes to this or stdout if NULL.
-     We can't store `stdout' here as stdout goes through a callback.  */
-  FILE *trace_file;
-#define CPU_TRACE_FILE(cpu) ((cpu)->base.trace_file)
-
-  /* Maximum number of debuggable entities.
-     This debugging is not intended for normal use.
-     It is only enabled when the simulator is configured with --with-debug
-     which shouldn't normally be specified.  */
-#ifndef MAX_DEBUG_VALUES
-#define MAX_DEBUG_VALUES 4
-#endif
-
-  /* Boolean array of specified debugging flags.  */
-  char debug_flags[MAX_DEBUG_VALUES];
-#define CPU_DEBUG_FLAGS(cpu) ((cpu)->base.debug_flags)
-  /* Standard values.  */
-#define DEBUG_INSN_IDX 0
-#define DEBUG_NEXT_IDX 2 /* simulator specific debug bits begin here */
-
-  /* Debugging output goes to this or stderr if NULL.
-     We can't store `stderr' here as stderr goes through a callback.  */
-  FILE *debug_file;
-#define CPU_DEBUG_FILE(cpu) ((cpu)->base.debug_file)
-
-#ifdef SIM_HAVE_PROFILE
-  /* Maximum number of profilable entities.  */
-#ifndef MAX_PROFILE_VALUES
-#define MAX_PROFILE_VALUES 8
-#endif
+/* Functions for allocating/freeing a sim_state.  */
+SIM_DESC sim_state_alloc (SIM_OPEN_KIND kind, host_callback *callback);
+void sim_state_free (SIM_DESC);
 
 
-  /* Boolean array of specified profiling flags.  */
-  char profile_flags[MAX_PROFILE_VALUES];
-#define CPU_PROFILE_FLAGS(cpu) ((cpu)->base.profile_flags)
-  /* Standard masks.  */
-#define PROFILE_INSN_MASK 0
-#define PROFILE_MEMORY_MASK 1
-#define PROFILE_MODEL_MASK 2
-#define PROFILE_SIMCACHE_MASK 3
-#define PROFILE_NEXT_MASK 6 /* simulator specific profile bits begin here */
-
-  /* PC profiling attempts to determine function usage by sampling the PC
-     every so many instructions.  */
-#ifdef SIM_HAVE_PROFILE_PC
-  unsigned int profile_pc_freq;
-#define STATE_PROFILE_PC_FREQ(sd) ((sd)->base.profile_pc_freq)
-  unsigned int profile_pc_size;
-#define STATE_PROFILE_PC_SIZE(sd) ((sd)->base.profile_pc_size)
+#ifdef __cplusplus
+}
 #endif
 
 #endif
 
-  /* Profile output goes to this or stdout if NULL.
-     We can't store `stderr' here as stdout goes through a callback.  */
-  FILE *profile_file;
-#define CPU_PROFILE_FILE(cpu) ((cpu)->base.profile_file)
-#endif /* SIM_HAVE_PROFILE */
-} sim_cpu_base;
-
-/* Functions for allocating/freeing a sim_state.  */
-SIM_DESC sim_state_alloc PARAMS ((void));
-void sim_state_free PARAMS ((SIM_DESC));
-
 #endif /* SIM_BASE_H */
 #endif /* SIM_BASE_H */
This page took 0.037411 seconds and 4 git commands to generate.