mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
* linux-nat.c (linux_nat_thread_address_space): New.
(linux_nat_add_target): Install it. * progspace.c (address_space_num): New. * progspace.h (address_space_num): Declare. * target.c (target_thread_address_space): Really query the target. * target.h (struct target_ops) <to_thread_address_space>: New field.
This commit is contained in:
parent
dbde1c1272
commit
c069425482
@ -1,3 +1,13 @@
|
||||
2009-10-20 Pedro Alves <pedro@codesourcery.com>
|
||||
|
||||
* linux-nat.c (linux_nat_thread_address_space): New.
|
||||
(linux_nat_add_target): Install it.
|
||||
* progspace.c (address_space_num): New.
|
||||
* progspace.h (address_space_num): Declare.
|
||||
* target.c (target_thread_address_space): Really query the target.
|
||||
* target.h (struct target_ops) <to_thread_address_space>: New
|
||||
field.
|
||||
|
||||
2009-10-19 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* amd64fbsd-nat.c (amd64fbsd_supply_pcb): Add comment.
|
||||
|
@ -5311,6 +5311,39 @@ linux_nat_close (int quitting)
|
||||
linux_ops->to_close (quitting);
|
||||
}
|
||||
|
||||
/* When requests are passed down from the linux-nat layer to the
|
||||
single threaded inf-ptrace layer, ptids of (lwpid,0,0) form are
|
||||
used. The address space pointer is stored in the inferior object,
|
||||
but the common code that is passed such ptid can't tell whether
|
||||
lwpid is a "main" process id or not (it assumes so). We reverse
|
||||
look up the "main" process id from the lwp here. */
|
||||
|
||||
struct address_space *
|
||||
linux_nat_thread_address_space (struct target_ops *t, ptid_t ptid)
|
||||
{
|
||||
struct lwp_info *lwp;
|
||||
struct inferior *inf;
|
||||
int pid;
|
||||
|
||||
pid = GET_LWP (ptid);
|
||||
if (GET_LWP (ptid) == 0)
|
||||
{
|
||||
/* An (lwpid,0,0) ptid. Look up the lwp object to get at the
|
||||
tgid. */
|
||||
lwp = find_lwp_pid (ptid);
|
||||
pid = GET_PID (lwp->ptid);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* A (pid,lwpid,0) ptid. */
|
||||
pid = GET_PID (ptid);
|
||||
}
|
||||
|
||||
inf = find_inferior_pid (pid);
|
||||
gdb_assert (inf != NULL);
|
||||
return inf->aspace;
|
||||
}
|
||||
|
||||
void
|
||||
linux_nat_add_target (struct target_ops *t)
|
||||
{
|
||||
@ -5333,6 +5366,7 @@ linux_nat_add_target (struct target_ops *t)
|
||||
t->to_thread_alive = linux_nat_thread_alive;
|
||||
t->to_pid_to_str = linux_nat_pid_to_str;
|
||||
t->to_has_thread_control = tc_schedlock;
|
||||
t->to_thread_address_space = linux_nat_thread_address_space;
|
||||
|
||||
t->to_can_async_p = linux_nat_can_async_p;
|
||||
t->to_is_async_p = linux_nat_is_async_p;
|
||||
|
@ -89,6 +89,12 @@ free_address_space (struct address_space *aspace)
|
||||
xfree (aspace);
|
||||
}
|
||||
|
||||
int
|
||||
address_space_num (struct address_space *aspace)
|
||||
{
|
||||
return aspace->num;
|
||||
}
|
||||
|
||||
/* Start counting over from scratch. */
|
||||
|
||||
static void
|
||||
|
@ -254,6 +254,9 @@ extern struct address_space *new_address_space (void);
|
||||
share an address space. */
|
||||
extern struct address_space *maybe_new_address_space (void);
|
||||
|
||||
/* Returns the integer address space id of ASPACE. */
|
||||
extern int address_space_num (struct address_space *aspace);
|
||||
|
||||
/* Update all program spaces matching to address spaces. The user may
|
||||
have created several program spaces, and loaded executables into
|
||||
them before connecting to the target interface that will create the
|
||||
|
19
gdb/target.c
19
gdb/target.c
@ -2555,10 +2555,25 @@ target_get_osdata (const char *type)
|
||||
struct address_space *
|
||||
target_thread_address_space (ptid_t ptid)
|
||||
{
|
||||
struct address_space *aspace;
|
||||
struct inferior *inf;
|
||||
struct target_ops *t;
|
||||
|
||||
/* For now, assume frame chains and inferiors only see one address
|
||||
space. */
|
||||
for (t = current_target.beneath; t != NULL; t = t->beneath)
|
||||
{
|
||||
if (t->to_thread_address_space != NULL)
|
||||
{
|
||||
aspace = t->to_thread_address_space (t, ptid);
|
||||
gdb_assert (aspace);
|
||||
|
||||
if (targetdebug)
|
||||
fprintf_unfiltered (gdb_stdlog,
|
||||
"target_thread_address_space (%s) = %d\n",
|
||||
target_pid_to_str (ptid),
|
||||
address_space_num (aspace));
|
||||
return aspace;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fall-back to the "main" address space of the inferior. */
|
||||
inf = find_inferior_pid (ptid_get_pid (ptid));
|
||||
|
@ -585,6 +585,13 @@ struct target_ops
|
||||
The default implementation always returns target_gdbarch. */
|
||||
struct gdbarch *(*to_thread_architecture) (struct target_ops *, ptid_t);
|
||||
|
||||
/* Determine current address space of thread PTID.
|
||||
|
||||
The default implementation always returns the inferior's
|
||||
address space. */
|
||||
struct address_space *(*to_thread_address_space) (struct target_ops *,
|
||||
ptid_t);
|
||||
|
||||
int to_magic;
|
||||
/* Need sub-structure for target machine related rather than comm related?
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user