diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2021-05-13 15:28:20 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2021-05-13 15:29:00 -0400 |
commit | 294c36eb6ac9eaf761ec300fd400623ed5175203 (patch) | |
tree | 607d3345281a55a1c31d6d273c0e20d56493940d /gdb/remote.c | |
parent | 2af87c859fe450d4a3a841cf19637a91d53c9486 (diff) | |
download | fsf-binutils-gdb-294c36eb6ac9eaf761ec300fd400623ed5175203.zip fsf-binutils-gdb-294c36eb6ac9eaf761ec300fd400623ed5175203.tar.gz fsf-binutils-gdb-294c36eb6ac9eaf761ec300fd400623ed5175203.tar.bz2 |
gdb: on exec, delegate pushing / unpushing target and adding thread to target_ops::follow_exec
On "exec", some targets need to unpush themselves from the inferior,
and do some bookkeeping, like forgetting the data associated to the
exec'ing inferior.
One such example is the thread-db target. It does so in
a special case in thread_db_target::wait, just before returning the
TARGET_WAITKIND_EXECD event to its caller.
We have another such case in the context of rocm-gdb [1], where the
"rocm" target is pushed on top of the linux-nat target. When an exec
happens, we want to unpush the rocm target from the exec'ing inferior to
close some file descriptors that refer to the pre-exec address space and
forget about that inferior. We then want to push the target on the
inferior in which execution continues, to open the file descriptors for
the post-exec address space.
I think that a good way to address this cleanly is to do all this in the
target_ops::follow_exec implementations. Make the
process_stratum_target::follow_exec implementation have the default
behavior of pushing itself to the new inferior's target stack (if
execution continues in a new inferior) and add the initial thread.
remote_target::follow_exec is an example of process target that wants to
do a bit more than the default behavior. So it calls
process_stratum_target::follow_exec first and does the extra work
second.
linux-thread-db (a non-process target) implements follow_exec to do some
bookeeping (forget about that process' data), before handing down the
event down to the process target (which hits
process_stratum_target::follow_exec).
gdb/ChangeLog:
* target.h (struct target_ops) <follow_exec>: Add ptid_t
parameter.
(target_follow_exec): Likewise.
* target.c (target_follow_exec): Add ptid_t parameter.
* infrun.c (follow_exec): Adjust call to target_follow_exec,
don't push target nor create thread.
* linux-thread-db.c (class thread_db_target) <follow_exec>: New.
(thread_db_target::wait): Just return on TARGET_WAITKIND_EXECD.
(thread_db_target::follow_exec): New.
* remote.c (class remote_target) <follow_exec>: Add ptid_t parameter.
(remote_target::follow_exec): Call
process_stratum_target::follow_exec.
* target-delegates.c: Re-generate.
Change-Id: I3f96d0ba3ea0dde6540b7e1b4d5cdb01635088c8
Diffstat (limited to 'gdb/remote.c')
-rw-r--r-- | gdb/remote.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/gdb/remote.c b/gdb/remote.c index 8411b29..4dcc551 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -683,7 +683,7 @@ public: const struct btrace_config *btrace_conf (const struct btrace_target_info *) override; bool augmented_libraries_svr4_read () override; void follow_fork (bool, bool) override; - void follow_exec (struct inferior *, const char *) override; + void follow_exec (inferior *, ptid_t, const char *) override; int insert_fork_catchpoint (int) override; int remove_fork_catchpoint (int) override; int insert_vfork_catchpoint (int) override; @@ -5925,20 +5925,20 @@ remote_target::follow_fork (bool follow_child, bool detach_fork) } /* Target follow-exec function for remote targets. Save EXECD_PATHNAME - in the program space of the new inferior. On entry and at return the - current inferior is the exec'ing inferior. INF is the new exec'd - inferior, which may be the same as the exec'ing inferior unless - follow-exec-mode is "new". */ + in the program space of the new inferior. */ void -remote_target::follow_exec (struct inferior *inf, const char *execd_pathname) +remote_target::follow_exec (inferior *follow_inf, ptid_t ptid, + const char *execd_pathname) { + process_stratum_target::follow_exec (follow_inf, ptid, execd_pathname); + /* We know that this is a target file name, so if it has the "target:" prefix we strip it off before saving it in the program space. */ if (is_target_filename (execd_pathname)) execd_pathname += strlen (TARGET_SYSROOT_PREFIX); - set_pspace_remote_exec_file (inf->pspace, execd_pathname); + set_pspace_remote_exec_file (follow_inf->pspace, execd_pathname); } /* Same as remote_detach, but don't send the "D" packet; just disconnect. */ |