2009-12-15 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / gnu-nat.c
index 157c95061ec0bb8b794049a525ec707ad8c5ecf7..b474037f4a42c3200a46ab5189452fafc2a1124c 100644 (file)
@@ -66,6 +66,7 @@
 #include "gdb_obstack.h"
 
 #include "gnu-nat.h"
+#include "inf-child.h"
 
 #include "exc_request_S.h"
 #include "notify_S.h"
@@ -87,8 +88,6 @@ int gnu_debug_flag = 0;
 
 /* Forward decls */
 
-extern struct target_ops gnu_ops;
-
 struct inf *make_inf ();
 void inf_clear_wait (struct inf *inf);
 void inf_cleanup (struct inf *inf);
@@ -1435,7 +1434,7 @@ struct inf *waiting_inf;
 /* Wait for something to happen in the inferior, returning what in STATUS. */
 static ptid_t
 gnu_wait (struct target_ops *ops,
-         ptid_t ptid, struct target_waitstatus *status)
+         ptid_t ptid, struct target_waitstatus *status, int options)
 {
   struct msg
     {
@@ -2049,7 +2048,7 @@ gnu_mourn_inferior (struct target_ops *ops)
 {
   inf_debug (gnu_current_inf, "rip");
   inf_detach (gnu_current_inf);
-  unpush_target (&gnu_ops);
+  unpush_target (ops);
   generic_mourn_inferior ();
 }
 
@@ -2082,6 +2081,7 @@ gnu_create_inferior (struct target_ops *ops,
                     int from_tty)
 {
   struct inf *inf = cur_inf ();
+  int pid;
 
   void trace_me ()
   {
@@ -2090,34 +2090,31 @@ gnu_create_inferior (struct target_ops *ops,
     if (ptrace (PTRACE_TRACEME) != 0)
       error (_("ptrace (PTRACE_TRACEME) failed!"));
   }
-  void attach_to_child (int pid)
-  {
-    /* Attach to the now stopped child, which is actually a shell...  */
-    inf_debug (inf, "attaching to child: %d", pid);
 
-    inf_attach (inf, pid);
+  inf_debug (inf, "creating inferior");
 
-    push_target (&gnu_ops);
+  pid = fork_inferior (exec_file, allargs, env, trace_me, NULL, NULL, NULL);
 
-    inf->pending_execs = 2;
-    inf->nomsg = 1;
-    inf->traced = 1;
+  /* Attach to the now stopped child, which is actually a shell...  */
+  inf_debug (inf, "attaching to child: %d", pid);
 
-    /* Now let the child run again, knowing that it will stop immediately
-       because of the ptrace. */
-    inf_resume (inf);
+  inf_attach (inf, pid);
 
-    /* We now have thread info.  */
-    thread_change_ptid (inferior_ptid,
-                       ptid_build (inf->pid, 0, inf_pick_first_thread ()));
+  push_target (ops);
 
-    startup_inferior (inf->pending_execs);
-  }
+  inf->pending_execs = 2;
+  inf->nomsg = 1;
+  inf->traced = 1;
 
-  inf_debug (inf, "creating inferior");
+  /* Now let the child run again, knowing that it will stop
+     immediately because of the ptrace. */
+  inf_resume (inf);
+
+  /* We now have thread info.  */
+  thread_change_ptid (inferior_ptid,
+                     ptid_build (inf->pid, 0, inf_pick_first_thread ()));
 
-  fork_inferior (exec_file, allargs, env, trace_me, attach_to_child,
-                NULL, NULL);
+  startup_inferior (inf->pending_execs);
 
   inf_validate_procinfo (inf);
   inf_update_signal_thread (inf);
@@ -2131,14 +2128,6 @@ gnu_create_inferior (struct target_ops *ops,
     inf_restore_exc_ports (inf);
 }
 
-/* Mark our target-struct as eligible for stray "run" and "attach"
-   commands.  */
-static int
-gnu_can_run (void)
-{
-  return 1;
-}
-
 \f
 /* Attach to process PID, then initialize for debugging it
    and wait for the trace-trap that results from attaching.  */
@@ -2175,9 +2164,10 @@ gnu_attach (struct target_ops *ops, char *args, int from_tty)
 
   inf_attach (inf, pid);
 
-  push_target (&gnu_ops);
+  push_target (ops);
 
-  inferior = add_inferior (pid);
+  inferior = current_inferior ();
+  inferior_appeared (inferior, pid);
   inferior->attach_flag = 1;
 
   inf_update_procs (inf);
@@ -2231,7 +2221,7 @@ gnu_detach (struct target_ops *ops, char *args, int from_tty)
   inferior_ptid = null_ptid;
   detach_inferior (pid);
 
-  unpush_target (&gnu_ops);    /* Pop out of handling an inferior */
+  unpush_target (ops); /* Pop out of handling an inferior */
 }
 \f
 static void
@@ -2241,22 +2231,6 @@ gnu_terminal_init_inferior (void)
   terminal_init_inferior_with_pgrp (gnu_current_inf->pid);
 }
 
-/* Get ready to modify the registers array.  On machines which store
-   individual registers, this doesn't need to do anything.  On machines
-   which store all the registers in one fell swoop, this makes sure
-   that registers contains all the registers from the program being
-   debugged.  */
-static void
-gnu_prepare_to_store (struct regcache *regcache)
-{
-}
-
-static void
-gnu_open (char *arg, int from_tty)
-{
-  error (_("Use the \"run\" command to start a Unix child process."));
-}
-
 static void
 gnu_stop (ptid_t ptid)
 {
@@ -2492,7 +2466,8 @@ gnu_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
   else
     {
       inf_debug (gnu_current_inf, "%s %s[%d] %s %s",
-                write ? "writing" : "reading", paddr (memaddr), len,
+                write ? "writing" : "reading",
+                paddress (target_gdbarch, memaddr), len,
                 write ? "<--" : "-->", host_address_to_string (myaddr));
       if (write)
        return gnu_write_inferior (task, memaddr, myaddr, len);
@@ -2614,53 +2589,35 @@ gnu_pid_to_str (struct target_ops *ops, ptid_t ptid)
 }
 
 \f
-extern void gnu_store_registers (struct target_ops *ops,
-                                struct regcache *regcache, int regno);
-extern void gnu_fetch_registers (struct target_ops *ops,
-                                struct regcache *regcache, int regno);
+/* Create a prototype generic GNU/Hurd target.  The client can
+   override it with local methods.  */
+
+struct target_ops *
+gnu_target (void)
+{
+  struct target_ops *t = inf_child_target ();
 
-struct target_ops gnu_ops;
+  t->to_shortname = "GNU";
+  t->to_longname = "GNU Hurd process";
+  t->to_doc = "GNU Hurd process";
 
-static void
-init_gnu_ops (void)
-{
-  gnu_ops.to_shortname = "GNU";                /* to_shortname */
-  gnu_ops.to_longname = "GNU Hurd process"; /* to_longname */
-  gnu_ops.to_doc = "GNU Hurd process"; /* to_doc */
-  gnu_ops.to_open = gnu_open;          /* to_open */
-  gnu_ops.to_attach = gnu_attach;      /* to_attach */
-  gnu_ops.to_attach_no_wait = 1;       /* to_attach_no_wait */
-  gnu_ops.to_detach = gnu_detach;      /* to_detach */
-  gnu_ops.to_resume = gnu_resume;      /* to_resume */
-  gnu_ops.to_wait = gnu_wait;          /* to_wait */
-  gnu_ops.to_fetch_registers = gnu_fetch_registers;    /* to_fetch_registers */
-  gnu_ops.to_store_registers = gnu_store_registers;    /* to_store_registers */
-  gnu_ops.to_prepare_to_store = gnu_prepare_to_store; /* to_prepare_to_store */
-  gnu_ops.deprecated_xfer_memory = gnu_xfer_memory;
-  gnu_ops.to_find_memory_regions = gnu_find_memory_regions;
-  gnu_ops.to_insert_breakpoint = memory_insert_breakpoint;
-  gnu_ops.to_remove_breakpoint = memory_remove_breakpoint;
-  gnu_ops.to_terminal_init = gnu_terminal_init_inferior;
-  gnu_ops.to_terminal_inferior = terminal_inferior;
-  gnu_ops.to_terminal_ours_for_output = terminal_ours_for_output;
-  gnu_ops.to_terminal_save_ours = terminal_save_ours;
-  gnu_ops.to_terminal_ours = terminal_ours;
-  gnu_ops.to_terminal_info = child_terminal_info;
-  gnu_ops.to_kill = gnu_kill_inferior; /* to_kill */
-  gnu_ops.to_create_inferior = gnu_create_inferior; /* to_create_inferior */
-  gnu_ops.to_mourn_inferior = gnu_mourn_inferior;      /* to_mourn_inferior */
-  gnu_ops.to_can_run = gnu_can_run;    /* to_can_run */
-  gnu_ops.to_thread_alive = gnu_thread_alive;  /* to_thread_alive */
-  gnu_ops.to_pid_to_str = gnu_pid_to_str;   /* to_pid_to_str */
-  gnu_ops.to_stop = gnu_stop;  /* to_stop */
-  gnu_ops.to_stratum = process_stratum;                /* to_stratum */
-  gnu_ops.to_has_all_memory = 1;       /* to_has_all_memory */
-  gnu_ops.to_has_memory = 1;           /* to_has_memory */
-  gnu_ops.to_has_stack = 1;            /* to_has_stack */
-  gnu_ops.to_has_registers = 1;                /* to_has_registers */
-  gnu_ops.to_has_execution = 1;                /* to_has_execution */
-  gnu_ops.to_magic = OPS_MAGIC;                /* to_magic */
-}                              /* init_gnu_ops */
+  t->to_attach = gnu_attach;
+  t->to_attach_no_wait = 1;
+  t->to_detach = gnu_detach;
+  t->to_resume = gnu_resume;
+  t->to_wait = gnu_wait;
+  t->deprecated_xfer_memory = gnu_xfer_memory;
+  t->to_find_memory_regions = gnu_find_memory_regions;
+  t->to_terminal_init = gnu_terminal_init_inferior;
+  t->to_kill = gnu_kill_inferior;
+  t->to_create_inferior = gnu_create_inferior;
+  t->to_mourn_inferior = gnu_mourn_inferior;
+  t->to_thread_alive = gnu_thread_alive;
+  t->to_pid_to_str = gnu_pid_to_str;
+  t->to_stop = gnu_stop;
+
+  return t;
+}
 
 \f
 /* User task commands.  */
@@ -3156,7 +3113,7 @@ Set the thread that gdb thinks is the libc signal thread."),
 Set whether gdb thinks the inferior process is stopped as with SIGSTOP.\n\
 Stopped process will be continued by sending them a signal."),
           &setlist);
-  add_cmd ("stopped", no_class, show_signals_cmd, _("\
+  add_cmd ("stopped", no_class, show_stopped_cmd, _("\
 Show whether gdb thinks the inferior process is stopped as with SIGSTOP."),
           &showlist);
 
@@ -3404,16 +3361,18 @@ void
 _initialize_gnu_nat (void)
 {
   proc_server = getproc ();
-  
-  init_gnu_ops ();
-  add_target (&gnu_ops);
 
   add_task_commands ();
   add_thread_commands ();
-  deprecated_add_set_cmd ("gnu-debug", class_maintenance,
-                         var_boolean, (char *) &gnu_debug_flag,
-                         "Set debugging output for the gnu backend.",
-                         &maintenancelist);
+  add_setshow_boolean_cmd ("gnu-nat", class_maintenance,
+                          &gnu_debug_flag,
+                          _("Set debugging output for the gnu backend."),
+                          _("Show debugging output for the gnu backend."),
+                          NULL,
+                          NULL,
+                          NULL,
+                          &setdebuglist,
+                          &showdebuglist);
 }
 \f
 #ifdef FLUSH_INFERIOR_CACHE
This page took 0.027015 seconds and 4 git commands to generate.