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) |
{ |