diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2020-01-23 14:55:50 -0500 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2020-01-23 14:55:50 -0500 |
commit | e7eee665a1524cc4569d0c2f5c9d4aa2be64c9e8 (patch) | |
tree | 3a6604516329537f266caad46f6e5ced02e5ecb4 /gdb/darwin-nat.c | |
parent | c162ed3e66aa985fa2e79d0e7ccd2da80a532c1e (diff) | |
download | gdb-e7eee665a1524cc4569d0c2f5c9d4aa2be64c9e8.zip gdb-e7eee665a1524cc4569d0c2f5c9d4aa2be64c9e8.tar.gz gdb-e7eee665a1524cc4569d0c2f5c9d4aa2be64c9e8.tar.bz2 |
gdb: fix darwin-nat.c build / adapt to multi-target
The darwin-nat.c file doesn't build since the multi-target changes
(5b6d1e4f, "Multi-target support"). This patch makes it build. I have
access to a macOS vm, so I am able to build it, but I wasn't able to
successfully codesign it and try to actually debug something, so I don't
know if it works. I don't have much more time to put on this to figure
it out, so I thought I'd sent the patch anyway, as it's at least a step
in the right direction.
The bulk of the patch is to change a bunch of functions to be methods of
the darwin_nat_target object, so that this can pass `this` to
find_inferior_ptid and other functions that now require a
process_stratum_target pointer.
The darwin_ptrace_him function (renamed to darwin_nat_target::ptrace_him
in this patch) is passed to fork_inferior as the `init_trace_fun`
parameter. Since the method can't be passed as a plain function pointer
(we need the `this` pointer), I changed the `init_trace_fun` parameter
of fork_inferior to be a gdb::function_view, so we can pass a lambda and
capture `this`.
The changes in darwin-nat.h are only to move definition higher in the
file, so that forward declarations are not needed.
gdb/ChangeLog:
* darwin-nat.h (struct darwin_exception_msg, enum
darwin_msg_state, struct darwin_thread_info, darwin_thread_t):
Move up.
(class darwin_nat_target) <wait_1, check_new_threads,
decode_exception_message, decode_message, stop_inferior,
init_thread_list, ptrace_him, cancel_breakpoint>: Declare.
* darwin-nat.c (darwin_check_new_threads): Rename to...
(darwin_nat_target::check_new_threads): ... this.
(darwin_suspend_inferior_it): Remove.
(darwin_decode_exception_message): Rename to...
(darwin_nat_target::decode_exception_message): ... this.
(darwin_nat_target::resume): Pass target to find_inferior_ptid.
(darwin_decode_message): Rename to...
(darwin_nat_target::decode_message): ... this.
(cancel_breakpoint): Rename to...
(darwin_nat_target::cancel_breakpoint): ... this.
(darwin_wait): Rename to...
(darwin_nat_target::wait_1): ... this. Use range-based for loop
instead of iterate_over_inferiors.
(darwin_nat_target::wait): Call wait_1 instead of darwin_wait.
(darwin_stop_inferior): Rename to...
(darwin_nat_target::stop_inferior): ... this.
(darwin_nat_target::kill): Call wait_1 instead of darwin_wait.
(darwin_init_thread_list): Rename to...
(darwin_nat_target::init_thread_list): ... this.
(darwin_ptrace_him): Rename to...
(darwin_nat_target::ptrace_him): ... this.
(darwin_nat_target::create_inferior): Pass lambda function to
fork_inferior.
(darwin_nat_target::detach): Call stop_inferior instead of
darwin_stop_inferior.
* fork-inferior.h (fork_inferior): Change init_trace_fun
parameter to gdb::function_view.
* fork-inferior.c (fork_inferior): Likewise.
Diffstat (limited to 'gdb/darwin-nat.c')
-rw-r--r-- | gdb/darwin-nat.c | 103 |
1 files changed, 50 insertions, 53 deletions
diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c index 9baa1e9..27677d1 100644 --- a/gdb/darwin-nat.c +++ b/gdb/darwin-nat.c @@ -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); @@ -465,14 +461,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); @@ -611,10 +599,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 +700,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). */ @@ -975,7 +963,7 @@ darwin_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal) } 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 +989,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 +1004,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 +1160,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 +1171,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 +1190,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 @@ -1262,7 +1250,7 @@ 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); + res = decode_message (hdr, &thread, &inf, status); if (res == minus_one_ptid) continue; @@ -1273,7 +1261,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 +1290,7 @@ 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); + ptid2 = decode_message (hdr, &thread, &inf, &status2); if (inf != NULL && thread != NULL && thread->event.ex_type == EXC_BREAKPOINT) @@ -1325,7 +1317,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 +1407,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 +1424,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 +1556,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 +1708,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 +1775,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 +1978,7 @@ darwin_nat_target::create_inferior (const char *exec_file, char **env, int from_tty) { gdb::optional<scoped_restore_tmpl<bool>> restore_startup_with_shell; + darwin_nat_target *the_target = this; if (startup_with_shell && may_have_sip ()) { @@ -1998,7 +1991,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 +2065,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 +2096,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); |