aboutsummaryrefslogtreecommitdiff
path: root/gdb/target.h
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2021-05-13 15:28:20 -0400
committerSimon Marchi <simon.marchi@polymtl.ca>2021-05-13 15:29:00 -0400
commit294c36eb6ac9eaf761ec300fd400623ed5175203 (patch)
tree607d3345281a55a1c31d6d273c0e20d56493940d /gdb/target.h
parent2af87c859fe450d4a3a841cf19637a91d53c9486 (diff)
downloadgdb-294c36eb6ac9eaf761ec300fd400623ed5175203.zip
gdb-294c36eb6ac9eaf761ec300fd400623ed5175203.tar.gz
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/target.h')
-rw-r--r--gdb/target.h19
1 files changed, 13 insertions, 6 deletions
diff --git a/gdb/target.h b/gdb/target.h
index b80cf88..d867a58 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -642,7 +642,7 @@ struct target_ops
TARGET_DEFAULT_RETURN (1);
virtual int remove_exec_catchpoint (int)
TARGET_DEFAULT_RETURN (1);
- virtual void follow_exec (struct inferior *, const char *)
+ virtual void follow_exec (inferior *, ptid_t, const char *)
TARGET_DEFAULT_IGNORE ();
virtual int set_syscall_catchpoint (int, bool, int,
gdb::array_view<const int>)
@@ -1715,12 +1715,19 @@ extern int target_remove_vfork_catchpoint (int pid);
void target_follow_fork (bool follow_child, bool detach_fork);
/* Handle the target-specific bookkeeping required when the inferior makes an
- exec call. The current inferior is the inferior that has executed the exec
- call. INF is the inferior in which execution continues post-exec. It is the
- same inferior as the current one if "follow-exec-mode" is "same" but is a new
- one if "follow-exec-mode" is "new". */
+ exec call.
-void target_follow_exec (struct inferior *inf, const char *execd_pathname);
+ The current inferior at the time of the call is the inferior that did the
+ exec. FOLLOW_INF is the inferior in which execution continues post-exec.
+ If "follow-exec-mode" is "same", FOLLOW_INF is the same as the current
+ inferior, meaning that execution continues with the same inferior. If
+ "follow-exec-mode" is "new", FOLLOW_INF is a different inferior, meaning
+ that execution continues in a new inferior.
+
+ On exit, the target must leave FOLLOW_INF as the current inferior. */
+
+void target_follow_exec (inferior *follow_inf, ptid_t ptid,
+ const char *execd_pathname);
/* On some targets, we can catch an inferior exec event when it
occurs. These functions insert/remove an already-created