* 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:
Pedro Alves 2009-10-20 11:09:01 +00:00
parent dbde1c1272
commit c069425482
6 changed files with 77 additions and 2 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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));

View File

@ -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?
*/