gdb: fix vfork with multiple threads
[deliverable/binutils-gdb.git] / gdb / remote-sim.c
index c4f3913edbad31b0532d0aedea2918eccf6621c0..5bedc04011d4831f5ec075156cb4055b24378dac 100644 (file)
@@ -33,8 +33,8 @@
 #include "target.h"
 #include "process-stratum-target.h"
 #include "gdbcore.h"
-#include "gdb/callback.h"
-#include "gdb/remote-sim.h"
+#include "sim/callback.h"
+#include "sim/sim.h"
 #include "command.h"
 #include "regcache.h"
 #include "sim-regno.h"
@@ -42,6 +42,8 @@
 #include "readline/readline.h"
 #include "gdbthread.h"
 #include "gdbsupport/byte-vector.h"
+#include "memory-map.h"
+#include "remote.h"
 
 /* Prototypes */
 
@@ -164,6 +166,7 @@ struct gdbsim_target final
 
   bool has_all_memory ()  override;
   bool has_memory ()  override;
+  std::vector<mem_region> memory_map () override;
 
 private:
   sim_inferior_data *get_inferior_data_by_ptid (ptid_t ptid,
@@ -696,7 +699,7 @@ gdbsim_target_open (const char *args, int from_tty)
      operation until after we complete those operations which could
      error out.  */
   if (gdbsim_is_open)
-    unpush_target (&gdbsim_ops);
+    current_inferior ()->unpush_target (&gdbsim_ops);
 
   len = (7 + 1                 /* gdbsim */
         + strlen (" -E little")
@@ -760,7 +763,7 @@ gdbsim_target_open (const char *args, int from_tty)
 
   sim_data->gdbsim_desc = gdbsim_desc;
 
-  push_target (&gdbsim_ops);
+  current_inferior ()->push_target (&gdbsim_ops);
   printf_filtered ("Connected to the simulator.\n");
 
   /* There's nothing running after "target sim" or "load"; not until
@@ -831,9 +834,9 @@ gdbsim_target::detach (inferior *inf, int from_tty)
   if (remote_debug)
     fprintf_unfiltered (gdb_stdlog, "gdbsim_detach\n");
 
-  unpush_target (this);                /* calls gdbsim_close to do the real work */
+  inf->unpush_target (this);           /* calls gdbsim_close to do the real work */
   if (from_tty)
-    printf_filtered ("Ending simulator %s debugging\n", target_shortname);
+    printf_filtered ("Ending simulator %s debugging\n", target_shortname ());
 }
 
 /* Resume execution of the target process.  STEP says whether to single-step
@@ -1116,7 +1119,7 @@ gdbsim_target::files_info ()
   if (current_program_space->exec_bfd ())
     {
       fprintf_unfiltered (gdb_stdlog, "\tAttached to %s running program %s\n",
-                         target_shortname, file);
+                         target_shortname (), file);
       sim_info (sim_data->gdbsim_desc, 0);
     }
 }
@@ -1270,6 +1273,22 @@ gdbsim_target::has_memory ()
   return true;
 }
 
+/* Get memory map from the simulator.  */
+
+std::vector<mem_region>
+gdbsim_target::memory_map ()
+{
+  struct sim_inferior_data *sim_data
+    = get_sim_inferior_data (current_inferior (), SIM_INSTANCE_NEEDED);
+  std::vector<mem_region> result;
+  gdb::unique_xmalloc_ptr<char> text (sim_memory_map (sim_data->gdbsim_desc));
+
+  if (text != nullptr)
+    result = parse_memory_map (text.get ());
+
+  return result;
+}
+
 void _initialize_remote_sim ();
 void
 _initialize_remote_sim ()
This page took 0.024738 seconds and 4 git commands to generate.