| Index: gdb/darwin-nat.c
|
| diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c
|
| index 0feebe3ab587e84d50a8b74a0b7a495b86bb1785..26ee23a89ac6df9a443c6ce70ecae3e26ce4bb3e 100644
|
| --- a/gdb/darwin-nat.c
|
| +++ b/gdb/darwin-nat.c
|
| @@ -39,6 +39,7 @@
|
| #include "value.h"
|
| #include "arch-utils.h"
|
| #include "bfd.h"
|
| +#include "bfd/mach-o.h"
|
|
|
| #include <sys/ptrace.h>
|
| #include <sys/signal.h>
|
| @@ -90,9 +91,9 @@ extern boolean_t exc_server (mach_msg_header_t *in, mach_msg_header_t *out);
|
| static void darwin_stop (ptid_t);
|
|
|
| static void darwin_resume_to (struct target_ops *ops, ptid_t ptid, int step,
|
| - enum target_signal signal);
|
| + enum gdb_signal signal);
|
| static void darwin_resume (ptid_t ptid, int step,
|
| - enum target_signal signal);
|
| + enum gdb_signal signal);
|
|
|
| static ptid_t darwin_wait_to (struct target_ops *ops, ptid_t ptid,
|
| struct target_waitstatus *status, int options);
|
| @@ -704,11 +705,14 @@ darwin_resume_thread (struct inferior *inf, darwin_thread_t *thread,
|
| thread->signaled = 1;
|
| }
|
|
|
| - /* Set single step. */
|
| - inferior_debug (4, _("darwin_set_sstep (thread=%x, enable=%d)\n"),
|
| - thread->gdb_port, step);
|
| - darwin_set_sstep (thread->gdb_port, step);
|
| - thread->single_step = step;
|
| + /* Set or reset single step. */
|
| + if (step != thread->single_step)
|
| + {
|
| + inferior_debug (4, _("darwin_set_sstep (thread=%x, enable=%d)\n"),
|
| + thread->gdb_port, step);
|
| + darwin_set_sstep (thread->gdb_port, step);
|
| + thread->single_step = step;
|
| + }
|
|
|
| darwin_send_reply (inf, thread);
|
| thread->msg_state = DARWIN_RUNNING;
|
| @@ -783,7 +787,7 @@ darwin_suspend_inferior_threads (struct inferior *inf)
|
| }
|
|
|
| static void
|
| -darwin_resume (ptid_t ptid, int step, enum target_signal signal)
|
| +darwin_resume (ptid_t ptid, int step, enum gdb_signal signal)
|
| {
|
| struct target_waitstatus status;
|
| int pid;
|
| @@ -797,10 +801,10 @@ darwin_resume (ptid_t ptid, int step, enum target_signal signal)
|
| (2, _("darwin_resume: pid=%d, tid=0x%x, step=%d, signal=%d\n"),
|
| ptid_get_pid (ptid), ptid_get_tid (ptid), step, signal);
|
|
|
| - if (signal == TARGET_SIGNAL_0)
|
| + if (signal == GDB_SIGNAL_0)
|
| nsignal = 0;
|
| else
|
| - nsignal = target_signal_to_host (signal);
|
| + nsignal = gdb_signal_to_host (signal);
|
|
|
| /* Don't try to single step all threads. */
|
| if (step)
|
| @@ -849,7 +853,7 @@ darwin_resume (ptid_t ptid, int step, enum target_signal signal)
|
|
|
| static void
|
| darwin_resume_to (struct target_ops *ops, ptid_t ptid, int step,
|
| - enum target_signal signal)
|
| + enum gdb_signal signal)
|
| {
|
| return darwin_resume (ptid, step, signal);
|
| }
|
| @@ -909,10 +913,10 @@ darwin_decode_message (mach_msg_header_t *hdr,
|
| if (thread->event.ex_data[0] == EXC_SOFT_SIGNAL)
|
| {
|
| status->value.sig =
|
| - target_signal_from_host (thread->event.ex_data[1]);
|
| + gdb_signal_from_host (thread->event.ex_data[1]);
|
| inferior_debug (5, _(" (signal %d: %s)\n"),
|
| thread->event.ex_data[1],
|
| - target_signal_to_name (status->value.sig));
|
| + gdb_signal_to_name (status->value.sig));
|
|
|
| /* If the thread is stopped because it has received a signal
|
| that gdb has just sent, continue. */
|
| @@ -929,12 +933,12 @@ darwin_decode_message (mach_msg_header_t *hdr,
|
| break;
|
| case EXC_BREAKPOINT:
|
| /* Many internal GDB routines expect breakpoints to be reported
|
| - as TARGET_SIGNAL_TRAP, and will report TARGET_EXC_BREAKPOINT
|
| + as GDB_SIGNAL_TRAP, and will report TARGET_EXC_BREAKPOINT
|
| as a spurious signal. */
|
| - status->value.sig = TARGET_SIGNAL_TRAP;
|
| + status->value.sig = GDB_SIGNAL_TRAP;
|
| break;
|
| default:
|
| - status->value.sig = TARGET_SIGNAL_UNKNOWN;
|
| + status->value.sig = GDB_SIGNAL_UNKNOWN;
|
| break;
|
| }
|
|
|
| @@ -1048,7 +1052,7 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status)
|
| darwin_inf_fake_stop = NULL;
|
|
|
| status->kind = TARGET_WAITKIND_STOPPED;
|
| - status->value.sig = TARGET_SIGNAL_TRAP;
|
| + status->value.sig = GDB_SIGNAL_TRAP;
|
| thread = VEC_index (darwin_thread_t, inf->private->threads, 0);
|
| thread->msg_state = DARWIN_STOPPED;
|
| return ptid_build (inf->pid, 0, thread->gdb_port);
|
| @@ -1259,7 +1263,7 @@ darwin_stop_inferior (struct inferior *inf)
|
| {
|
| ptid = darwin_wait (inferior_ptid, &wstatus);
|
| if (wstatus.kind == TARGET_WAITKIND_STOPPED
|
| - && wstatus.value.sig == TARGET_SIGNAL_STOP)
|
| + && wstatus.value.sig == GDB_SIGNAL_STOP)
|
| break;
|
| }
|
| }
|
| @@ -1312,35 +1316,22 @@ darwin_kill_inferior (struct target_ops *ops)
|
|
|
| gdb_assert (inf != NULL);
|
|
|
| - if (!inf->private->no_ptrace)
|
| - {
|
| - darwin_stop_inferior (inf);
|
| -
|
| - res = PTRACE (PT_KILL, inf->pid, 0, 0);
|
| - if (res != 0)
|
| - warning (_("Failed to kill inferior: ptrace returned %d "
|
| - "[%s] (pid=%d)"),
|
| - res, safe_strerror (errno), inf->pid);
|
| + kret = darwin_restore_exception_ports (inf->private);
|
| + MACH_CHECK_ERROR (kret);
|
|
|
| - darwin_reply_to_all_pending_messages (inf);
|
| + darwin_reply_to_all_pending_messages (inf);
|
|
|
| - darwin_resume_inferior (inf);
|
| + res = kill (inf->pid, 9);
|
|
|
| - ptid = darwin_wait (inferior_ptid, &wstatus);
|
| - }
|
| - else
|
| + if (res == 0)
|
| {
|
| - kret = darwin_restore_exception_ports (inf->private);
|
| - MACH_CHECK_ERROR (kret);
|
| -
|
| - darwin_reply_to_all_pending_messages (inf);
|
| -
|
| darwin_resume_inferior (inf);
|
| -
|
| - res = kill (inf->pid, 9);
|
| -
|
| +
|
| ptid = darwin_wait (inferior_ptid, &wstatus);
|
| }
|
| + else if (errno != ESRCH)
|
| + warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"),
|
| + inf->pid, safe_strerror (errno));
|
|
|
| target_mourn_inferior ();
|
| }
|
| @@ -2015,6 +2006,9 @@ darwin_supports_multi_process (void)
|
| return 1;
|
| }
|
|
|
| +/* -Wmissing-prototypes */
|
| +extern initialize_file_ftype _initialize_darwin_inferior;
|
| +
|
| void
|
| _initialize_darwin_inferior (void)
|
| {
|
|
|