aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote-sim.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-06-26 12:42:14 -0600
committerTom Tromey <tromey@adacore.com>2019-07-10 12:42:16 -0600
commit18101a352541a28b8e199b4d7b9f66989681dc02 (patch)
tree4a0bac320b9c281dd33cf01c546b049324f1aca3 /gdb/remote-sim.c
parent05b08ac1608c8355201db21fe4c871677466f0d5 (diff)
downloadgdb-18101a352541a28b8e199b4d7b9f66989681dc02.zip
gdb-18101a352541a28b8e199b4d7b9f66989681dc02.tar.gz
gdb-18101a352541a28b8e199b4d7b9f66989681dc02.tar.bz2
Change remote-sim.c to use type-safe registry
This changes remote-sim.c to use the type-safe registry. 2019-07-10 Tom Tromey <tromey@adacore.com> * remote-sim.c (struct sim_inferior_data): Add initializers, constructor, and destructor. (sim_inferior_data_key): Change type. Move lower. (check_for_duplicate_sim_descriptor): Update. (get_sim_inferior_data): Use new. Update. (~sim_inferior_data_cleanup): Rename from sim_inferior_data_cleanup. Simplify. (gdbsim_close_inferior, simulator_command) (sim_command_completer, _initialize_remote_sim): Update. (next_pid, INITIAL_PID): Move earlier.
Diffstat (limited to 'gdb/remote-sim.c')
-rw-r--r--gdb/remote-sim.c79
1 files changed, 29 insertions, 50 deletions
diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index a22a59e..67b4690 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -132,12 +132,25 @@ struct gdbsim_target final
static struct gdbsim_target gdbsim_ops;
-static const struct inferior_data *sim_inferior_data_key;
+/* Value of the next pid to allocate for an inferior. As indicated
+ elsewhere, its initial value is somewhat arbitrary; it's critical
+ though that it's not zero or negative. */
+static int next_pid;
+#define INITIAL_PID 42000
/* Simulator-specific, per-inferior state. */
struct sim_inferior_data {
+ explicit sim_inferior_data (SIM_DESC desc)
+ : gdbsim_desc (desc),
+ remote_sim_ptid (next_pid, 0, next_pid)
+ {
+ ++next_pid;
+ }
+
+ ~sim_inferior_data ();
+
/* Flag which indicates whether or not the program has been loaded. */
- int program_loaded;
+ int program_loaded = 0;
/* Simulator descriptor for this inferior. */
SIM_DESC gdbsim_desc;
@@ -150,22 +163,18 @@ struct sim_inferior_data {
ptid_t remote_sim_ptid;
/* Signal with which to resume. */
- enum gdb_signal resume_siggnal;
+ enum gdb_signal resume_siggnal = GDB_SIGNAL_0;
/* Flag which indicates whether resume should step or not. */
- int resume_step;
+ int resume_step = 0;
};
+static inferior_key<sim_inferior_data> sim_inferior_data_key;
+
/* Flag indicating the "open" status of this module. It's set to 1
in gdbsim_open() and 0 in gdbsim_close(). */
static int gdbsim_is_open = 0;
-/* Value of the next pid to allocate for an inferior. As indicated
- elsewhere, its initial value is somewhat arbitrary; it's critical
- though that it's not zero or negative. */
-static int next_pid;
-#define INITIAL_PID 42000
-
/* Argument list to pass to sim_open(). It is allocated in gdbsim_open()
and deallocated in gdbsim_close(). The lifetime needs to extend beyond
the call to gdbsim_open() due to the fact that other sim instances other
@@ -186,8 +195,7 @@ check_for_duplicate_sim_descriptor (struct inferior *inf, void *arg)
struct sim_inferior_data *sim_data;
SIM_DESC new_sim_desc = (SIM_DESC) arg;
- sim_data = ((struct sim_inferior_data *)
- inferior_data (inf, sim_inferior_data_key));
+ sim_data = sim_inferior_data_key.get (inf);
return (sim_data != NULL && sim_data->gdbsim_desc == new_sim_desc);
}
@@ -204,8 +212,7 @@ static struct sim_inferior_data *
get_sim_inferior_data (struct inferior *inf, int sim_instance_needed)
{
SIM_DESC sim_desc = NULL;
- struct sim_inferior_data *sim_data
- = (struct sim_inferior_data *) inferior_data (inf, sim_inferior_data_key);
+ struct sim_inferior_data *sim_data = sim_inferior_data_key.get (inf);
/* Try to allocate a new sim instance, if needed. We do this ahead of
a potential allocation of a sim_inferior_data struct in order to
@@ -240,18 +247,7 @@ get_sim_inferior_data (struct inferior *inf, int sim_instance_needed)
if (sim_data == NULL)
{
- sim_data = XCNEW(struct sim_inferior_data);
- set_inferior_data (inf, sim_inferior_data_key, sim_data);
-
- /* Allocate a ptid for this inferior. */
- sim_data->remote_sim_ptid = ptid_t (next_pid, 0, next_pid);
- next_pid++;
-
- /* Initialize the other instance variables. */
- sim_data->program_loaded = 0;
- sim_data->gdbsim_desc = sim_desc;
- sim_data->resume_siggnal = GDB_SIGNAL_0;
- sim_data->resume_step = 0;
+ sim_data = sim_inferior_data_key.emplace (inf, sim_desc);
}
else if (sim_desc)
{
@@ -287,20 +283,10 @@ get_sim_inferior_data_by_ptid (ptid_t ptid, int sim_instance_needed)
/* Free the per-inferior simulator data. */
-static void
-sim_inferior_data_cleanup (struct inferior *inf, void *data)
+sim_inferior_data::~sim_inferior_data ()
{
- struct sim_inferior_data *sim_data = (struct sim_inferior_data *) data;
-
- if (sim_data != NULL)
- {
- if (sim_data->gdbsim_desc)
- {
- sim_close (sim_data->gdbsim_desc, 0);
- sim_data->gdbsim_desc = NULL;
- }
- xfree (sim_data);
- }
+ if (gdbsim_desc)
+ sim_close (gdbsim_desc, 0);
}
static void
@@ -789,14 +775,12 @@ gdbsim_target_open (const char *args, int from_tty)
static int
gdbsim_close_inferior (struct inferior *inf, void *arg)
{
- struct sim_inferior_data *sim_data
- = (struct sim_inferior_data *) inferior_data (inf, sim_inferior_data_key);
+ struct sim_inferior_data *sim_data = sim_inferior_data_key.get (inf);
if (sim_data != NULL)
{
ptid_t ptid = sim_data->remote_sim_ptid;
- sim_inferior_data_cleanup (inf, sim_data);
- set_inferior_data (inf, sim_inferior_data_key, NULL);
+ sim_inferior_data_key.clear (inf);
/* Having a ptid allocated and stored in remote_sim_ptid does
not mean that a corresponding inferior was ever created.
@@ -1193,8 +1177,7 @@ simulator_command (const char *args, int from_tty)
thus allocating memory that would not be garbage collected until
the ultimate destruction of the associated inferior. */
- sim_data = ((struct sim_inferior_data *)
- inferior_data (current_inferior (), sim_inferior_data_key));
+ sim_data = sim_inferior_data_key.get (current_inferior ());
if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
{
@@ -1225,8 +1208,7 @@ sim_command_completer (struct cmd_list_element *ignore,
{
struct sim_inferior_data *sim_data;
- sim_data = ((struct sim_inferior_data *)
- inferior_data (current_inferior (), sim_inferior_data_key));
+ sim_data = sim_inferior_data_key.get (current_inferior ());
if (sim_data == NULL || sim_data->gdbsim_desc == NULL)
return;
@@ -1324,7 +1306,4 @@ _initialize_remote_sim (void)
c = add_com ("sim", class_obscure, simulator_command,
_("Send a command to the simulator."));
set_cmd_completer (c, sim_command_completer);
-
- sim_inferior_data_key
- = register_inferior_data_with_cleanup (NULL, sim_inferior_data_cleanup);
}