X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdarwin-nat.c;h=2d74bc010c35e29a3048b880355b3be5d55d9706;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=c3905d1a30eb4a87edbb02f2c1dd2986387134ff;hpb=d9fa87f4f6e732f5feb41f2fa7dc6faddb1fb627;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c index c3905d1a30..2d74bc010c 100644 --- a/gdb/darwin-nat.c +++ b/gdb/darwin-nat.c @@ -1,5 +1,5 @@ /* Darwin support for GDB, the GNU debugger. - Copyright (C) 2008-2019 Free Software Foundation, Inc. + Copyright (C) 2008-2020 Free Software Foundation, Inc. Contributed by AdaCore. @@ -89,12 +89,8 @@ #define PTRACE(CMD, PID, ADDR, SIG) \ darwin_ptrace(#CMD, CMD, (PID), (ADDR), (SIG)) -static ptid_t darwin_wait (ptid_t ptid, struct target_waitstatus *status); - static void darwin_ptrace_me (void); -static void darwin_ptrace_him (int pid); - static void darwin_encode_reply (mig_reply_error_t *reply, mach_msg_header_t *hdr, integer_t code); @@ -258,8 +254,8 @@ cmp_thread_t (const void *l, const void *r) return (int)(tl - tr); } -static void -darwin_check_new_threads (struct inferior *inf) +void +darwin_nat_target::check_new_threads (inferior *inf) { kern_return_t kret; thread_array_t thread_list; @@ -355,7 +351,7 @@ darwin_check_new_threads (struct inferior *inf) pti->msg_state = DARWIN_RUNNING; /* Add the new thread. */ - add_thread_with_info (ptid_t (inf->pid, 0, new_id), pti); + add_thread_with_info (this, ptid_t (inf->pid, 0, new_id), pti); new_thread_vec.push_back (pti); new_ix++; continue; @@ -364,7 +360,7 @@ darwin_check_new_threads (struct inferior *inf) { /* A thread was removed. */ struct thread_info *thr - = find_thread_ptid (ptid_t (inf->pid, 0, old_id)); + = find_thread_ptid (this, ptid_t (inf->pid, 0, old_id)); delete_thread (thr); kret = mach_port_deallocate (gdb_task, old_id); MACH_CHECK_ERROR (kret); @@ -382,32 +378,30 @@ darwin_check_new_threads (struct inferior *inf) MACH_CHECK_ERROR (kret); } -static int -find_inferior_task_it (struct inferior *inf, void *port_ptr) -{ - darwin_inferior *priv = get_darwin_inferior (inf); - - return priv != nullptr && priv->task == *(task_t *)port_ptr; -} - -static int -find_inferior_pid_it (struct inferior *inf, void *pid_ptr) -{ - return inf->pid == *(int *)pid_ptr; -} - /* Return an inferior by task port. */ static struct inferior * darwin_find_inferior_by_task (task_t port) { - return iterate_over_inferiors (&find_inferior_task_it, &port); + for (inferior *inf : all_inferiors ()) + { + darwin_inferior *priv = get_darwin_inferior (inf); + + if (priv != nullptr && priv->task == port) + return inf; + } + return nullptr; } /* Return an inferior by pid port. */ static struct inferior * darwin_find_inferior_by_pid (int pid) { - return iterate_over_inferiors (&find_inferior_pid_it, &pid); + for (inferior *inf : all_inferiors ()) + { + if (inf->pid == pid) + return inf; + } + return nullptr; } /* Return a thread by port. */ @@ -462,23 +456,6 @@ darwin_resume_inferior (struct inferior *inf) } } -/* Iterator functions. */ - -static int -darwin_suspend_inferior_it (struct inferior *inf, void *arg) -{ - darwin_suspend_inferior (inf); - darwin_check_new_threads (inf); - return 0; -} - -static int -darwin_resume_inferior_it (struct inferior *inf, void *arg) -{ - darwin_resume_inferior (inf); - return 0; -} - static void darwin_dump_message (mach_msg_header_t *hdr, int disp_body) { @@ -611,10 +588,10 @@ darwin_check_message_ndr (NDR_record_t *ndr) /* Decode an exception message. */ -static int -darwin_decode_exception_message (mach_msg_header_t *hdr, - struct inferior **pinf, - darwin_thread_t **pthread) +int +darwin_nat_target::decode_exception_message (mach_msg_header_t *hdr, + inferior **pinf, + darwin_thread_t **pthread) { mach_msg_body_t *bod = (mach_msg_body_t*)(hdr + 1); mach_msg_port_descriptor_t *desc = (mach_msg_port_descriptor_t *)(bod + 1); @@ -712,7 +689,7 @@ darwin_decode_exception_message (mach_msg_header_t *hdr, /* Find thread by port. */ /* Check for new threads. Do it early so that the port in the exception message can be deallocated. */ - darwin_check_new_threads (inf); + check_new_threads (inf); /* Free the thread port (as gdb knows the thread, it has already has a right for it, so this just decrement a reference counter). */ @@ -898,23 +875,6 @@ darwin_resume_inferior_threads (struct inferior *inf, int step, int nsignal) darwin_resume_thread (inf, thread, step, nsignal); } -struct resume_inferior_threads_param -{ - int step; - int nsignal; -}; - -static int -darwin_resume_inferior_threads_it (struct inferior *inf, void *param) -{ - int step = ((struct resume_inferior_threads_param *)param)->step; - int nsignal = ((struct resume_inferior_threads_param *)param)->nsignal; - - darwin_resume_inferior_threads (inf, step, nsignal); - - return 0; -} - /* Suspend all threads of INF. */ static void @@ -963,19 +923,17 @@ darwin_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal) /* minus_one_ptid is RESUME_ALL. */ if (ptid == minus_one_ptid) { - struct resume_inferior_threads_param param; - - param.nsignal = nsignal; - param.step = step; - /* Resume threads. */ - iterate_over_inferiors (darwin_resume_inferior_threads_it, ¶m); + for (inferior *inf : all_inferiors ()) + darwin_resume_inferior_threads (inf, step, nsignal); + /* Resume tasks. */ - iterate_over_inferiors (darwin_resume_inferior_it, NULL); + for (inferior *inf : all_inferiors ()) + darwin_resume_inferior (inf); } else { - struct inferior *inf = find_inferior_ptid (ptid); + inferior *inf = find_inferior_ptid (this, ptid); long tid = ptid.tid (); /* Stop the inferior (should be useless). */ @@ -1001,11 +959,11 @@ darwin_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal) } } -static ptid_t -darwin_decode_message (mach_msg_header_t *hdr, - darwin_thread_t **pthread, - struct inferior **pinf, - struct target_waitstatus *status) +ptid_t +darwin_nat_target::decode_message (mach_msg_header_t *hdr, + darwin_thread_t **pthread, + inferior **pinf, + target_waitstatus *status) { darwin_thread_t *thread; struct inferior *inf; @@ -1016,7 +974,7 @@ darwin_decode_message (mach_msg_header_t *hdr, int res; /* Decode message. */ - res = darwin_decode_exception_message (hdr, &inf, &thread); + res = decode_exception_message (hdr, &inf, &thread); if (res < 0) { @@ -1172,8 +1130,8 @@ darwin_decode_message (mach_msg_header_t *hdr, return minus_one_ptid; } -static int -cancel_breakpoint (ptid_t ptid) +int +darwin_nat_target::cancel_breakpoint (ptid_t ptid) { /* Arrange for a breakpoint to be hit again later. We will handle the current event, eventually we will resume this thread, and this @@ -1183,7 +1141,7 @@ cancel_breakpoint (ptid_t ptid) delete or disable the breakpoint, but the thread will have already tripped on it. */ - struct regcache *regcache = get_thread_regcache (ptid); + struct regcache *regcache = get_thread_regcache (this, ptid); struct gdbarch *gdbarch = regcache->arch (); CORE_ADDR pc; @@ -1202,8 +1160,8 @@ cancel_breakpoint (ptid_t ptid) return 0; } -static ptid_t -darwin_wait (ptid_t ptid, struct target_waitstatus *status) +ptid_t +darwin_nat_target::wait_1 (ptid_t ptid, struct target_waitstatus *status) { kern_return_t kret; union @@ -1214,7 +1172,6 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status) mach_msg_header_t *hdr = &msgin.hdr; ptid_t res; darwin_thread_t *thread; - struct inferior *inf; inferior_debug (2, _("darwin_wait: waiting for a message pid=%d thread=%lx\n"), @@ -1223,7 +1180,7 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status) /* Handle fake stop events at first. */ if (darwin_inf_fake_stop != NULL) { - inf = darwin_inf_fake_stop; + inferior *inf = darwin_inf_fake_stop; darwin_inf_fake_stop = NULL; darwin_inferior *priv = get_darwin_inferior (inf); @@ -1262,7 +1219,8 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status) if (darwin_debug_flag > 10) darwin_dump_message (hdr, darwin_debug_flag > 11); - res = darwin_decode_message (hdr, &thread, &inf, status); + inferior *inf; + res = decode_message (hdr, &thread, &inf, status); if (res == minus_one_ptid) continue; @@ -1273,7 +1231,11 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status) while (status->kind == TARGET_WAITKIND_IGNORE); /* Stop all tasks. */ - iterate_over_inferiors (darwin_suspend_inferior_it, NULL); + for (inferior *inf : all_inferiors (this)) + { + darwin_suspend_inferior (inf); + check_new_threads (inf); + } /* Read pending messages. */ while (1) @@ -1298,7 +1260,8 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status) if (darwin_debug_flag > 10) darwin_dump_message (hdr, darwin_debug_flag > 11); - ptid2 = darwin_decode_message (hdr, &thread, &inf, &status2); + inferior *inf; + ptid2 = decode_message (hdr, &thread, &inf, &status2); if (inf != NULL && thread != NULL && thread->event.ex_type == EXC_BREAKPOINT) @@ -1325,7 +1288,7 @@ ptid_t darwin_nat_target::wait (ptid_t ptid, struct target_waitstatus *status, int options) { - return darwin_wait (ptid, status); + return wait_1 (ptid, status); } void @@ -1415,8 +1378,8 @@ darwin_reply_to_all_pending_messages (struct inferior *inf) } } -static void -darwin_stop_inferior (struct inferior *inf) +void +darwin_nat_target::stop_inferior (inferior *inf) { struct target_waitstatus wstatus; ptid_t ptid; @@ -1432,14 +1395,14 @@ darwin_stop_inferior (struct inferior *inf) if (priv->no_ptrace) return; - res = kill (inf->pid, SIGSTOP); + res = ::kill (inf->pid, SIGSTOP); if (res != 0) warning (_("cannot kill: %s"), safe_strerror (errno)); /* Wait until the process is really stopped. */ while (1) { - ptid = darwin_wait (inferior_ptid, &wstatus); + ptid = wait_1 (inferior_ptid, &wstatus); if (wstatus.kind == TARGET_WAITKIND_STOPPED && wstatus.value.sig == GDB_SIGNAL_STOP) break; @@ -1564,7 +1527,7 @@ darwin_nat_target::kill () darwin_resume_inferior (inf); - ptid = darwin_wait (inferior_ptid, &wstatus); + ptid = wait_1 (inferior_ptid, &wstatus); } else if (errno != ESRCH) warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"), @@ -1716,10 +1679,10 @@ thread_info_from_private_thread_info (darwin_thread_info *pti) gdb_assert_not_reached ("did not find gdb thread for darwin thread"); } -static void -darwin_init_thread_list (struct inferior *inf) +void +darwin_nat_target::init_thread_list (inferior *inf) { - darwin_check_new_threads (inf); + check_new_threads (inf); darwin_inferior *priv = get_darwin_inferior (inf); @@ -1783,21 +1746,21 @@ darwin_pre_ptrace (void) mark_fd_no_cloexec (ptrace_fds[1]); } -static void -darwin_ptrace_him (int pid) +void +darwin_nat_target::ptrace_him (int pid) { struct inferior *inf = current_inferior (); darwin_attach_pid (inf); /* Let's the child run. */ - close (ptrace_fds[0]); - close (ptrace_fds[1]); + ::close (ptrace_fds[0]); + ::close (ptrace_fds[1]); unmark_fd_no_cloexec (ptrace_fds[0]); unmark_fd_no_cloexec (ptrace_fds[1]); - darwin_init_thread_list (inf); + init_thread_list (inf); gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED); } @@ -1986,6 +1949,7 @@ darwin_nat_target::create_inferior (const char *exec_file, char **env, int from_tty) { gdb::optional> restore_startup_with_shell; + darwin_nat_target *the_target = this; if (startup_with_shell && may_have_sip ()) { @@ -1998,7 +1962,11 @@ darwin_nat_target::create_inferior (const char *exec_file, /* Do the hard work. */ fork_inferior (exec_file, allargs, env, darwin_ptrace_me, - darwin_ptrace_him, darwin_pre_ptrace, copied_shell, + [the_target] (int pid) + { + the_target->ptrace_him (pid); + }, + darwin_pre_ptrace, copied_shell, darwin_execvp); } @@ -2068,7 +2036,7 @@ darwin_nat_target::attach (const char *args, int from_tty) darwin_suspend_inferior (inf); - darwin_init_thread_list (inf); + init_thread_list (inf); darwin_inferior *priv = get_darwin_inferior (inf); @@ -2099,7 +2067,7 @@ darwin_nat_target::detach (inferior *inf, int from_tty) /* If ptrace() is in use, stop the process. */ if (!priv->no_ptrace) - darwin_stop_inferior (inf); + stop_inferior (inf); kret = darwin_restore_exception_ports (priv); MACH_CHECK_ERROR (kret); @@ -2482,6 +2450,7 @@ darwin_nat_target::supports_multi_process () return true; } +void _initialize_darwin_nat (); void _initialize_darwin_nat () {