From b4d1e8c7001940584b7e63af5411535e42785690 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 20 Jul 2009 15:18:24 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 22 ++++++++ gdb/gnu-nat.c | 146 ++++++++++++++++++------------------------------------ gdb/gnu-nat.h | 4 ++ gdb/i386gnu-nat.c | 22 +++++++- 4 files changed, 95 insertions(+), 99 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f07defa..161c27c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,25 @@ +2009-07-20 Pedro Alves + + * 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 * dwarf2loc.c (find_location_expression): Retrieve beginning and diff --git a/gdb/gnu-nat.c b/gdb/gnu-nat.c index a165808..e29672c 100644 --- a/gdb/gnu-nat.c +++ b/gdb/gnu-nat.c @@ -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; -} - /* 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 */ } 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) } -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; +} /* 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 (); diff --git a/gdb/gnu-nat.h b/gdb/gnu-nat.h index c792bb0..d45dbad 100644 --- a/gdb/gnu-nat.h +++ b/gdb/gnu-nat.h @@ -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__ */ diff --git a/gdb/i386gnu-nat.c b/gdb/i386gnu-nat.c index a937932..104a713 100644 --- a/gdb/i386gnu-nat.c +++ b/gdb/i386gnu-nat.c @@ -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); +} -- 2.7.4