aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote-sim.c
diff options
context:
space:
mode:
authorDavid Edelsohn <dje.gcc@gmail.com>1996-12-30 08:34:35 +0000
committerDavid Edelsohn <dje.gcc@gmail.com>1996-12-30 08:34:35 +0000
commitd9ad8adf035242e612ebbb7adbfcd375b9e71d22 (patch)
tree103d47c9a201f29b79f5ea9163bd3ebfde4ce7ad /gdb/remote-sim.c
parenta79d0193ecec8fb0032d2511233cd04ee805b326 (diff)
downloadgdb-d9ad8adf035242e612ebbb7adbfcd375b9e71d22.zip
gdb-d9ad8adf035242e612ebbb7adbfcd375b9e71d22.tar.gz
gdb-d9ad8adf035242e612ebbb7adbfcd375b9e71d22.tar.bz2
* remote-sim.c (gdbsim_open_p): New static local.
(gdbsim_open): Call unpush_target if sim open. Set gdbsim_open_p. (gdbsim_close): Only call sim_close if sim open. Reset gdbsim_open_p.
Diffstat (limited to 'gdb/remote-sim.c')
-rw-r--r--gdb/remote-sim.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index e9c32db..3b0ddb4 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -93,6 +93,11 @@ extern struct target_ops gdbsim_ops;
static int program_loaded = 0;
+/* We must keep track of whether the simulator has been opened or not because
+ GDB can call a target's close routine twice, but sim_close doesn't allow
+ this. */
+static int gdbsim_open_p = 0;
+
static void
dump_mem (buf, len)
char *buf;
@@ -380,9 +385,19 @@ gdbsim_open (args, from_tty)
if (sr_get_debug ())
printf_filtered ("gdbsim_open: args \"%s\"\n", args ? args : "(null)");
+ /* Remove current simulator if one exists. Only do this if the simulator
+ has been opened because sim_close requires it.
+ This is important because the call to push_target below will cause
+ sim_close to be called if the simulator is already open, but push_target
+ is called after sim_open! We can't move the call to push_target before
+ the call to sim_open because sim_open may invoke `error'. */
+ if (gdbsim_open_p)
+ unpush_target (&gdbsim_ops);
+
init_callbacks ();
sim_open (args);
+ gdbsim_open_p = 1;
push_target (&gdbsim_ops);
target_fetch_registers (-1);
@@ -407,7 +422,11 @@ gdbsim_close (quitting)
program_loaded = 0;
- sim_close (quitting);
+ if (gdbsim_open_p)
+ {
+ sim_close (quitting);
+ gdbsim_open_p = 0;
+ }
end_callbacks ();
}