X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fremote-sim.c;h=582d206d60c7a13c285a98ee1fd5a56a3390e3db;hb=78f2c40a12179d26d3065c09f054b7e751b2732f;hp=456fa8a3fe0a0d0428c8b3c91fff9fefd7352a8d;hpb=7104e59bece90e387d70f617eb7ed4c34087283d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c index 456fa8a3fe..582d206d60 100644 --- a/gdb/remote-sim.c +++ b/gdb/remote-sim.c @@ -1,6 +1,6 @@ /* Generic remote debugging interface for simulators. - Copyright (C) 1993-2018 Free Software Foundation, Inc. + Copyright (C) 1993-2020 Free Software Foundation, Inc. Contributed by Cygnus Support. Steve Chamberlain (sac@cygnus.com). @@ -31,6 +31,7 @@ #include #include "terminal.h" #include "target.h" +#include "process-stratum-target.h" #include "gdbcore.h" #include "gdb/callback.h" #include "gdb/remote-sim.h" @@ -40,7 +41,7 @@ #include "arch-utils.h" #include "readline/readline.h" #include "gdbthread.h" -#include "common/byte-vector.h" +#include "gdbsupport/byte-vector.h" /* Prototypes */ @@ -68,42 +69,86 @@ static void gdb_os_evprintf_filtered (host_callback *, const char *, va_list); static void gdb_os_error (host_callback *, const char *, ...) ATTRIBUTE_NORETURN; -static void gdbsim_kill (struct target_ops *); +/* Naming convention: -static void gdbsim_load (struct target_ops *self, const char *prog, - int fromtty); + sim_* are the interface to the simulator (see remote-sim.h). + gdbsim_* are stuff which is internal to gdb. */ -static void gdbsim_open (const char *args, int from_tty); +static const target_info gdbsim_target_info = { + "sim", + N_("simulator"), + N_("Use the compiled-in simulator.") +}; -static void gdbsim_close (struct target_ops *self); +struct gdbsim_target final + : public memory_breakpoint_target +{ + gdbsim_target () = default; -static void gdbsim_detach (struct target_ops *ops, inferior *inf, int from_tty); + const target_info &info () const override + { return gdbsim_target_info; } -static void gdbsim_prepare_to_store (struct target_ops *self, - struct regcache *regcache); + void close () override; -static void gdbsim_files_info (struct target_ops *target); + void detach (inferior *inf, int) override; -static void gdbsim_mourn_inferior (struct target_ops *target); + void resume (ptid_t, int, enum gdb_signal) override; + ptid_t wait (ptid_t, struct target_waitstatus *, int) override; -static void gdbsim_interrupt (struct target_ops *self); + void fetch_registers (struct regcache *, int) override; + void store_registers (struct regcache *, int) override; + void prepare_to_store (struct regcache *) override; -void simulator_command (char *args, int from_tty); + enum target_xfer_status xfer_partial (enum target_object object, + const char *annex, + gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) override; -/* Naming convention: + void files_info () override; - sim_* are the interface to the simulator (see remote-sim.h). - gdbsim_* are stuff which is internal to gdb. */ + void kill () override; + + void load (const char *, int) override; + + bool can_create_inferior () override { return true; } + void create_inferior (const char *, const std::string &, + char **, int) override; + + void mourn_inferior () override; + + void interrupt () override; -/* Forward data declarations */ -extern struct target_ops gdbsim_ops; + bool thread_alive (ptid_t ptid) override; -static const struct inferior_data *sim_inferior_data_key; + std::string pid_to_str (ptid_t) override; + + bool has_all_memory () override; + bool has_memory () override; +}; + +static struct gdbsim_target gdbsim_ops; + +/* 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; @@ -116,22 +161,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_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 @@ -152,8 +193,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); } @@ -170,8 +210,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 @@ -206,18 +245,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_build (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) { @@ -238,7 +266,7 @@ static struct sim_inferior_data * get_sim_inferior_data_by_ptid (ptid_t ptid, int sim_instance_needed) { struct inferior *inf; - int pid = ptid_get_pid (ptid); + int pid = ptid.pid (); if (pid <= 0) return NULL; @@ -253,20 +281,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 @@ -334,9 +352,6 @@ end_callbacks (void) static int gdb_os_write_stdout (host_callback *p, const char *buf, int len) { - int i; - char b[2]; - ui_file_write (gdb_stdtarg, buf, len); return len; } @@ -422,19 +437,18 @@ one2one_register_sim_regno (struct gdbarch *gdbarch, int regnum) return regnum; } -static void -gdbsim_fetch_register (struct target_ops *ops, - struct regcache *regcache, int regno) +void +gdbsim_target::fetch_registers (struct regcache *regcache, int regno) { struct gdbarch *gdbarch = regcache->arch (); - struct inferior *inf = find_inferior_ptid (regcache_get_ptid (regcache)); + struct inferior *inf = find_inferior_ptid (regcache->ptid ()); struct sim_inferior_data *sim_data = get_sim_inferior_data (inf, SIM_INSTANCE_NEEDED); if (regno == -1) { for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++) - gdbsim_fetch_register (ops, regcache, regno); + fetch_registers (regcache, regno); return; } @@ -492,19 +506,18 @@ gdbsim_fetch_register (struct target_ops *ops, } -static void -gdbsim_store_register (struct target_ops *ops, - struct regcache *regcache, int regno) +void +gdbsim_target::store_registers (struct regcache *regcache, int regno) { struct gdbarch *gdbarch = regcache->arch (); - struct inferior *inf = find_inferior_ptid (regcache_get_ptid (regcache)); + struct inferior *inf = find_inferior_ptid (regcache->ptid ()); struct sim_inferior_data *sim_data = get_sim_inferior_data (inf, SIM_INSTANCE_NEEDED); if (regno == -1) { for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++) - gdbsim_store_register (ops, regcache, regno); + store_registers (regcache, regno); return; } else if (gdbarch_register_sim_regno (gdbarch, regno) >= 0) @@ -541,8 +554,8 @@ gdbsim_store_register (struct target_ops *ops, /* Kill the running program. This may involve closing any open files and releasing other resources acquired by the simulated program. */ -static void -gdbsim_kill (struct target_ops *ops) +void +gdbsim_target::kill () { if (remote_debug) fprintf_unfiltered (gdb_stdlog, "gdbsim_kill\n"); @@ -556,8 +569,8 @@ gdbsim_kill (struct target_ops *ops) not only bring new code into the target process, but also to update GDB's symbol tables to match. */ -static void -gdbsim_load (struct target_ops *self, const char *args, int fromtty) +void +gdbsim_target::load (const char *args, int fromtty) { const char *prog; struct sim_inferior_data *sim_data @@ -597,9 +610,10 @@ gdbsim_load (struct target_ops *self, const char *args, int fromtty) /* This is called not only when we first attach, but also when the user types "run" after having attached. */ -static void -gdbsim_create_inferior (struct target_ops *target, const char *exec_file, - const std::string &allargs, char **env, int from_tty) +void +gdbsim_target::create_inferior (const char *exec_file, + const std::string &allargs, + char **env, int from_tty) { struct sim_inferior_data *sim_data = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED); @@ -618,8 +632,8 @@ gdbsim_create_inferior (struct target_ops *target, const char *exec_file, (exec_file ? exec_file : "(NULL)"), args); - if (ptid_equal (inferior_ptid, sim_data->remote_sim_ptid)) - gdbsim_kill (target); + if (inferior_ptid == sim_data->remote_sim_ptid) + kill (); remove_breakpoints (); init_wait_for_inferior (); @@ -635,16 +649,13 @@ gdbsim_create_inferior (struct target_ops *target, const char *exec_file, built_argv.reset (arg_buf); } - if (!have_inferiors ()) - init_thread_list (); - if (sim_create_inferior (sim_data->gdbsim_desc, exec_bfd, built_argv.get (), env) != SIM_RC_OK) error (_("Unable to create sim inferior.")); inferior_ptid = sim_data->remote_sim_ptid; - inferior_appeared (current_inferior (), ptid_get_pid (inferior_ptid)); + inferior_appeared (current_inferior (), inferior_ptid.pid ()); add_thread_silent (inferior_ptid); insert_breakpoints (); /* Needed to get correct instruction @@ -659,7 +670,7 @@ gdbsim_create_inferior (struct target_ops *target, const char *exec_file, /* Called when selecting the simulator. E.g. (gdb) target sim name. */ static void -gdbsim_open (const char *args, int from_tty) +gdbsim_target_open (const char *args, int from_tty) { int len; char *arg_buf; @@ -724,19 +735,18 @@ gdbsim_open (const char *args, int from_tty) } gdb_argv argv (arg_buf); - sim_argv = argv.get (); + sim_argv = argv.release (); init_callbacks (); gdbsim_desc = sim_open (SIM_OPEN_DEBUG, &gdb_callback, exec_bfd, sim_argv); if (gdbsim_desc == 0) { + freeargv (sim_argv); sim_argv = NULL; error (_("unable to create simulator instance")); } - argv.release (); - /* Reset the pid numberings for this batch of sim instances. */ next_pid = INITIAL_PID; @@ -763,14 +773,12 @@ gdbsim_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. @@ -789,12 +797,9 @@ gdbsim_close_inferior (struct inferior *inf, void *arg) /* Close out all files and local state before this target loses control. */ -static void -gdbsim_close (struct target_ops *self) +void +gdbsim_target::close () { - struct sim_inferior_data *sim_data - = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED); - if (remote_debug) fprintf_unfiltered (gdb_stdlog, "gdbsim_close\n"); @@ -819,13 +824,13 @@ gdbsim_close (struct target_ops *self) /* Terminate the open connection to the remote debugger. Use this when you want to detach and do something else with your gdb. */ -static void -gdbsim_detach (struct target_ops *ops, inferior *inf, int from_tty) +void +gdbsim_target::detach (inferior *inf, int from_tty) { if (remote_debug) fprintf_unfiltered (gdb_stdlog, "gdbsim_detach\n"); - unpush_target (ops); /* calls gdbsim_close to do the real work */ + unpush_target (this); /* calls gdbsim_close to do the real work */ if (from_tty) printf_filtered ("Ending simulator %s debugging\n", target_shortname); } @@ -864,9 +869,8 @@ gdbsim_resume_inferior (struct inferior *inf, void *arg) return 0; } -static void -gdbsim_resume (struct target_ops *ops, - ptid_t ptid, int step, enum gdb_signal siggnal) +void +gdbsim_target::resume (ptid_t ptid, int step, enum gdb_signal siggnal) { struct resume_data rd; struct sim_inferior_data *sim_data @@ -884,7 +888,7 @@ gdbsim_resume (struct target_ops *ops, if (sim_data) gdbsim_resume_inferior (find_inferior_ptid (ptid), &rd); - else if (ptid_equal (ptid, minus_one_ptid)) + else if (ptid == minus_one_ptid) iterate_over_inferiors (gdbsim_resume_inferior, &rd); else error (_("The program is not being run.")); @@ -919,8 +923,8 @@ gdbsim_interrupt_inferior (struct inferior *inf, void *arg) return 0; } -static void -gdbsim_interrupt (struct target_ops *self) +void +gdbsim_target::interrupt () { iterate_over_inferiors (gdbsim_interrupt_inferior, NULL); } @@ -946,12 +950,11 @@ gdb_os_poll_quit (host_callback *p) static void gdbsim_cntrl_c (int signo) { - gdbsim_interrupt (NULL); + gdbsim_ops.interrupt (); } -static ptid_t -gdbsim_wait (struct target_ops *ops, - ptid_t ptid, struct target_waitstatus *status, int options) +ptid_t +gdbsim_target::wait (ptid_t ptid, struct target_waitstatus *status, int options) { struct sim_inferior_data *sim_data; static sighandler_t prev_sigint; @@ -961,7 +964,7 @@ gdbsim_wait (struct target_ops *ops, /* This target isn't able to (yet) resume more than one inferior at a time. When ptid is minus_one_ptid, just use the current inferior. If we're given an explicit pid, we'll try to find it and use that instead. */ - if (ptid_equal (ptid, minus_one_ptid)) + if (ptid == minus_one_ptid) sim_data = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED); else @@ -969,7 +972,7 @@ gdbsim_wait (struct target_ops *ops, sim_data = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NEEDED); if (sim_data == NULL) error (_("Unable to wait for pid %d. Inferior not found."), - ptid_get_pid (ptid)); + ptid.pid ()); inferior_ptid = ptid; } @@ -1035,8 +1038,8 @@ gdbsim_wait (struct target_ops *ops, that registers contains all the registers from the program being debugged. */ -static void -gdbsim_prepare_to_store (struct target_ops *self, struct regcache *regcache) +void +gdbsim_target::prepare_to_store (struct regcache *regcache) { /* Do nothing, since we can store individual regs. */ } @@ -1056,7 +1059,7 @@ gdbsim_xfer_memory (struct target_ops *target, /* If this target doesn't have memory yet, return 0 causing the request to be passed to a lower target, hopefully an exec file. */ - if (!target->to_has_memory (target)) + if (!target->has_memory ()) return TARGET_XFER_EOF; if (!sim_data->program_loaded) @@ -1104,16 +1107,16 @@ gdbsim_xfer_memory (struct target_ops *target, /* Target to_xfer_partial implementation. */ -static enum target_xfer_status -gdbsim_xfer_partial (struct target_ops *ops, enum target_object object, - const char *annex, gdb_byte *readbuf, - const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, - ULONGEST *xfered_len) +enum target_xfer_status +gdbsim_target::xfer_partial (enum target_object object, + const char *annex, gdb_byte *readbuf, + const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) { switch (object) { case TARGET_OBJECT_MEMORY: - return gdbsim_xfer_memory (ops, readbuf, writebuf, offset, len, + return gdbsim_xfer_memory (this, readbuf, writebuf, offset, len, xfered_len); default: @@ -1121,8 +1124,8 @@ gdbsim_xfer_partial (struct target_ops *ops, enum target_object object, } } -static void -gdbsim_files_info (struct target_ops *target) +void +gdbsim_target::files_info () { struct sim_inferior_data *sim_data = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED); @@ -1144,24 +1147,20 @@ gdbsim_files_info (struct target_ops *target) /* Clear the simulator's notion of what the break points are. */ -static void -gdbsim_mourn_inferior (struct target_ops *target) +void +gdbsim_target::mourn_inferior () { - struct sim_inferior_data *sim_data - = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED); - if (remote_debug) fprintf_unfiltered (gdb_stdlog, "gdbsim_mourn_inferior:\n"); remove_breakpoints (); generic_mourn_inferior (); - delete_thread_silent (sim_data->remote_sim_ptid); } /* Pass the command argument through to the simulator verbatim. The simulator must do any command interpretation work. */ -void +static void simulator_command (const char *args, int from_tty) { struct sim_inferior_data *sim_data; @@ -1176,8 +1175,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) { @@ -1208,8 +1206,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; @@ -1247,93 +1244,54 @@ sim_command_completer (struct cmd_list_element *ignore, /* Check to see if a thread is still alive. */ -static int -gdbsim_thread_alive (struct target_ops *ops, ptid_t ptid) +bool +gdbsim_target::thread_alive (ptid_t ptid) { struct sim_inferior_data *sim_data = get_sim_inferior_data_by_ptid (ptid, SIM_INSTANCE_NOT_NEEDED); if (sim_data == NULL) - return 0; + return false; - if (ptid_equal (ptid, sim_data->remote_sim_ptid)) + if (ptid == sim_data->remote_sim_ptid) /* The simulators' task is always alive. */ - return 1; + return true; - return 0; + return false; } -/* Convert a thread ID to a string. Returns the string in a static - buffer. */ +/* Convert a thread ID to a string. */ -static const char * -gdbsim_pid_to_str (struct target_ops *ops, ptid_t ptid) +std::string +gdbsim_target::pid_to_str (ptid_t ptid) { return normal_pid_to_str (ptid); } /* Simulator memory may be accessed after the program has been loaded. */ -static int -gdbsim_has_all_memory (struct target_ops *ops) +bool +gdbsim_target::has_all_memory () { struct sim_inferior_data *sim_data = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED); if (!sim_data->program_loaded) - return 0; + return false; - return 1; + return true; } -static int -gdbsim_has_memory (struct target_ops *ops) +bool +gdbsim_target::has_memory () { struct sim_inferior_data *sim_data = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NOT_NEEDED); if (!sim_data->program_loaded) - return 0; + return false; - return 1; -} - -/* Define the target subroutine names. */ - -struct target_ops gdbsim_ops; - -static void -init_gdbsim_ops (void) -{ - gdbsim_ops.to_shortname = "sim"; - gdbsim_ops.to_longname = "simulator"; - gdbsim_ops.to_doc = "Use the compiled-in simulator."; - gdbsim_ops.to_open = gdbsim_open; - gdbsim_ops.to_close = gdbsim_close; - gdbsim_ops.to_detach = gdbsim_detach; - gdbsim_ops.to_resume = gdbsim_resume; - gdbsim_ops.to_wait = gdbsim_wait; - gdbsim_ops.to_fetch_registers = gdbsim_fetch_register; - gdbsim_ops.to_store_registers = gdbsim_store_register; - gdbsim_ops.to_prepare_to_store = gdbsim_prepare_to_store; - gdbsim_ops.to_xfer_partial = gdbsim_xfer_partial; - gdbsim_ops.to_files_info = gdbsim_files_info; - gdbsim_ops.to_insert_breakpoint = memory_insert_breakpoint; - gdbsim_ops.to_remove_breakpoint = memory_remove_breakpoint; - gdbsim_ops.to_kill = gdbsim_kill; - gdbsim_ops.to_load = gdbsim_load; - gdbsim_ops.to_create_inferior = gdbsim_create_inferior; - gdbsim_ops.to_mourn_inferior = gdbsim_mourn_inferior; - gdbsim_ops.to_interrupt = gdbsim_interrupt; - gdbsim_ops.to_thread_alive = gdbsim_thread_alive; - gdbsim_ops.to_pid_to_str = gdbsim_pid_to_str; - gdbsim_ops.to_stratum = process_stratum; - gdbsim_ops.to_has_all_memory = gdbsim_has_all_memory; - gdbsim_ops.to_has_memory = gdbsim_has_memory; - gdbsim_ops.to_has_stack = default_child_has_stack; - gdbsim_ops.to_has_registers = default_child_has_registers; - gdbsim_ops.to_has_execution = default_child_has_execution; - gdbsim_ops.to_magic = OPS_MAGIC; + return true; } void @@ -1341,13 +1299,9 @@ _initialize_remote_sim (void) { struct cmd_list_element *c; - init_gdbsim_ops (); - add_target (&gdbsim_ops); + add_target (gdbsim_target_info, gdbsim_target_open); 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); }