diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 026aaf1703b..b1c437bfd27 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,40 @@ +2020-01-23 Simon Marchi + + * darwin-nat.h (struct darwin_exception_msg, enum + darwin_msg_state, struct darwin_thread_info, darwin_thread_t): + Move up. + (class darwin_nat_target) : 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. + 2020-01-23 Hannes Domani * i386-cygwin-tdep.c (core_process_module_section): Update. diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c index 9baa1e91d53..27677d16eae 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); @@ -464,14 +460,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) { @@ -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> 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); diff --git a/gdb/darwin-nat.h b/gdb/darwin-nat.h index 5d2f30dae14..86bb3389212 100644 --- a/gdb/darwin-nat.h +++ b/gdb/darwin-nat.h @@ -21,68 +21,6 @@ #include #include "gdbthread.h" -/* This needs to be overridden by the platform specific nat code. */ - -class darwin_nat_target : public inf_child_target -{ - void create_inferior (const char *exec_file, - const std::string &allargs, - char **env, int from_tty) override; - - void attach (const char *, int) override; - - void detach (inferior *, int) override; - - ptid_t wait (ptid_t, struct target_waitstatus *, int) override; - - void mourn_inferior () override; - - void kill () override; - - void interrupt () override; - - void resume (ptid_t, int , enum gdb_signal) override; - - bool thread_alive (ptid_t ptid) override; - - std::string pid_to_str (ptid_t) override; - - char *pid_to_exec_file (int pid) override; - - enum target_xfer_status xfer_partial (enum target_object object, - const char *annex, - gdb_byte *readbuf, - const gdb_byte *writebuf, - ULONGEST offset, ULONGEST len, - ULONGEST *xfered_len) override; - - bool supports_multi_process () override; - - ptid_t get_ada_task_ptid (long lwp, long thread) override; -}; - -/* Describe the mach exception handling state for a task. This state is saved - before being changed and restored when a process is detached. - For more information on these fields see task_get_exception_ports manual - page. */ -struct darwin_exception_info -{ - /* Exceptions handled by the port. */ - exception_mask_t masks[EXC_TYPES_COUNT] {}; - - /* Ports receiving exception messages. */ - mach_port_t ports[EXC_TYPES_COUNT] {}; - - /* Type of messages sent. */ - exception_behavior_t behaviors[EXC_TYPES_COUNT] {}; - - /* Type of state to be sent. */ - thread_state_flavor_t flavors[EXC_TYPES_COUNT] {}; - - /* Number of elements set. */ - mach_msg_type_number_t count = 0; -}; - struct darwin_exception_msg { mach_msg_header_t header; @@ -136,6 +74,83 @@ struct darwin_thread_info : public private_thread_info }; typedef struct darwin_thread_info darwin_thread_t; +/* This needs to be overridden by the platform specific nat code. */ + +class darwin_nat_target : public inf_child_target +{ + void create_inferior (const char *exec_file, + const std::string &allargs, + char **env, int from_tty) override; + + void attach (const char *, int) override; + + void detach (inferior *, int) override; + + ptid_t wait (ptid_t, struct target_waitstatus *, int) override; + + void mourn_inferior () override; + + void kill () override; + + void interrupt () override; + + void resume (ptid_t, int , enum gdb_signal) override; + + bool thread_alive (ptid_t ptid) override; + + std::string pid_to_str (ptid_t) override; + + char *pid_to_exec_file (int pid) override; + + enum target_xfer_status xfer_partial (enum target_object object, + const char *annex, + gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) override; + + bool supports_multi_process () override; + + ptid_t get_ada_task_ptid (long lwp, long thread) override; + +private: + ptid_t wait_1 (ptid_t, struct target_waitstatus *); + void check_new_threads (inferior *inf); + int decode_exception_message (mach_msg_header_t *hdr, + inferior **pinf, + darwin_thread_t **pthread); + ptid_t decode_message (mach_msg_header_t *hdr, + darwin_thread_t **pthread, + inferior **pinf, + target_waitstatus *status); + void stop_inferior (inferior *inf); + void init_thread_list (inferior *inf); + void ptrace_him (int pid); + int cancel_breakpoint (ptid_t ptid); +}; + +/* Describe the mach exception handling state for a task. This state is saved + before being changed and restored when a process is detached. + For more information on these fields see task_get_exception_ports manual + page. */ +struct darwin_exception_info +{ + /* Exceptions handled by the port. */ + exception_mask_t masks[EXC_TYPES_COUNT] {}; + + /* Ports receiving exception messages. */ + mach_port_t ports[EXC_TYPES_COUNT] {}; + + /* Type of messages sent. */ + exception_behavior_t behaviors[EXC_TYPES_COUNT] {}; + + /* Type of state to be sent. */ + thread_state_flavor_t flavors[EXC_TYPES_COUNT] {}; + + /* Number of elements set. */ + mach_msg_type_number_t count = 0; +}; + static inline darwin_thread_info * get_darwin_thread_info (class thread_info *thread) { diff --git a/gdb/nat/fork-inferior.c b/gdb/nat/fork-inferior.c index 78f972a7496..1185ef8998b 100644 --- a/gdb/nat/fork-inferior.c +++ b/gdb/nat/fork-inferior.c @@ -267,7 +267,8 @@ execv_argv::init_for_shell (const char *exec_file, pid_t fork_inferior (const char *exec_file_arg, const std::string &allargs, char **env, void (*traceme_fun) (), - void (*init_trace_fun) (int), void (*pre_trace_fun) (), + gdb::function_view init_trace_fun, + void (*pre_trace_fun) (), const char *shell_file_arg, void (*exec_fun)(const char *file, char * const *argv, char * const *env)) @@ -439,7 +440,7 @@ fork_inferior (const char *exec_file_arg, const std::string &allargs, initialize anything target-vector-specific that needs initializing. */ if (init_trace_fun) - (*init_trace_fun) (pid); + init_trace_fun (pid); /* We are now in the child process of interest, having exec'd the correct program, and are poised at the first instruction of the diff --git a/gdb/nat/fork-inferior.h b/gdb/nat/fork-inferior.h index 9cbe9bd19d5..cf6f137edd1 100644 --- a/gdb/nat/fork-inferior.h +++ b/gdb/nat/fork-inferior.h @@ -21,6 +21,7 @@ #define NAT_FORK_INFERIOR_H #include +#include "gdbsupport/function-view.h" struct process_stratum_target; @@ -42,7 +43,7 @@ struct process_stratum_target; extern pid_t fork_inferior (const char *exec_file_arg, const std::string &allargs, char **env, void (*traceme_fun) (), - void (*init_trace_fun) (int), + gdb::function_view init_trace_fun, void (*pre_trace_fun) (), const char *shell_file_arg, void (*exec_fun) (const char *file,