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.h | |
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.h')
-rw-r--r-- | gdb/darwin-nat.h | 121 |
1 files changed, 68 insertions, 53 deletions
diff --git a/gdb/darwin-nat.h b/gdb/darwin-nat.h index 5d2f30d..86bb338 100644 --- a/gdb/darwin-nat.h +++ b/gdb/darwin-nat.h @@ -21,6 +21,59 @@ #include <mach/mach.h> #include "gdbthread.h" +struct darwin_exception_msg +{ + mach_msg_header_t header; + + /* Thread and task taking the exception. */ + mach_port_t thread_port; + mach_port_t task_port; + + /* Type of the exception. */ + exception_type_t ex_type; + + /* Machine dependent details. */ + mach_msg_type_number_t data_count; + integer_t ex_data[2]; +}; + +enum darwin_msg_state +{ + /* The thread is running. */ + DARWIN_RUNNING, + + /* The thread is stopped. */ + DARWIN_STOPPED, + + /* The thread has sent a message and waits for a reply. */ + DARWIN_MESSAGE +}; + +struct darwin_thread_info : public private_thread_info +{ + /* The thread port from a GDB point of view. */ + thread_t gdb_port = 0; + + /* The thread port from the inferior point of view. Not to be used inside + gdb except for get_ada_task_ptid. */ + thread_t inf_port = 0; + + /* Current message state. + If the kernel has sent a message it expects a reply and the inferior + can't be killed before. */ + enum darwin_msg_state msg_state = DARWIN_RUNNING; + + /* True if this thread is single-stepped. */ + bool single_step = false; + + /* True if a signal was manually sent to the thread. */ + bool signaled = false; + + /* The last exception received. */ + struct darwin_exception_msg event {}; +}; +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 @@ -59,6 +112,21 @@ class darwin_nat_target : public inf_child_target 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 @@ -83,59 +151,6 @@ struct darwin_exception_info mach_msg_type_number_t count = 0; }; -struct darwin_exception_msg -{ - mach_msg_header_t header; - - /* Thread and task taking the exception. */ - mach_port_t thread_port; - mach_port_t task_port; - - /* Type of the exception. */ - exception_type_t ex_type; - - /* Machine dependent details. */ - mach_msg_type_number_t data_count; - integer_t ex_data[2]; -}; - -enum darwin_msg_state -{ - /* The thread is running. */ - DARWIN_RUNNING, - - /* The thread is stopped. */ - DARWIN_STOPPED, - - /* The thread has sent a message and waits for a reply. */ - DARWIN_MESSAGE -}; - -struct darwin_thread_info : public private_thread_info -{ - /* The thread port from a GDB point of view. */ - thread_t gdb_port = 0; - - /* The thread port from the inferior point of view. Not to be used inside - gdb except for get_ada_task_ptid. */ - thread_t inf_port = 0; - - /* Current message state. - If the kernel has sent a message it expects a reply and the inferior - can't be killed before. */ - enum darwin_msg_state msg_state = DARWIN_RUNNING; - - /* True if this thread is single-stepped. */ - bool single_step = false; - - /* True if a signal was manually sent to the thread. */ - bool signaled = false; - - /* The last exception received. */ - struct darwin_exception_msg event {}; -}; -typedef struct darwin_thread_info darwin_thread_t; - static inline darwin_thread_info * get_darwin_thread_info (class thread_info *thread) { |