* gnu-nat.c: Include "inf-child.h".
authorPedro Alves <palves@redhat.com>
Mon, 20 Jul 2009 15:18:24 +0000 (15:18 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 20 Jul 2009 15:18:24 +0000 (15:18 +0000)
(gnu_mourn_inferior): Use the passed in target_ops
instead of the gnu_ops global.
(gnu_create_inferior): Inline `attach_to_child', use the passed in
target_ops instead of the gnu_ops global.
(gnu_can_run): Delete.
(gnu_attach): Use the passed in target_ops instead of the gnu_ops
global.
(gnu_detach): Ditto.
(gnu_prepare_to_store, gnu_open): Delete.
(gnu_store_registers, gnu_fetch_registers): Delete declarations.
(gnu_ops): Delete.
(init_gnu_ops): Delete.
(gnu_target): New.
(_initialize_gnu_nat): Don't call init_gnu_ops or add_target here.
* gnu-nat.h (gnu_target): Declare.
* i386gnu-nat.c (gnu_fetch_registers, gnu_store_registers): Make
static.
(_initialize_i386gnu_nat): New.

gdb/ChangeLog
gdb/gnu-nat.c
gdb/gnu-nat.h
gdb/i386gnu-nat.c

index f07defa380e65f28e7f0179b9d683909dd7e6bff..161c27cd16901ee6e5e408deab66051ab45a0cf7 100644 (file)
@@ -1,3 +1,25 @@
+2009-07-20  Pedro Alves  <pedro@codesourcery.com>
+
+       * gnu-nat.c: Include "inf-child.h".
+       (gnu_mourn_inferior): Use the passed in target_ops
+       instead of the gnu_ops global.
+       (gnu_create_inferior): Inline `attach_to_child', use the passed in
+       target_ops instead of the gnu_ops global.
+       (gnu_can_run): Delete.
+       (gnu_attach): Use the passed in target_ops instead of the gnu_ops
+       global.
+       (gnu_detach): Ditto.
+       (gnu_prepare_to_store, gnu_open): Delete.
+       (gnu_store_registers, gnu_fetch_registers): Delete declarations.
+       (gnu_ops): Delete.
+       (init_gnu_ops): Delete.
+       (gnu_target): New.
+       (_initialize_gnu_nat): Don't call init_gnu_ops or add_target here.
+       * gnu-nat.h (gnu_target): Declare.
+       * i386gnu-nat.c (gnu_fetch_registers, gnu_store_registers): Make
+       static.
+       (_initialize_i386gnu_nat): New.
+
 2009-07-20  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * dwarf2loc.c (find_location_expression): Retrieve beginning and
index a16580827dff2310f54a6623465756eddc8eee45..e29672c7179eb8406a05849b440125694217fade 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);
@@ -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,7 +2164,7 @@ 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->attach_flag = 1;
@@ -2231,7 +2220,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 +2230,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)
 {
@@ -2615,53 +2588,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 = default_child_has_all_memory;
-  gnu_ops.to_has_memory = default_child_has_memory;
-  gnu_ops.to_has_stack = default_child_has_stack;
-  gnu_ops.to_has_registers = default_child_has_registers;
-  gnu_ops.to_has_execution = default_child_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.  */
@@ -3405,9 +3360,6 @@ void
 _initialize_gnu_nat (void)
 {
   proc_server = getproc ();
-  
-  init_gnu_ops ();
-  add_target (&gnu_ops);
 
   add_task_commands ();
   add_thread_commands ();
index c792bb05b1eda7b0ea6e74a70a4e85bc4f3fae4d..d45dbad9fef6c4c358a1ff0caaf7435ef1858527 100644 (file)
@@ -98,4 +98,8 @@ extern int gnu_debug_flag;
  do { if (gnu_debug_flag) \
         fprintf_unfiltered (gdb_stdlog, "%s:%d: " msg "\r\n", __FILE__ , __LINE__ , ##args); } while (0)
 
+/* Create a prototype generic GNU/Hurd target.  The client can
+   override it with local methods.  */
+struct target_ops *gnu_target (void);
+
 #endif /* __GNU_NAT_H__ */
index a93793217f5972e0866514d89dd90d0bf31d7e6f..104a7137d2edfc1399d3ad46499ab8b2ed0b3fd4 100644 (file)
@@ -110,7 +110,7 @@ supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregs)
 #endif
 
 /* Fetch register REGNO, or all regs if REGNO is -1.  */
-void
+static void
 gnu_fetch_registers (struct target_ops *ops,
                     struct regcache *regcache, int regno)
 {
@@ -202,7 +202,7 @@ store_fpregs (const struct regcache *regcache, struct proc *thread, int regno)
 }
 
 /* Store at least register REGNO, or all regs if REGNO == -1.  */
-void
+static void
 gnu_store_registers (struct target_ops *ops,
                     struct regcache *regcache, int regno)
 {
@@ -294,3 +294,21 @@ gnu_store_registers (struct target_ops *ops,
       store_fpregs (regcache, thread, regno);
     }
 }
+
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_i386gnu_nat;
+
+void
+_initialize_i386gnu_nat (void)
+{
+  struct target_ops *t;
+
+  /* Fill in the generic GNU/Hurd methods.  */
+  t = gnu_target ();
+
+  t->to_fetch_registers = gnu_fetch_registers;
+  t->to_store_registers = gnu_store_registers;
+
+  /* Register the target.  */
+  add_target (t);
+}