* corelow.c (get_core_registers): Adjust.

(core_file_thread_alive): Rename to...
	(core_thread_alive): ... this.
	(core_pid_to_str): Try gdbarch_core_pid_to_str first.
	(init_core_ops): Adjust.
	(coreops_suppress_target): Delete.
	(_initialize_corelow): Unconditionally add core_ops.
	* procfs.c: Include "inf-child.h".
	(procfs_ops): Delete.
	(init_procfs_ops): Delete.  Reimplement as...
	(procfs_target): ... this, inheriting from inf-child.
	(procfs_attach, procfs_detach, procfs_fetch_registers): Adjust.
	(procfs_prepare_to_store): Delete.
	(procfs_store_registers, procfs_resume): Adjust.
	(procfs_open): Delete.
	(procfs_suppress_run): Delete.
	(procfs_can_run): Delete.
	(procfs_mourn_inferior): Adjust.
	(procfs_init_inferior): Add target_ops parameter.  Adjust.
	(procfs_create_inferior): Don't pass procfs_init_inferior to
	fork_inferior.  Instead call it after fork_inferior returns.
	(procfs_find_new_threads): Adjust.
	(_initialize_procfs): Adjust to use procfs_target instead of
	init_procfs_ops.
	* sol-thread.c (orig_core_ops, sol_core_ops): Delete.
	(lwp_to_thread): Use target_thread_alive.
	(sol_thread_open): Delete.
	(sol_thread_attach): Delete.
	(sol_thread_detach, sol_thread_resume, sol_thread_wait)
	(sol_thread_fetch_registers, sol_thread_store_registers): Adjust
	to use find_target_beneath.
	(sol_thread_prepare_to_store, sol_thread_xfer_memory): Delete.
	(sol_thread_xfer_partial): Adjust to use find_target_beneath.
	(sol_thread_files_info, sol_thread_kill_inferior): Delete.
	(check_for_thread_db): New.
	(sol_thread_notice_signals, sol_thread_create_inferior): Delete.
	(sol_thread_new_objfile): Call check_for_thread_db.
	(sol_thread_mourn_inferior): Adjust to use find_target_beneath.
	(sol_thread_can_run): Delete.
	(sol_thread_alive): Adjust to use find_target_beneath.
	(sol_thread_stop): Delete.
	(rw_common): Use target_write_memory or target_read_memory.
	(ps_lgetregs, ps_lgetfpregs): Use target_fetch_registers.
	(ps_lsetregs, ps_lsetfpregs): Use target_store_registers.
	(solaris_pid_to_str): Remove check for libthread_db initialization
	failing.
	(sol_find_new_threads): Remove check for libthread_db
	initialization failing, or for an invalid inferior_ptid.  Adjust
	to use find_target_beneath.
	(sol_core_open, sol_core_close, sol_core_detach,
	sol_core_files_info, sol_find_memory_regions,
	sol_make_note_section, ignore): Delete.
	(init_sol_thread_ops): Make it a thread_stratum target.  Remove
	unneeded callback settings.
	(init_sol_core_ops): Delete.
	(_initialize_sol_thread): No longer call init_sol_core_ops, set
	procfs_suppress_run, or hack with core_ops.

	* target.h (struct target_ops): Add a target_ops * parameter to
	to_resume, to_fetch_registers, to_store_registers, to_thread_alive
	and to_find_new_threads.
	(target_fetch_registers, target_store_registers)
	(target_thread_alive, target_find_new_threads): Redeclare as
	function.

	* target.c (update_current_target): Do not inherit or de_fault
	to_resume, to_fetch_registers, to_store_registers,
	to_thread_alive, to_find_new_threads.
	(target_resume): Adjust.
	(target_thread_alive, target_find_new_threads): New.
	(debug_to_resume, debug_to_fetch_registers): Delete.
	(target_fetch_registers): New.
	(debug_to_store_registers): Delete.
	(target_store_registers): New.
	(debug_to_thread_alive, debug_to_find_new_threads): Delete.
	(setup_target_debug): Adjust.

	* gdbcore.h (core_ops): Delete declaration.

	* inf-ptrace.c, linux-nat.c, remote.c, amd64-linux-nat.c,
	inf-child.c, linux-thread-db.c, bsd-uthread.c, inf-ttrace.c,
	i386-sol2-tdep.c, darwin-nat.c, gnu-nat.c, go32-nat.c,
	hpux-thread.c, i386-linux-nat.c, i386fbsd-nat.c, monitor.c,
	nto-procfs.c, remote-m32r-sdi.c, remote-mips.c, windows-nat.c,
	alphabsd-nat.c, amd64bsd-nat.c, arm-linux-nat.c, armnbsd-nat.c,
	bsd-kvm.c, hppa-hpux-nat.c, hppa-linux-nat.c, hppabsd-nat.c,
	hppanbsd-nat.c, i386-darwin-nat.c, i386bsd-nat.c,
	ia64-linux-nat.c, m32r-linux-nat.c, m68kbsd-nat.c,
	m68klinux-nat.c, m88kbsd-nat.c, mips-linux-nat.c,
	mips64obsd-nat.c, mipsnbsd-nat.c, ppc-linux-nat.c, ppcnbsd-nat.c,
	ppcobsd-nat.c, remote-sim.c, rs6000-nat.c, s390-nat.c,
	shnbsd-nat.c, sparc-nat.c, sparc-nat.h, spu-linux-nat.c,
	vaxbsd-nat.c, xtensa-linux-nat.c: Adjust to target_ops changes.

	* gdbarch.sh (core_pid_to_str): New gdbarch callback.
	* gdbarch.h, gdbarch.c: Regenerate.

	* sol2-tdep.c: Include "inferior.h".
	(sol2_core_pid_to_str): New.
	* sol2-tdep.h (sol2_core_pid_to_str): Declare.

	* amd64-sol2-tdep.c (amd64_sol2_init_abi): Set it.
	* sparc-sol2-tdep.c (sparc32_sol2_init_abi): Set it.
	* sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Set it.
	* i386-sol2-tdep.c (i386_sol2_init_abi): Set it.
This commit is contained in:
Pedro Alves 2009-02-23 00:03:50 +00:00
parent f05219476d
commit 28439f5ef7
66 changed files with 801 additions and 906 deletions

View file

@ -1,3 +1,111 @@
2009-02-23 Pedro Alves <pedro@codesourcery.com>
* corelow.c (get_core_registers): Adjust.
(core_file_thread_alive): Rename to...
(core_thread_alive): ... this.
(core_pid_to_str): Try gdbarch_core_pid_to_str first.
(init_core_ops): Adjust.
(coreops_suppress_target): Delete.
(_initialize_corelow): Unconditionally add core_ops.
* procfs.c: Include "inf-child.h".
(procfs_ops): Delete.
(init_procfs_ops): Delete. Reimplement as...
(procfs_target): ... this, inheriting from inf-child.
(procfs_attach, procfs_detach, procfs_fetch_registers): Adjust.
(procfs_prepare_to_store): Delete.
(procfs_store_registers, procfs_resume): Adjust.
(procfs_open): Delete.
(procfs_suppress_run): Delete.
(procfs_can_run): Delete.
(procfs_mourn_inferior): Adjust.
(procfs_init_inferior): Add target_ops parameter. Adjust.
(procfs_create_inferior): Don't pass procfs_init_inferior to
fork_inferior. Instead call it after fork_inferior returns.
(procfs_find_new_threads): Adjust.
(_initialize_procfs): Adjust to use procfs_target instead of
init_procfs_ops.
* sol-thread.c (orig_core_ops, sol_core_ops): Delete.
(lwp_to_thread): Use target_thread_alive.
(sol_thread_open): Delete.
(sol_thread_attach): Delete.
(sol_thread_detach, sol_thread_resume, sol_thread_wait)
(sol_thread_fetch_registers, sol_thread_store_registers): Adjust
to use find_target_beneath.
(sol_thread_prepare_to_store, sol_thread_xfer_memory): Delete.
(sol_thread_xfer_partial): Adjust to use find_target_beneath.
(sol_thread_files_info, sol_thread_kill_inferior): Delete.
(check_for_thread_db): New.
(sol_thread_notice_signals, sol_thread_create_inferior): Delete.
(sol_thread_new_objfile): Call check_for_thread_db.
(sol_thread_mourn_inferior): Adjust to use find_target_beneath.
(sol_thread_can_run): Delete.
(sol_thread_alive): Adjust to use find_target_beneath.
(sol_thread_stop): Delete.
(rw_common): Use target_write_memory or target_read_memory.
(ps_lgetregs, ps_lgetfpregs): Use target_fetch_registers.
(ps_lsetregs, ps_lsetfpregs): Use target_store_registers.
(solaris_pid_to_str): Remove check for libthread_db initialization
failing.
(sol_find_new_threads): Remove check for libthread_db
initialization failing, or for an invalid inferior_ptid. Adjust
to use find_target_beneath.
(sol_core_open, sol_core_close, sol_core_detach,
sol_core_files_info, sol_find_memory_regions,
sol_make_note_section, ignore): Delete.
(init_sol_thread_ops): Make it a thread_stratum target. Remove
unneeded callback settings.
(init_sol_core_ops): Delete.
(_initialize_sol_thread): No longer call init_sol_core_ops, set
procfs_suppress_run, or hack with core_ops.
* target.h (struct target_ops): Add a target_ops * parameter to
to_resume, to_fetch_registers, to_store_registers, to_thread_alive
and to_find_new_threads.
(target_fetch_registers, target_store_registers)
(target_thread_alive, target_find_new_threads): Redeclare as
function.
* target.c (update_current_target): Do not inherit or de_fault
to_resume, to_fetch_registers, to_store_registers,
to_thread_alive, to_find_new_threads.
(target_resume): Adjust.
(target_thread_alive, target_find_new_threads): New.
(debug_to_resume, debug_to_fetch_registers): Delete.
(target_fetch_registers): New.
(debug_to_store_registers): Delete.
(target_store_registers): New.
(debug_to_thread_alive, debug_to_find_new_threads): Delete.
(setup_target_debug): Adjust.
* gdbcore.h (core_ops): Delete declaration.
* inf-ptrace.c, linux-nat.c, remote.c, amd64-linux-nat.c,
inf-child.c, linux-thread-db.c, bsd-uthread.c, inf-ttrace.c,
i386-sol2-tdep.c, darwin-nat.c, gnu-nat.c, go32-nat.c,
hpux-thread.c, i386-linux-nat.c, i386fbsd-nat.c, monitor.c,
nto-procfs.c, remote-m32r-sdi.c, remote-mips.c, windows-nat.c,
alphabsd-nat.c, amd64bsd-nat.c, arm-linux-nat.c, armnbsd-nat.c,
bsd-kvm.c, hppa-hpux-nat.c, hppa-linux-nat.c, hppabsd-nat.c,
hppanbsd-nat.c, i386-darwin-nat.c, i386bsd-nat.c,
ia64-linux-nat.c, m32r-linux-nat.c, m68kbsd-nat.c,
m68klinux-nat.c, m88kbsd-nat.c, mips-linux-nat.c,
mips64obsd-nat.c, mipsnbsd-nat.c, ppc-linux-nat.c, ppcnbsd-nat.c,
ppcobsd-nat.c, remote-sim.c, rs6000-nat.c, s390-nat.c,
shnbsd-nat.c, sparc-nat.c, sparc-nat.h, spu-linux-nat.c,
vaxbsd-nat.c, xtensa-linux-nat.c: Adjust to target_ops changes.
* gdbarch.sh (core_pid_to_str): New gdbarch callback.
* gdbarch.h, gdbarch.c: Regenerate.
* sol2-tdep.c: Include "inferior.h".
(sol2_core_pid_to_str): New.
* sol2-tdep.h (sol2_core_pid_to_str): Declare.
* amd64-sol2-tdep.c (amd64_sol2_init_abi): Set it.
* sparc-sol2-tdep.c (sparc32_sol2_init_abi): Set it.
* sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Set it.
* i386-sol2-tdep.c (i386_sol2_init_abi): Set it.
2009-02-22 Doug Evans <dje@google.com> 2009-02-22 Doug Evans <dje@google.com>
* exec.c (exec_file_attach): Fix comment. * exec.c (exec_file_attach): Fix comment.

View file

@ -84,7 +84,8 @@ getregs_supplies (int regno)
for all registers (including the floating point registers). */ for all registers (including the floating point registers). */
static void static void
alphabsd_fetch_inferior_registers (struct regcache *regcache, int regno) alphabsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (regno == -1 || getregs_supplies (regno)) if (regno == -1 || getregs_supplies (regno))
{ {
@ -115,7 +116,8 @@ alphabsd_fetch_inferior_registers (struct regcache *regcache, int regno)
this for all registers (including the floating point registers). */ this for all registers (including the floating point registers). */
static void static void
alphabsd_store_inferior_registers (struct regcache *regcache, int regno) alphabsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (regno == -1 || getregs_supplies (regno)) if (regno == -1 || getregs_supplies (regno))
{ {

View file

@ -155,7 +155,8 @@ fill_fpregset (const struct regcache *regcache,
registers). */ registers). */
static void static void
amd64_linux_fetch_inferior_registers (struct regcache *regcache, int regnum) amd64_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
int tid; int tid;
@ -193,7 +194,8 @@ amd64_linux_fetch_inferior_registers (struct regcache *regcache, int regnum)
registers). */ registers). */
static void static void
amd64_linux_store_inferior_registers (struct regcache *regcache, int regnum) amd64_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
int tid; int tid;

View file

@ -117,6 +117,9 @@ amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* Solaris encodes the pid of the inferior in regset section /* Solaris encodes the pid of the inferior in regset section
names. */ names. */
set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
/* How to print LWP PTIDs from core files. */
set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str);
} }

View file

@ -39,7 +39,8 @@
for all registers (including the floating-point registers). */ for all registers (including the floating-point registers). */
static void static void
amd64bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) amd64bsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
@ -72,7 +73,8 @@ amd64bsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
this for all registers (including the floating-point registers). */ this for all registers (including the floating-point registers). */
static void static void
amd64bsd_store_inferior_registers (struct regcache *regcache, int regnum) amd64bsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);

View file

@ -452,7 +452,8 @@ store_wmmx_regs (const struct regcache *regcache)
point registers depending upon the value of regno. */ point registers depending upon the value of regno. */
static void static void
arm_linux_fetch_inferior_registers (struct regcache *regcache, int regno) arm_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (-1 == regno) if (-1 == regno)
{ {
@ -478,7 +479,8 @@ arm_linux_fetch_inferior_registers (struct regcache *regcache, int regno)
point registers depending upon the value of regno. */ point registers depending upon the value of regno. */
static void static void
arm_linux_store_inferior_registers (struct regcache *regcache, int regno) arm_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (-1 == regno) if (-1 == regno)
{ {

View file

@ -194,7 +194,8 @@ fetch_fp_regs (struct regcache *regcache)
} }
static void static void
armnbsd_fetch_registers (struct regcache *regcache, int regno) armnbsd_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (regno >= 0) if (regno >= 0)
{ {
@ -394,7 +395,8 @@ store_fp_regs (const struct regcache *regcache)
} }
static void static void
armnbsd_store_registers (struct regcache *regcache, int regno) armnbsd_store_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (regno >= 0) if (regno >= 0)
{ {

View file

@ -172,7 +172,8 @@ bsd_kvm_fetch_pcb (struct regcache *regcache, struct pcb *paddr)
} }
static void static void
bsd_kvm_fetch_registers (struct regcache *regcache, int regnum) bsd_kvm_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct nlist nl[2]; struct nlist nl[2];
@ -310,7 +311,8 @@ bsd_kvm_pcb_cmd (char *arg, int fromtty)
} }
static int static int
bsd_kvm_thread_alive (ptid_t ptid) bsd_kvm_thread_alive (struct target_ops *ops,
ptid_t ptid)
{ {
return 1; return 1;
} }

View file

@ -272,21 +272,23 @@ bsd_uthread_solib_unloaded (struct so_list *so)
static void static void
bsd_uthread_mourn_inferior (struct target_ops *ops) bsd_uthread_mourn_inferior (struct target_ops *ops)
{ {
struct target_ops *beneath = find_target_beneath (bsd_uthread_ops_hack); struct target_ops *beneath = find_target_beneath (ops);
beneath->to_mourn_inferior (beneath); beneath->to_mourn_inferior (beneath);
bsd_uthread_deactivate (); bsd_uthread_deactivate ();
} }
static void static void
bsd_uthread_fetch_registers (struct regcache *regcache, int regnum) bsd_uthread_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data); struct bsd_uthread_ops *uthread_ops = gdbarch_data (gdbarch, bsd_uthread_data);
CORE_ADDR addr = ptid_get_tid (inferior_ptid); CORE_ADDR addr = ptid_get_tid (inferior_ptid);
struct target_ops *beneath = find_target_beneath (ops);
CORE_ADDR active_addr; CORE_ADDR active_addr;
/* Always fetch the appropriate registers from the layer beneath. */ /* Always fetch the appropriate registers from the layer beneath. */
find_target_beneath (bsd_uthread_ops_hack)->to_fetch_registers (regcache, regnum); beneath->to_fetch_registers (beneath, regcache, regnum);
/* FIXME: That might have gotten us more than we asked for. Make /* FIXME: That might have gotten us more than we asked for. Make
sure we overwrite all relevant registers with values from the sure we overwrite all relevant registers with values from the
@ -297,16 +299,18 @@ bsd_uthread_fetch_registers (struct regcache *regcache, int regnum)
if (addr != 0 && addr != active_addr) if (addr != 0 && addr != active_addr)
{ {
bsd_uthread_check_magic (addr); bsd_uthread_check_magic (addr);
ops->supply_uthread (regcache, regnum, uthread_ops->supply_uthread (regcache, regnum,
addr + bsd_uthread_thread_ctx_offset); addr + bsd_uthread_thread_ctx_offset);
} }
} }
static void static void
bsd_uthread_store_registers (struct regcache *regcache, int regnum) bsd_uthread_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data); struct bsd_uthread_ops *uthread_ops = gdbarch_data (gdbarch, bsd_uthread_data);
struct target_ops *beneath = find_target_beneath (ops);
CORE_ADDR addr = ptid_get_tid (inferior_ptid); CORE_ADDR addr = ptid_get_tid (inferior_ptid);
CORE_ADDR active_addr; CORE_ADDR active_addr;
@ -314,14 +318,14 @@ bsd_uthread_store_registers (struct regcache *regcache, int regnum)
if (addr != 0 && addr != active_addr) if (addr != 0 && addr != active_addr)
{ {
bsd_uthread_check_magic (addr); bsd_uthread_check_magic (addr);
ops->collect_uthread (regcache, regnum, uthread_ops->collect_uthread (regcache, regnum,
addr + bsd_uthread_thread_ctx_offset); addr + bsd_uthread_thread_ctx_offset);
} }
else else
{ {
/* Updating the thread that is currently running; pass the /* Updating the thread that is currently running; pass the
request to the layer beneath. */ request to the layer beneath. */
find_target_beneath (bsd_uthread_ops_hack)->to_store_registers (regcache, regnum); beneath->to_store_registers (beneath, regcache, regnum);
} }
} }
@ -344,7 +348,7 @@ bsd_uthread_wait (struct target_ops *ops,
ptid_t ptid, struct target_waitstatus *status) ptid_t ptid, struct target_waitstatus *status)
{ {
CORE_ADDR addr; CORE_ADDR addr;
struct target_ops *beneath = find_target_beneath (bsd_uthread_ops_hack); struct target_ops *beneath = find_target_beneath (ops);
/* Pass the request to the layer beneath. */ /* Pass the request to the layer beneath. */
ptid = beneath->to_wait (beneath, ptid, status); ptid = beneath->to_wait (beneath, ptid, status);
@ -389,15 +393,18 @@ bsd_uthread_wait (struct target_ops *ops,
} }
static void static void
bsd_uthread_resume (ptid_t ptid, int step, enum target_signal sig) bsd_uthread_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal sig)
{ {
/* Pass the request to the layer beneath. */ /* Pass the request to the layer beneath. */
find_target_beneath (bsd_uthread_ops_hack)->to_resume (ptid, step, sig); struct target_ops *beneath = find_target_beneath (ops);
beneath->to_resume (beneath, ptid, step, sig);
} }
static int static int
bsd_uthread_thread_alive (ptid_t ptid) bsd_uthread_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
struct target_ops *beneath = find_target_beneath (ops);
CORE_ADDR addr = ptid_get_tid (inferior_ptid); CORE_ADDR addr = ptid_get_tid (inferior_ptid);
if (addr != 0) if (addr != 0)
@ -412,11 +419,11 @@ bsd_uthread_thread_alive (ptid_t ptid)
return 0; return 0;
} }
return find_target_beneath (bsd_uthread_ops_hack)->to_thread_alive (ptid); return beneath->to_thread_alive (beneath, ptid);
} }
static void static void
bsd_uthread_find_new_threads (void) bsd_uthread_find_new_threads (struct target_ops *ops)
{ {
pid_t pid = ptid_get_pid (inferior_ptid); pid_t pid = ptid_get_pid (inferior_ptid);
int offset = bsd_uthread_thread_next_offset; int offset = bsd_uthread_thread_next_offset;

View file

@ -81,12 +81,8 @@ static void core_close (int);
static void core_close_cleanup (void *ignore); static void core_close_cleanup (void *ignore);
static void get_core_registers (struct regcache *, int);
static void add_to_thread_list (bfd *, asection *, void *); static void add_to_thread_list (bfd *, asection *, void *);
static int core_file_thread_alive (ptid_t tid);
static void init_core_ops (void); static void init_core_ops (void);
void _initialize_corelow (void); void _initialize_corelow (void);
@ -525,7 +521,8 @@ get_core_register_section (struct regcache *regcache,
/* We just get all the registers, so we don't use regno. */ /* We just get all the registers, so we don't use regno. */
static void static void
get_core_registers (struct regcache *regcache, int regno) get_core_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int i; int i;
@ -678,7 +675,7 @@ ignore (struct bp_target_info *bp_tgt)
behaviour. behaviour.
*/ */
static int static int
core_file_thread_alive (ptid_t tid) core_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
return 1; return 1;
} }
@ -702,6 +699,14 @@ core_pid_to_str (struct target_ops *ops, ptid_t ptid)
{ {
static char buf[64]; static char buf[64];
if (core_gdbarch
&& gdbarch_core_pid_to_str_p (core_gdbarch))
{
char *ret = gdbarch_core_pid_to_str (core_gdbarch, ptid);
if (ret != NULL)
return ret;
}
if (ptid_get_lwp (ptid) == 0) if (ptid_get_lwp (ptid) == 0)
xsnprintf (buf, sizeof buf, "<main task>"); xsnprintf (buf, sizeof buf, "<main task>");
else else
@ -730,7 +735,7 @@ init_core_ops (void)
core_ops.to_insert_breakpoint = ignore; core_ops.to_insert_breakpoint = ignore;
core_ops.to_remove_breakpoint = ignore; core_ops.to_remove_breakpoint = ignore;
core_ops.to_create_inferior = find_default_create_inferior; core_ops.to_create_inferior = find_default_create_inferior;
core_ops.to_thread_alive = core_file_thread_alive; core_ops.to_thread_alive = core_thread_alive;
core_ops.to_read_description = core_read_description; core_ops.to_read_description = core_read_description;
core_ops.to_pid_to_str = core_pid_to_str; core_ops.to_pid_to_str = core_pid_to_str;
core_ops.to_stratum = core_stratum; core_ops.to_stratum = core_stratum;
@ -740,19 +745,10 @@ init_core_ops (void)
core_ops.to_magic = OPS_MAGIC; core_ops.to_magic = OPS_MAGIC;
} }
/* non-zero if we should not do the add_target call in
_initialize_corelow; not initialized (i.e., bss) so that
the target can initialize it (i.e., data) if appropriate.
This needs to be set at compile time because we don't know
for sure whether the target's initialize routine is called
before us or after us. */
int coreops_suppress_target;
void void
_initialize_corelow (void) _initialize_corelow (void)
{ {
init_core_ops (); init_core_ops ();
if (!coreops_suppress_target) add_target (&core_ops);
add_target (&core_ops);
} }

View file

@ -86,9 +86,6 @@ extern boolean_t exc_server (mach_msg_header_t *in, mach_msg_header_t *out);
static void darwin_stop (ptid_t); static void darwin_stop (ptid_t);
static void darwin_resume (ptid_t ptid, int step,
enum target_signal signal);
static void darwin_mourn_inferior (struct target_ops *ops); static void darwin_mourn_inferior (struct target_ops *ops);
static int darwin_lookup_task (char *args, task_t * ptask, int *ppid); static int darwin_lookup_task (char *args, task_t * ptask, int *ppid);
@ -104,8 +101,6 @@ static void darwin_create_inferior (struct target_ops *ops, char *exec_file,
static void darwin_files_info (struct target_ops *ops); static void darwin_files_info (struct target_ops *ops);
static int darwin_thread_alive (ptid_t tpid);
/* Current inferior. */ /* Current inferior. */
darwin_inferior *darwin_inf = NULL; darwin_inferior *darwin_inf = NULL;
@ -342,7 +337,8 @@ darwin_stop (ptid_t t)
} }
static void static void
darwin_resume (ptid_t ptid, int step, enum target_signal signal) darwin_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signal)
{ {
struct target_waitstatus status; struct target_waitstatus status;
int pid; int pid;
@ -686,7 +682,7 @@ darwin_stop_inferior (darwin_inferior *inf)
MACH_CHECK_ERROR (kret); MACH_CHECK_ERROR (kret);
if (msg_state == GOT_MESSAGE) if (msg_state == GOT_MESSAGE)
darwin_resume (inferior_ptid, 0, 0); darwin_resume (darwin_ops, inferior_ptid, 0, 0);
res = kill (inf->pid, SIGSTOP); res = kill (inf->pid, SIGSTOP);
if (res != 0) if (res != 0)
@ -697,7 +693,7 @@ darwin_stop_inferior (darwin_inferior *inf)
} }
static void static void
darwin_kill_inferior (void) darwin_kill_inferior (struct target_ops *ops)
{ {
struct target_waitstatus wstatus; struct target_waitstatus wstatus;
ptid_t ptid; ptid_t ptid;
@ -718,7 +714,7 @@ darwin_kill_inferior (void)
if (msg_state == GOT_MESSAGE) if (msg_state == GOT_MESSAGE)
{ {
exc_msg.ex_type = 0; exc_msg.ex_type = 0;
darwin_resume (inferior_ptid, 0, 0); darwin_resume (ops, inferior_ptid, 0, 0);
} }
kret = task_resume (darwin_inf->task); kret = task_resume (darwin_inf->task);
@ -1023,7 +1019,7 @@ darwin_detach (struct target_ops *ops, char *args, int from_tty)
if (msg_state == GOT_MESSAGE) if (msg_state == GOT_MESSAGE)
{ {
exc_msg.ex_type = 0; exc_msg.ex_type = 0;
darwin_resume (inferior_ptid, 0, 0); darwin_resume (ops, inferior_ptid, 0, 0);
} }
kret = task_resume (darwin_inf->task); kret = task_resume (darwin_inf->task);
@ -1058,7 +1054,7 @@ darwin_pid_to_str (struct target_ops *ops, ptid_t ptid)
} }
static int static int
darwin_thread_alive (ptid_t ptid) darwin_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
return 1; return 1;
} }

View file

@ -226,6 +226,7 @@ struct gdbarch
int core_reg_section_encodes_pid; int core_reg_section_encodes_pid;
struct core_regset_section * core_regset_sections; struct core_regset_section * core_regset_sections;
gdbarch_core_xfer_shared_libraries_ftype *core_xfer_shared_libraries; gdbarch_core_xfer_shared_libraries_ftype *core_xfer_shared_libraries;
gdbarch_core_pid_to_str_ftype *core_pid_to_str;
int vtable_function_descriptors; int vtable_function_descriptors;
int vbit_in_delta; int vbit_in_delta;
gdbarch_skip_permanent_breakpoint_ftype *skip_permanent_breakpoint; gdbarch_skip_permanent_breakpoint_ftype *skip_permanent_breakpoint;
@ -360,6 +361,7 @@ struct gdbarch startup_gdbarch =
0, /* core_reg_section_encodes_pid */ 0, /* core_reg_section_encodes_pid */
0, /* core_regset_sections */ 0, /* core_regset_sections */
0, /* core_xfer_shared_libraries */ 0, /* core_xfer_shared_libraries */
0, /* core_pid_to_str */
0, /* vtable_function_descriptors */ 0, /* vtable_function_descriptors */
0, /* vbit_in_delta */ 0, /* vbit_in_delta */
0, /* skip_permanent_breakpoint */ 0, /* skip_permanent_breakpoint */
@ -613,6 +615,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
/* Skip verify of regset_from_core_section, has predicate */ /* Skip verify of regset_from_core_section, has predicate */
/* Skip verify of core_reg_section_encodes_pid, invalid_p == 0 */ /* Skip verify of core_reg_section_encodes_pid, invalid_p == 0 */
/* Skip verify of core_xfer_shared_libraries, has predicate */ /* Skip verify of core_xfer_shared_libraries, has predicate */
/* Skip verify of core_pid_to_str, has predicate */
/* Skip verify of vtable_function_descriptors, invalid_p == 0 */ /* Skip verify of vtable_function_descriptors, invalid_p == 0 */
/* Skip verify of vbit_in_delta, invalid_p == 0 */ /* Skip verify of vbit_in_delta, invalid_p == 0 */
/* Skip verify of skip_permanent_breakpoint, has predicate */ /* Skip verify of skip_permanent_breakpoint, has predicate */
@ -732,6 +735,12 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
fprintf_unfiltered (file, fprintf_unfiltered (file,
"gdbarch_dump: convert_register_p = <%s>\n", "gdbarch_dump: convert_register_p = <%s>\n",
host_address_to_string (gdbarch->convert_register_p)); host_address_to_string (gdbarch->convert_register_p));
fprintf_unfiltered (file,
"gdbarch_dump: gdbarch_core_pid_to_str_p() = %d\n",
gdbarch_core_pid_to_str_p (gdbarch));
fprintf_unfiltered (file,
"gdbarch_dump: core_pid_to_str = <%s>\n",
host_address_to_string (gdbarch->core_pid_to_str));
fprintf_unfiltered (file, fprintf_unfiltered (file,
"gdbarch_dump: gdbarch_core_read_description_p() = %d\n", "gdbarch_dump: gdbarch_core_read_description_p() = %d\n",
gdbarch_core_read_description_p (gdbarch)); gdbarch_core_read_description_p (gdbarch));
@ -2962,6 +2971,30 @@ set_gdbarch_core_xfer_shared_libraries (struct gdbarch *gdbarch,
gdbarch->core_xfer_shared_libraries = core_xfer_shared_libraries; gdbarch->core_xfer_shared_libraries = core_xfer_shared_libraries;
} }
int
gdbarch_core_pid_to_str_p (struct gdbarch *gdbarch)
{
gdb_assert (gdbarch != NULL);
return gdbarch->core_pid_to_str != NULL;
}
char *
gdbarch_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid)
{
gdb_assert (gdbarch != NULL);
gdb_assert (gdbarch->core_pid_to_str != NULL);
if (gdbarch_debug >= 2)
fprintf_unfiltered (gdb_stdlog, "gdbarch_core_pid_to_str called\n");
return gdbarch->core_pid_to_str (gdbarch, ptid);
}
void
set_gdbarch_core_pid_to_str (struct gdbarch *gdbarch,
gdbarch_core_pid_to_str_ftype core_pid_to_str)
{
gdbarch->core_pid_to_str = core_pid_to_str;
}
int int
gdbarch_vtable_function_descriptors (struct gdbarch *gdbarch) gdbarch_vtable_function_descriptors (struct gdbarch *gdbarch)
{ {

View file

@ -661,6 +661,15 @@ typedef LONGEST (gdbarch_core_xfer_shared_libraries_ftype) (struct gdbarch *gdba
extern LONGEST gdbarch_core_xfer_shared_libraries (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, LONGEST len); extern LONGEST gdbarch_core_xfer_shared_libraries (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, LONGEST len);
extern void set_gdbarch_core_xfer_shared_libraries (struct gdbarch *gdbarch, gdbarch_core_xfer_shared_libraries_ftype *core_xfer_shared_libraries); extern void set_gdbarch_core_xfer_shared_libraries (struct gdbarch *gdbarch, gdbarch_core_xfer_shared_libraries_ftype *core_xfer_shared_libraries);
/* How the core_stratum layer converts a PTID from a core file to a
string. */
extern int gdbarch_core_pid_to_str_p (struct gdbarch *gdbarch);
typedef char * (gdbarch_core_pid_to_str_ftype) (struct gdbarch *gdbarch, ptid_t ptid);
extern char * gdbarch_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid);
extern void set_gdbarch_core_pid_to_str (struct gdbarch *gdbarch, gdbarch_core_pid_to_str_ftype *core_pid_to_str);
/* If the elements of C++ vtables are in-place function descriptors rather /* If the elements of C++ vtables are in-place function descriptors rather
than normal function pointers (which may point to code or a descriptor), than normal function pointers (which may point to code or a descriptor),
set this to one. */ set this to one. */

View file

@ -614,6 +614,10 @@ v:struct core_regset_section *:core_regset_sections:const char *name, int len:::
# core file into buffer READBUF with length LEN. # core file into buffer READBUF with length LEN.
M:LONGEST:core_xfer_shared_libraries:gdb_byte *readbuf, ULONGEST offset, LONGEST len:readbuf, offset, len M:LONGEST:core_xfer_shared_libraries:gdb_byte *readbuf, ULONGEST offset, LONGEST len:readbuf, offset, len
# How the core_stratum layer converts a PTID from a core file to a
# string.
M:char *:core_pid_to_str:ptid_t ptid:ptid
# If the elements of C++ vtables are in-place function descriptors rather # If the elements of C++ vtables are in-place function descriptors rather
# than normal function pointers (which may point to code or a descriptor), # than normal function pointers (which may point to code or a descriptor),
# set this to one. # set this to one.

View file

@ -114,10 +114,6 @@ extern void exec_file_clear (int from_tty);
extern void validate_files (void); extern void validate_files (void);
/* The target vector for core files. */
extern struct target_ops core_ops;
/* The current default bfd target. */ /* The current default bfd target. */
extern char *gnutarget; extern char *gnutarget;

View file

@ -1955,7 +1955,8 @@ port_msgs_queued (mach_port_t port)
in multiple events returned by wait). in multiple events returned by wait).
*/ */
static void static void
gnu_resume (ptid_t ptid, int step, enum target_signal sig) gnu_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal sig)
{ {
struct proc *step_thread = 0; struct proc *step_thread = 0;
int resume_all; int resume_all;
@ -2262,7 +2263,7 @@ gnu_stop (ptid_t ptid)
} }
static int static int
gnu_thread_alive (ptid_t ptid) gnu_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
inf_update_procs (gnu_current_inf); inf_update_procs (gnu_current_inf);
return !!inf_tid_to_thread (gnu_current_inf, return !!inf_tid_to_thread (gnu_current_inf,
@ -2612,8 +2613,10 @@ gnu_pid_to_str (struct target_ops *ops, ptid_t ptid)
} }
extern void gnu_store_registers (struct regcache *regcache, int regno); extern void gnu_store_registers (struct target_ops *ops,
extern void gnu_fetch_registers (struct regcache *regcache, int regno); struct regcache *regcache, int regno);
extern void gnu_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regno);
struct target_ops gnu_ops; struct target_ops gnu_ops;

View file

@ -169,11 +169,14 @@ static void go32_open (char *name, int from_tty);
static void go32_close (int quitting); static void go32_close (int quitting);
static void go32_attach (char *args, int from_tty); static void go32_attach (char *args, int from_tty);
static void go32_detach (char *args, int from_tty); static void go32_detach (char *args, int from_tty);
static void go32_resume (ptid_t ptid, int step, static void go32_resume (struct target_ops *ops,
enum target_signal siggnal); ptid_t ptid, int step,
static void go32_fetch_registers (struct regcache *, int regno); enum target_signal siggnal);
static void go32_fetch_registers (struct target_ops *ops,
struct regcache *, int regno);
static void store_register (const struct regcache *, int regno); static void store_register (const struct regcache *, int regno);
static void go32_store_registers (struct regcache *, int regno); static void go32_store_registers (struct target_ops *ops,
struct regcache *, int regno);
static void go32_prepare_to_store (struct regcache *); static void go32_prepare_to_store (struct regcache *);
static int go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, static int go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
int write, int write,
@ -321,7 +324,8 @@ static int resume_is_step;
static int resume_signal = -1; static int resume_signal = -1;
static void static void
go32_resume (ptid_t ptid, int step, enum target_signal siggnal) go32_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal siggnal)
{ {
int i; int i;
@ -478,7 +482,8 @@ fetch_register (struct regcache *regcache, int regno)
} }
static void static void
go32_fetch_registers (struct regcache *regcache, int regno) go32_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (regno >= 0) if (regno >= 0)
fetch_register (regcache, regno); fetch_register (regcache, regno);
@ -507,7 +512,8 @@ store_register (const struct regcache *regcache, int regno)
} }
static void static void
go32_store_registers (struct regcache *regcache, int regno) go32_store_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
unsigned r; unsigned r;
@ -859,7 +865,7 @@ go32_terminal_ours (void)
} }
static int static int
go32_thread_alive (ptid_t ptid) go32_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
return 1; return 1;
} }

View file

@ -143,7 +143,8 @@ hppa_hpux_fetch_register (struct regcache *regcache, int regnum)
} }
static void static void
hppa_hpux_fetch_inferior_registers (struct regcache *regcache, int regnum) hppa_hpux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
for (regnum = 0; for (regnum = 0;
@ -218,7 +219,8 @@ hppa_hpux_store_register (struct regcache *regcache, int regnum)
this for all registers (including the floating point registers). */ this for all registers (including the floating point registers). */
static void static void
hppa_hpux_store_inferior_registers (struct regcache *regcache, int regnum) hppa_hpux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
for (regnum = 0; for (regnum = 0;

View file

@ -270,7 +270,8 @@ store_register (const struct regcache *regcache, int regno)
point registers depending upon the value of regno. */ point registers depending upon the value of regno. */
static void static void
hppa_linux_fetch_inferior_registers (struct regcache *regcache, int regno) hppa_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (-1 == regno) if (-1 == regno)
{ {
@ -290,7 +291,8 @@ hppa_linux_fetch_inferior_registers (struct regcache *regcache, int regno)
point registers depending upon the value of regno. */ point registers depending upon the value of regno. */
static void static void
hppa_linux_store_inferior_registers (struct regcache *regcache, int regno) hppa_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (-1 == regno) if (-1 == regno)
{ {

View file

@ -122,7 +122,8 @@ hppabsd_collect_fpregset (struct regcache *regcache,
for all registers (including the floating-point registers). */ for all registers (including the floating-point registers). */
static void static void
hppabsd_fetch_registers (struct regcache *regcache, int regnum) hppabsd_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1 || hppabsd_gregset_supplies_p (regnum)) if (regnum == -1 || hppabsd_gregset_supplies_p (regnum))
{ {
@ -151,7 +152,8 @@ hppabsd_fetch_registers (struct regcache *regcache, int regnum)
this for all registers (including the floating-point registers). */ this for all registers (including the floating-point registers). */
static void static void
hppabsd_store_registers (struct regcache *regcache, int regnum) hppabsd_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1 || hppabsd_gregset_supplies_p (regnum)) if (regnum == -1 || hppabsd_gregset_supplies_p (regnum))
{ {

View file

@ -161,7 +161,8 @@ hppanbsd_collect_fpregset (struct regcache *regcache,
for all registers (including the floating-point registers). */ for all registers (including the floating-point registers). */
static void static void
hppanbsd_fetch_registers (struct regcache *regcache, int regnum) hppanbsd_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1 || hppanbsd_gregset_supplies_p (regnum)) if (regnum == -1 || hppanbsd_gregset_supplies_p (regnum))
@ -191,7 +192,8 @@ hppanbsd_fetch_registers (struct regcache *regcache, int regnum)
this for all registers (including the floating-point registers). */ this for all registers (including the floating-point registers). */
static void static void
hppanbsd_store_registers (struct regcache *regcache, int regnum) hppanbsd_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1 || hppanbsd_gregset_supplies_p (regnum)) if (regnum == -1 || hppanbsd_gregset_supplies_p (regnum))
{ {

View file

@ -65,9 +65,6 @@ static ptid_t main_ptid; /* Real process ID */
static CORE_ADDR P_cma__g_known_threads; static CORE_ADDR P_cma__g_known_threads;
static CORE_ADDR P_cma__g_current_thread; static CORE_ADDR P_cma__g_current_thread;
static void hpux_thread_resume (ptid_t ptid, int step,
enum target_signal signo);
static void init_hpux_thread_ops (void); static void init_hpux_thread_ops (void);
static struct target_ops hpux_thread_ops; static struct target_ops hpux_thread_ops;
@ -171,7 +168,8 @@ hpux_thread_detach (struct target_ops *ops, char *args, int from_tty)
for procfs. */ for procfs. */
static void static void
hpux_thread_resume (ptid_t ptid, int step, enum target_signal signo) hpux_thread_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signo)
{ {
struct cleanup *old_chain; struct cleanup *old_chain;
@ -180,7 +178,7 @@ hpux_thread_resume (ptid_t ptid, int step, enum target_signal signo)
ptid = main_ptid; ptid = main_ptid;
inferior_ptid = main_ptid; inferior_ptid = main_ptid;
deprecated_child_ops.to_resume (ptid, step, signo); deprecated_child_ops.to_resume (&deprecated_child_ops, ptid, step, signo);
cached_thread = 0; cached_thread = 0;
@ -241,7 +239,8 @@ static char regmap[] =
}; };
static void static void
hpux_thread_fetch_registers (struct regcache *regcache, int regno) hpux_thread_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
cma__t_int_tcb tcb, *tcb_ptr; cma__t_int_tcb tcb, *tcb_ptr;
@ -257,7 +256,8 @@ hpux_thread_fetch_registers (struct regcache *regcache, int regno)
if (tcb_ptr->state == cma__c_state_running) if (tcb_ptr->state == cma__c_state_running)
{ {
deprecated_child_ops.to_fetch_registers (regcache, regno); deprecated_child_ops.to_fetch_registers (&deprecated_child_ops,
regcache, regno);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -278,7 +278,8 @@ hpux_thread_fetch_registers (struct regcache *regcache, int regno)
for (regno = first_regno; regno <= last_regno; regno++) for (regno = first_regno; regno <= last_regno; regno++)
{ {
if (regmap[regno] == -1) if (regmap[regno] == -1)
deprecated_child_ops.to_fetch_registers (regcache, regno); deprecated_child_ops.to_fetch_registers (&deprecated_child_ops,
regcache, regno);
else else
{ {
unsigned char buf[MAX_REGISTER_SIZE]; unsigned char buf[MAX_REGISTER_SIZE];
@ -305,7 +306,8 @@ hpux_thread_fetch_registers (struct regcache *regcache, int regno)
} }
static void static void
hpux_thread_store_registers (struct regcache *regcache, int regno) hpux_thread_store_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
cma__t_int_tcb tcb, *tcb_ptr; cma__t_int_tcb tcb, *tcb_ptr;
@ -321,7 +323,8 @@ hpux_thread_store_registers (struct regcache *regcache, int regno)
if (tcb_ptr->state == cma__c_state_running) if (tcb_ptr->state == cma__c_state_running)
{ {
deprecated_child_ops.to_store_registers (regcache, regno); deprecated_child_ops.to_store_registers (&deprecated_child_ops,
regcache, regno);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -351,7 +354,11 @@ hpux_thread_store_registers (struct regcache *regcache, int regno)
sp = (CORE_ADDR) tcb_ptr->static_ctx.sp - 160; sp = (CORE_ADDR) tcb_ptr->static_ctx.sp - 160;
if (regno == HPPA_FLAGS_REGNUM) if (regno == HPPA_FLAGS_REGNUM)
deprecated_child_ops.to_store_registers (regcache, regno); /* Let lower layer handle this... */ {
/* Let lower layer handle this... */
deprecated_child_ops.to_store_registers
(&deprecated_child_ops, regcache, regno);
}
else if (regno == HPPA_SP_REGNUM) else if (regno == HPPA_SP_REGNUM)
{ {
regcache_raw_collect (regcache, regno, buf); regcache_raw_collect (regcache, regno, buf);
@ -502,7 +509,7 @@ hpux_thread_can_run (void)
} }
static int static int
hpux_thread_alive (ptid_t ptid) hpux_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
return 1; return 1;
} }

View file

@ -43,7 +43,8 @@
If REGNO is -1, do this for all registers. If REGNO is -1, do this for all registers.
Otherwise, REGNO specifies which register (so we can save time). */ Otherwise, REGNO specifies which register (so we can save time). */
static void static void
i386_darwin_fetch_inferior_registers (struct regcache *regcache, int regno) i386_darwin_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
thread_t current_thread = ptid_get_tid (inferior_ptid); thread_t current_thread = ptid_get_tid (inferior_ptid);
int fetched = 0; int fetched = 0;
@ -144,7 +145,8 @@ i386_darwin_fetch_inferior_registers (struct regcache *regcache, int regno)
Otherwise, REGNO specifies which register (so we can save time). */ Otherwise, REGNO specifies which register (so we can save time). */
static void static void
i386_darwin_store_inferior_registers (struct regcache *regcache, int regno) i386_darwin_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
thread_t current_thread = ptid_get_tid (inferior_ptid); thread_t current_thread = ptid_get_tid (inferior_ptid);
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);

View file

@ -450,7 +450,8 @@ static int store_fpxregs (const struct regcache *regcache, int tid, int regno) {
registers). */ registers). */
static void static void
i386_linux_fetch_inferior_registers (struct regcache *regcache, int regno) i386_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int tid; int tid;
@ -522,7 +523,8 @@ i386_linux_fetch_inferior_registers (struct regcache *regcache, int regno)
do this for all registers (including the floating point and SSE do this for all registers (including the floating point and SSE
registers). */ registers). */
static void static void
i386_linux_store_inferior_registers (struct regcache *regcache, int regno) i386_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int tid; int tid;
@ -744,7 +746,8 @@ static const unsigned char linux_syscall[] = { 0xcd, 0x80 };
If SIGNAL is nonzero, give it that signal. */ If SIGNAL is nonzero, give it that signal. */
static void static void
i386_linux_resume (ptid_t ptid, int step, enum target_signal signal) i386_linux_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signal)
{ {
int pid = PIDGET (ptid); int pid = PIDGET (ptid);

View file

@ -139,6 +139,9 @@ i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* Solaris encodes the pid of the inferior in regset section /* Solaris encodes the pid of the inferior in regset section
names. */ names. */
set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
/* How to print LWP PTIDs from core files. */
set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str);
} }

View file

@ -130,7 +130,8 @@ i386bsd_collect_gregset (const struct regcache *regcache,
for all registers (including the floating point registers). */ for all registers (including the floating point registers). */
static void static void
i386bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) i386bsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1 || GETREGS_SUPPLIES (regnum)) if (regnum == -1 || GETREGS_SUPPLIES (regnum))
{ {
@ -180,7 +181,8 @@ i386bsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
this for all registers (including the floating point registers). */ this for all registers (including the floating point registers). */
static void static void
i386bsd_store_inferior_registers (struct regcache *regcache, int regnum) i386bsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1 || GETREGS_SUPPLIES (regnum)) if (regnum == -1 || GETREGS_SUPPLIES (regnum))
{ {

View file

@ -35,7 +35,8 @@
single-step it. If SIGNAL is nonzero, give it that signal. */ single-step it. If SIGNAL is nonzero, give it that signal. */
static void static void
i386fbsd_resume (ptid_t ptid, int step, enum target_signal signal) i386fbsd_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signal)
{ {
pid_t pid = ptid_get_pid (ptid); pid_t pid = ptid_get_pid (ptid);
int request = PT_STEP; int request = PT_STEP;

View file

@ -718,7 +718,8 @@ ia64_linux_fetch_register (struct regcache *regcache, int regnum)
for all registers. */ for all registers. */
static void static void
ia64_linux_fetch_registers (struct regcache *regcache, int regnum) ia64_linux_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
for (regnum = 0; for (regnum = 0;
@ -775,7 +776,8 @@ ia64_linux_store_register (const struct regcache *regcache, int regnum)
this for all registers. */ this for all registers. */
static void static void
ia64_linux_store_registers (struct regcache *regcache, int regnum) ia64_linux_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
for (regnum = 0; for (regnum = 0;

View file

@ -33,7 +33,8 @@
for all registers. */ for all registers. */
static void static void
inf_child_fetch_inferior_registers (struct regcache *regcache, int regnum) inf_child_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
{ {
@ -50,7 +51,8 @@ inf_child_fetch_inferior_registers (struct regcache *regcache, int regnum)
this for all registers (including the floating point registers). */ this for all registers (including the floating point registers). */
static void static void
inf_child_store_inferior_registers (struct regcache *regcache, int regnum) inf_child_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
} }

View file

@ -352,7 +352,8 @@ inf_ptrace_stop (ptid_t ptid)
that signal. */ that signal. */
static void static void
inf_ptrace_resume (ptid_t ptid, int step, enum target_signal signal) inf_ptrace_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signal)
{ {
pid_t pid = ptid_get_pid (ptid); pid_t pid = ptid_get_pid (ptid);
int request = PT_CONTINUE; int request = PT_CONTINUE;
@ -599,7 +600,7 @@ inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
/* Return non-zero if the thread specified by PTID is alive. */ /* Return non-zero if the thread specified by PTID is alive. */
static int static int
inf_ptrace_thread_alive (ptid_t ptid) inf_ptrace_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
/* ??? Is kill the right way to do this? */ /* ??? Is kill the right way to do this? */
return (kill (ptid_get_pid (ptid), 0) != -1); return (kill (ptid_get_pid (ptid), 0) != -1);
@ -706,7 +707,8 @@ inf_ptrace_fetch_register (struct regcache *regcache, int regnum)
for all registers. */ for all registers. */
static void static void
inf_ptrace_fetch_registers (struct regcache *regcache, int regnum) inf_ptrace_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
for (regnum = 0; for (regnum = 0;
@ -763,7 +765,8 @@ inf_ptrace_store_register (const struct regcache *regcache, int regnum)
this for all registers. */ this for all registers. */
static void static void
inf_ptrace_store_registers (struct regcache *regcache, int regnum) inf_ptrace_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
for (regnum = 0; for (regnum = 0;

View file

@ -39,8 +39,6 @@
#include "inf-child.h" #include "inf-child.h"
#include "inf-ttrace.h" #include "inf-ttrace.h"
/* HACK: Save the ttrace ops returned by inf_ttrace_target. */
static struct target_ops *ttrace_ops_hack;
/* HP-UX uses a threading model where each user-space thread /* HP-UX uses a threading model where each user-space thread
@ -618,7 +616,7 @@ inf_ttrace_me (void)
/* Start tracing PID. */ /* Start tracing PID. */
static void static void
inf_ttrace_him (int pid) inf_ttrace_him (struct target_ops *ops, int pid)
{ {
struct cleanup *old_chain = make_cleanup (do_cleanup_pfds, 0); struct cleanup *old_chain = make_cleanup (do_cleanup_pfds, 0);
ttevent_t tte; ttevent_t tte;
@ -646,7 +644,7 @@ inf_ttrace_him (int pid)
do_cleanups (old_chain); do_cleanups (old_chain);
push_target (ttrace_ops_hack); push_target (ops);
/* On some targets, there must be some explicit synchronization /* On some targets, there must be some explicit synchronization
between the parent and child processes after the debugger forks, between the parent and child processes after the debugger forks,
@ -669,14 +667,18 @@ static void
inf_ttrace_create_inferior (struct target_ops *ops, char *exec_file, inf_ttrace_create_inferior (struct target_ops *ops, char *exec_file,
char *allargs, char **env, int from_tty) char *allargs, char **env, int from_tty)
{ {
int pid;
gdb_assert (inf_ttrace_num_lwps == 0); gdb_assert (inf_ttrace_num_lwps == 0);
gdb_assert (inf_ttrace_num_lwps_in_syscall == 0); gdb_assert (inf_ttrace_num_lwps_in_syscall == 0);
gdb_assert (inf_ttrace_page_dict.count == 0); gdb_assert (inf_ttrace_page_dict.count == 0);
gdb_assert (inf_ttrace_reenable_page_protections == 0); gdb_assert (inf_ttrace_reenable_page_protections == 0);
gdb_assert (inf_ttrace_vfork_ppid == -1); gdb_assert (inf_ttrace_vfork_ppid == -1);
fork_inferior (exec_file, allargs, env, inf_ttrace_me, inf_ttrace_him, pid = fork_inferior (exec_file, allargs, env, inf_ttrace_me, NULL,
inf_ttrace_prepare, NULL); inf_ttrace_prepare, NULL);
inf_ttrace_him (ops, pid);
} }
static void static void
@ -703,7 +705,7 @@ inf_ttrace_mourn_inferior (struct target_ops *ops)
} }
inf_ttrace_page_dict.count = 0; inf_ttrace_page_dict.count = 0;
unpush_target (ttrace_ops_hack); unpush_target (ops);
generic_mourn_inferior (); generic_mourn_inferior ();
} }
@ -763,7 +765,7 @@ inf_ttrace_attach (struct target_ops *ops, char *args, int from_tty)
(uintptr_t)&tte, sizeof tte, 0) == -1) (uintptr_t)&tte, sizeof tte, 0) == -1)
perror_with_name (("ttrace")); perror_with_name (("ttrace"));
push_target (ttrace_ops_hack); push_target (ops);
/* We'll bump inf_ttrace_num_lwps up and add the private data to the /* We'll bump inf_ttrace_num_lwps up and add the private data to the
thread as soon as we get to inf_ttrace_wait. At this point, we thread as soon as we get to inf_ttrace_wait. At this point, we
@ -808,7 +810,7 @@ inf_ttrace_detach (struct target_ops *ops, char *args, int from_tty)
inferior_ptid = null_ptid; inferior_ptid = null_ptid;
detach_inferior (pid); detach_inferior (pid);
unpush_target (ttrace_ops_hack); unpush_target (ops);
} }
static void static void
@ -891,7 +893,8 @@ inf_ttrace_resume_callback (struct thread_info *info, void *arg)
} }
static void static void
inf_ttrace_resume (ptid_t ptid, int step, enum target_signal signal) inf_ttrace_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signal)
{ {
int resume_all; int resume_all;
ttreq_t request = step ? TT_LWP_SINGLE : TT_LWP_CONTINUE; ttreq_t request = step ? TT_LWP_SINGLE : TT_LWP_CONTINUE;
@ -1232,7 +1235,7 @@ inf_ttrace_files_info (struct target_ops *ignore)
} }
static int static int
inf_ttrace_thread_alive (ptid_t ptid) inf_ttrace_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
return 1; return 1;
} }
@ -1294,7 +1297,6 @@ inf_ttrace_target (void)
t->to_pid_to_str = inf_ttrace_pid_to_str; t->to_pid_to_str = inf_ttrace_pid_to_str;
t->to_xfer_partial = inf_ttrace_xfer_partial; t->to_xfer_partial = inf_ttrace_xfer_partial;
ttrace_ops_hack = t;
return t; return t;
} }
#endif #endif

View file

@ -990,7 +990,7 @@ static struct sigaction sigchld_default_action;
/* Prototypes for local functions. */ /* Prototypes for local functions. */
static int stop_wait_callback (struct lwp_info *lp, void *data); static int stop_wait_callback (struct lwp_info *lp, void *data);
static int linux_nat_thread_alive (ptid_t ptid); static int linux_thread_alive (ptid_t ptid);
static char *linux_child_pid_to_exec_file (int pid); static char *linux_child_pid_to_exec_file (int pid);
static int cancel_breakpoint (struct lwp_info *lp); static int cancel_breakpoint (struct lwp_info *lp);
@ -1664,7 +1664,8 @@ resume_callback (struct lwp_info *lp, void *data)
{ {
if (lp->stopped && lp->status == 0) if (lp->stopped && lp->status == 0)
{ {
linux_ops->to_resume (pid_to_ptid (GET_LWP (lp->ptid)), linux_ops->to_resume (linux_ops,
pid_to_ptid (GET_LWP (lp->ptid)),
0, TARGET_SIGNAL_0); 0, TARGET_SIGNAL_0);
if (debug_linux_nat) if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
@ -1699,7 +1700,8 @@ resume_set_callback (struct lwp_info *lp, void *data)
} }
static void static void
linux_nat_resume (ptid_t ptid, int step, enum target_signal signo) linux_nat_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signo)
{ {
struct lwp_info *lp; struct lwp_info *lp;
int resume_all; int resume_all;
@ -1810,7 +1812,7 @@ linux_nat_resume (ptid_t ptid, int step, enum target_signal signo)
if (resume_all) if (resume_all)
iterate_over_lwps (resume_callback, NULL); iterate_over_lwps (resume_callback, NULL);
linux_ops->to_resume (ptid, step, signo); linux_ops->to_resume (linux_ops, ptid, step, signo);
memset (&lp->siginfo, 0, sizeof (lp->siginfo)); memset (&lp->siginfo, 0, sizeof (lp->siginfo));
if (debug_linux_nat) if (debug_linux_nat)
@ -2655,7 +2657,7 @@ linux_nat_filter_event (int lwpid, int status, int options)
thread model, LWPs other than the main thread do not issue thread model, LWPs other than the main thread do not issue
signals when they exit so we must check whenever the thread has signals when they exit so we must check whenever the thread has
stopped. A similar check is made in stop_wait_callback(). */ stopped. A similar check is made in stop_wait_callback(). */
if (num_lwps > 1 && !linux_nat_thread_alive (lp->ptid)) if (num_lwps > 1 && !linux_thread_alive (lp->ptid))
{ {
if (debug_linux_nat) if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
@ -2686,7 +2688,7 @@ linux_nat_filter_event (int lwpid, int status, int options)
registers_changed (); registers_changed ();
linux_ops->to_resume (pid_to_ptid (GET_LWP (lp->ptid)), linux_ops->to_resume (linux_ops, pid_to_ptid (GET_LWP (lp->ptid)),
lp->step, TARGET_SIGNAL_0); lp->step, TARGET_SIGNAL_0);
if (debug_linux_nat) if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
@ -2716,7 +2718,7 @@ linux_nat_filter_event (int lwpid, int status, int options)
lp->ignore_sigint = 0; lp->ignore_sigint = 0;
registers_changed (); registers_changed ();
linux_ops->to_resume (pid_to_ptid (GET_LWP (lp->ptid)), linux_ops->to_resume (linux_ops, pid_to_ptid (GET_LWP (lp->ptid)),
lp->step, TARGET_SIGNAL_0); lp->step, TARGET_SIGNAL_0);
if (debug_linux_nat) if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
@ -2885,7 +2887,7 @@ retry:
/* Resume the thread. It should halt immediately returning the /* Resume the thread. It should halt immediately returning the
pending SIGSTOP. */ pending SIGSTOP. */
registers_changed (); registers_changed ();
linux_ops->to_resume (pid_to_ptid (GET_LWP (lp->ptid)), linux_ops->to_resume (linux_ops, pid_to_ptid (GET_LWP (lp->ptid)),
lp->step, TARGET_SIGNAL_0); lp->step, TARGET_SIGNAL_0);
if (debug_linux_nat) if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
@ -3006,7 +3008,7 @@ retry:
newly attached threads may cause an unwanted delay in newly attached threads may cause an unwanted delay in
getting them running. */ getting them running. */
registers_changed (); registers_changed ();
linux_ops->to_resume (pid_to_ptid (GET_LWP (lp->ptid)), linux_ops->to_resume (linux_ops, pid_to_ptid (GET_LWP (lp->ptid)),
lp->step, signo); lp->step, signo);
if (debug_linux_nat) if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog, fprintf_unfiltered (gdb_stdlog,
@ -3334,7 +3336,7 @@ linux_nat_xfer_partial (struct target_ops *ops, enum target_object object,
} }
static int static int
linux_nat_thread_alive (ptid_t ptid) linux_thread_alive (ptid_t ptid)
{ {
int err; int err;
@ -3357,6 +3359,12 @@ linux_nat_thread_alive (ptid_t ptid)
return 1; return 1;
} }
static int
linux_nat_thread_alive (struct target_ops *ops, ptid_t ptid)
{
return linux_thread_alive (ptid);
}
static char * static char *
linux_nat_pid_to_str (struct target_ops *ops, ptid_t ptid) linux_nat_pid_to_str (struct target_ops *ops, ptid_t ptid)
{ {

View file

@ -139,7 +139,7 @@ static CORE_ADDR td_create_bp_addr;
static CORE_ADDR td_death_bp_addr; static CORE_ADDR td_death_bp_addr;
/* Prototypes for local functions. */ /* Prototypes for local functions. */
static void thread_db_find_new_threads (void); static void thread_db_find_new_threads_1 (void);
static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p, static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
const td_thrinfo_t *ti_p); const td_thrinfo_t *ti_p);
static void detach_thread (ptid_t ptid); static void detach_thread (ptid_t ptid);
@ -281,7 +281,7 @@ thread_get_info_callback (const td_thrhandle_t *thp, void *infop)
{ {
/* New thread. Attach to it now (why wait?). */ /* New thread. Attach to it now (why wait?). */
if (!have_threads ()) if (!have_threads ())
thread_db_find_new_threads (); thread_db_find_new_threads_1 ();
else else
attach_thread (thread_ptid, thp, &ti); attach_thread (thread_ptid, thp, &ti);
thread_info = find_thread_pid (thread_ptid); thread_info = find_thread_pid (thread_ptid);
@ -358,7 +358,7 @@ thread_db_attach_lwp (ptid_t ptid)
initialized, we may not know its thread ID yet. Make sure we do initialized, we may not know its thread ID yet. Make sure we do
before we add another thread to the list. */ before we add another thread to the list. */
if (!have_threads ()) if (!have_threads ())
thread_db_find_new_threads (); thread_db_find_new_threads_1 ();
err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th); err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
if (err != TD_OK) if (err != TD_OK)
@ -655,7 +655,7 @@ check_for_thread_db (void)
using_thread_db = 1; using_thread_db = 1;
enable_thread_event_reporting (); enable_thread_event_reporting ();
thread_db_find_new_threads (); thread_db_find_new_threads_1 ();
break; break;
default: default:
@ -816,7 +816,7 @@ check_event (ptid_t ptid)
initialized, we may not know its thread ID yet. Make sure we do initialized, we may not know its thread ID yet. Make sure we do
before we add another thread to the list. */ before we add another thread to the list. */
if (!have_threads ()) if (!have_threads ())
thread_db_find_new_threads (); thread_db_find_new_threads_1 ();
/* If we are at a create breakpoint, we do not know what new lwp /* If we are at a create breakpoint, we do not know what new lwp
was created and cannot specifically locate the event message for it. was created and cannot specifically locate the event message for it.
@ -904,7 +904,7 @@ thread_db_wait (struct target_ops *ops,
/* If we do not know about the main thread yet, this would be a good time to /* If we do not know about the main thread yet, this would be a good time to
find it. */ find it. */
if (ourstatus->kind == TARGET_WAITKIND_STOPPED && !have_threads ()) if (ourstatus->kind == TARGET_WAITKIND_STOPPED && !have_threads ())
thread_db_find_new_threads (); thread_db_find_new_threads_1 ();
if (ourstatus->kind == TARGET_WAITKIND_STOPPED if (ourstatus->kind == TARGET_WAITKIND_STOPPED
&& ourstatus->value.sig == TARGET_SIGNAL_TRAP) && ourstatus->value.sig == TARGET_SIGNAL_TRAP)
@ -992,7 +992,7 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
PTID. */ PTID. */
static void static void
thread_db_find_new_threads (void) thread_db_find_new_threads_1 (void)
{ {
td_err_e err; td_err_e err;
struct lwp_info *lp; struct lwp_info *lp;
@ -1017,6 +1017,12 @@ thread_db_find_new_threads (void)
error (_("Cannot find new threads: %s"), thread_db_err_str (err)); error (_("Cannot find new threads: %s"), thread_db_err_str (err));
} }
static void
thread_db_find_new_threads (struct target_ops *ops)
{
thread_db_find_new_threads_1 ();
}
static char * static char *
thread_db_pid_to_str (struct target_ops *ops, ptid_t ptid) thread_db_pid_to_str (struct target_ops *ops, ptid_t ptid)
{ {
@ -1072,7 +1078,7 @@ thread_db_get_thread_local_address (struct target_ops *ops,
/* If we have not discovered any threads yet, check now. */ /* If we have not discovered any threads yet, check now. */
if (!have_threads ()) if (!have_threads ())
thread_db_find_new_threads (); thread_db_find_new_threads_1 ();
/* Find the matching thread. */ /* Find the matching thread. */
thread_info = find_thread_pid (ptid); thread_info = find_thread_pid (ptid);
@ -1147,7 +1153,7 @@ thread_db_get_ada_task_ptid (long lwp, long thread)
{ {
struct thread_info *thread_info; struct thread_info *thread_info;
thread_db_find_new_threads (); thread_db_find_new_threads_1 ();
thread_info = iterate_over_threads (thread_db_find_thread_from_tid, &thread); thread_info = iterate_over_threads (thread_db_find_thread_from_tid, &thread);
gdb_assert (thread_info != NULL); gdb_assert (thread_info != NULL);

View file

@ -194,7 +194,8 @@ fill_fpregset (const struct regcache *regcache,
registers). */ registers). */
static void static void
m32r_linux_fetch_inferior_registers (struct regcache *regcache, int regno) m32r_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int tid; int tid;
@ -220,7 +221,8 @@ m32r_linux_fetch_inferior_registers (struct regcache *regcache, int regno)
do this for all registers (including the floating point and SSE do this for all registers (including the floating point and SSE
registers). */ registers). */
static void static void
m32r_linux_store_inferior_registers (struct regcache *regcache, int regno) m32r_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int tid; int tid;

View file

@ -109,7 +109,8 @@ m68kbsd_collect_fpregset (struct regcache *regcache,
for all registers (including the floating-point registers). */ for all registers (including the floating-point registers). */
static void static void
m68kbsd_fetch_inferior_registers (struct regcache *regcache, int regnum) m68kbsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1 || m68kbsd_gregset_supplies_p (regnum)) if (regnum == -1 || m68kbsd_gregset_supplies_p (regnum))
{ {
@ -138,7 +139,8 @@ m68kbsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
this for all registers (including the floating-point registers). */ this for all registers (including the floating-point registers). */
static void static void
m68kbsd_store_inferior_registers (struct regcache *regcache, int regnum) m68kbsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1 || m68kbsd_gregset_supplies_p (regnum)) if (regnum == -1 || m68kbsd_gregset_supplies_p (regnum))
{ {

View file

@ -423,7 +423,8 @@ static void store_fpregs (const struct regcache *regcache, int tid, int regno) {
registers). */ registers). */
static void static void
m68k_linux_fetch_inferior_registers (struct regcache *regcache, int regno) m68k_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int tid; int tid;
@ -479,7 +480,8 @@ m68k_linux_fetch_inferior_registers (struct regcache *regcache, int regno)
do this for all registers (including the floating point and SSE do this for all registers (including the floating point and SSE
registers). */ registers). */
static void static void
m68k_linux_store_inferior_registers (struct regcache *regcache, int regno) m68k_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int tid; int tid;

View file

@ -63,7 +63,8 @@ m88kbsd_collect_gregset (const struct regcache *regcache,
for all registers. */ for all registers. */
static void static void
m88kbsd_fetch_inferior_registers (struct regcache *regcache, int regnum) m88kbsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct reg regs; struct reg regs;
@ -78,7 +79,8 @@ m88kbsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
this for all registers. */ this for all registers. */
static void static void
m88kbsd_store_inferior_registers (struct regcache *regcache, int regnum) m88kbsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct reg regs; struct reg regs;

View file

@ -47,8 +47,8 @@ static int have_ptrace_regsets = 1;
/* Saved function pointers to fetch and store a single register using /* Saved function pointers to fetch and store a single register using
PTRACE_PEEKUSER and PTRACE_POKEUSER. */ PTRACE_PEEKUSER and PTRACE_POKEUSER. */
void (*super_fetch_registers) (struct regcache *, int); void (*super_fetch_registers) (struct target_ops *, struct regcache *, int);
void (*super_store_registers) (struct regcache *, int); void (*super_store_registers) (struct target_ops *, struct regcache *, int);
/* Map gdb internal register number to ptrace ``address''. /* Map gdb internal register number to ptrace ``address''.
These ``addresses'' are normally defined in <asm/ptrace.h>. These ``addresses'' are normally defined in <asm/ptrace.h>.
@ -304,7 +304,8 @@ mips64_linux_regsets_store_registers (const struct regcache *regcache, int regno
using any working method. */ using any working method. */
static void static void
mips64_linux_fetch_registers (struct regcache *regcache, int regnum) mips64_linux_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
/* Unless we already know that PTRACE_GETREGS does not work, try it. */ /* Unless we already know that PTRACE_GETREGS does not work, try it. */
if (have_ptrace_regsets) if (have_ptrace_regsets)
@ -320,7 +321,8 @@ mips64_linux_fetch_registers (struct regcache *regcache, int regnum)
using any working method. */ using any working method. */
static void static void
mips64_linux_store_registers (struct regcache *regcache, int regnum) mips64_linux_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
/* Unless we already know that PTRACE_GETREGS does not work, try it. */ /* Unless we already know that PTRACE_GETREGS does not work, try it. */
if (have_ptrace_regsets) if (have_ptrace_regsets)

View file

@ -77,7 +77,8 @@ mips64obsd_collect_gregset (const struct regcache *regcache,
for all registers. */ for all registers. */
static void static void
mips64obsd_fetch_inferior_registers (struct regcache *regcache, int regnum) mips64obsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct reg regs; struct reg regs;
@ -92,7 +93,8 @@ mips64obsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
this for all registers. */ this for all registers. */
static void static void
mips64obsd_store_inferior_registers (struct regcache *regcache, int regnum) mips64obsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct reg regs; struct reg regs;

View file

@ -40,7 +40,8 @@ getregs_supplies (struct gdbarch *gdbarch, int regno)
} }
static void static void
mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno) mipsnbsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
if (regno == -1 || getregs_supplies (gdbarch, regno)) if (regno == -1 || getregs_supplies (gdbarch, regno))
@ -69,7 +70,8 @@ mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno)
} }
static void static void
mipsnbsd_store_inferior_registers (struct regcache *regcache, int regno) mipsnbsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
if (regno == -1 || getregs_supplies (gdbarch, regno)) if (regno == -1 || getregs_supplies (gdbarch, regno))

View file

@ -912,7 +912,8 @@ monitor_supply_register (struct regcache *regcache, int regno, char *valstr)
/* Tell the remote machine to resume. */ /* Tell the remote machine to resume. */
static void static void
monitor_resume (ptid_t ptid, int step, enum target_signal sig) monitor_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal sig)
{ {
/* Some monitors require a different command when starting a program */ /* Some monitors require a different command when starting a program */
monitor_debug ("MON resume\n"); monitor_debug ("MON resume\n");
@ -1286,7 +1287,8 @@ monitor_dump_regs (struct regcache *regcache)
} }
static void static void
monitor_fetch_registers (struct regcache *regcache, int regno) monitor_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
monitor_debug ("MON fetchregs\n"); monitor_debug ("MON fetchregs\n");
if (current_monitor->getreg.cmd) if (current_monitor->getreg.cmd)
@ -1368,7 +1370,8 @@ monitor_store_register (struct regcache *regcache, int regno)
/* Store the remote registers. */ /* Store the remote registers. */
static void static void
monitor_store_registers (struct regcache *regcache, int regno) monitor_store_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (regno >= 0) if (regno >= 0)
{ {
@ -2232,7 +2235,7 @@ monitor_get_dev_name (void)
/* Check to see if a thread is still alive. */ /* Check to see if a thread is still alive. */
static int static int
monitor_thread_alive (ptid_t ptid) monitor_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
if (ptid_equal (ptid, monitor_ptid)) if (ptid_equal (ptid, monitor_ptid))
/* The monitor's task is always alive. */ /* The monitor's task is always alive. */

View file

@ -63,8 +63,6 @@ static int procfs_xfer_memory (CORE_ADDR, gdb_byte *, int, int,
struct mem_attrib *attrib, struct mem_attrib *attrib,
struct target_ops *); struct target_ops *);
static void procfs_fetch_registers (struct regcache *, int);
static void notice_signals (void); static void notice_signals (void);
static void init_procfs_ops (void); static void init_procfs_ops (void);
@ -219,7 +217,7 @@ procfs_set_thread (ptid_t ptid)
/* Return nonzero if the thread TH is still alive. */ /* Return nonzero if the thread TH is still alive. */
static int static int
procfs_thread_alive (ptid_t ptid) procfs_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
pid_t tid; pid_t tid;
@ -230,7 +228,7 @@ procfs_thread_alive (ptid_t ptid)
} }
void void
procfs_find_new_threads (void) procfs_find_new_threads (struct target_ops *ops)
{ {
procfs_status status; procfs_status status;
pid_t pid; pid_t pid;
@ -547,9 +545,9 @@ procfs_attach (struct target_ops *ops, char *args, int from_tty)
inf = add_inferior (pid); inf = add_inferior (pid);
inf->attach_flag = 1; inf->attach_flag = 1;
push_target (&procfs_ops); push_target (ops);
procfs_find_new_threads (); procfs_find_new_threads (ops);
} }
static void static void
@ -727,7 +725,8 @@ procfs_wait (struct target_ops *ops,
general register set and floating point registers (if supported) general register set and floating point registers (if supported)
and update gdb's idea of their current values. */ and update gdb's idea of their current values. */
static void static void
procfs_fetch_registers (struct regcache *regcache, int regno) procfs_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
union union
{ {
@ -851,7 +850,8 @@ procfs_remove_hw_breakpoint (struct bp_target_info *bp_tgt)
} }
static void static void
procfs_resume (ptid_t ptid, int step, enum target_signal signo) procfs_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signo)
{ {
int signal_to_pass; int signal_to_pass;
procfs_status status; procfs_status status;
@ -1092,7 +1092,7 @@ procfs_create_inferior (struct target_ops *ops, char *exec_file,
close (fds[2]); close (fds[2]);
inferior_ptid = do_attach (pid_to_ptid (pid)); inferior_ptid = do_attach (pid_to_ptid (pid));
procfs_find_new_threads (); procfs_find_new_threads (ops);
inf = add_inferior (pid); inf = add_inferior (pid);
inf->attach_flag = 0; inf->attach_flag = 0;
@ -1105,7 +1105,7 @@ procfs_create_inferior (struct target_ops *ops, char *exec_file,
/* warning( "Failed to set Kill-on-Last-Close flag: errno = %d(%s)\n", /* warning( "Failed to set Kill-on-Last-Close flag: errno = %d(%s)\n",
errn, strerror(errn) ); */ errn, strerror(errn) ); */
} }
push_target (&procfs_ops); push_target (ops);
target_terminal_init (); target_terminal_init ();
if (exec_bfd != NULL if (exec_bfd != NULL
@ -1166,7 +1166,8 @@ get_regset (int regset, char *buf, int bufsize, int *regsize)
} }
void void
procfs_store_registers (struct regcache *regcache, int regno) procfs_store_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
union union
{ {

View file

@ -647,7 +647,8 @@ fetch_ppc_registers (struct regcache *regcache, int tid)
regno == -1, otherwise fetch all general registers or all floating regno == -1, otherwise fetch all general registers or all floating
point registers depending upon the value of regno. */ point registers depending upon the value of regno. */
static void static void
ppc_linux_fetch_inferior_registers (struct regcache *regcache, int regno) ppc_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
/* Overload thread id onto process id */ /* Overload thread id onto process id */
int tid = TIDGET (inferior_ptid); int tid = TIDGET (inferior_ptid);
@ -1179,7 +1180,8 @@ ppc_linux_watchpoint_addr_within_range (struct target_ops *target,
} }
static void static void
ppc_linux_store_inferior_registers (struct regcache *regcache, int regno) ppc_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
/* Overload thread id onto process id */ /* Overload thread id onto process id */
int tid = TIDGET (inferior_ptid); int tid = TIDGET (inferior_ptid);

View file

@ -79,7 +79,8 @@ getfpregs_supplies (struct gdbarch *gdbarch, int regnum)
} }
static void static void
ppcnbsd_fetch_inferior_registers (struct regcache *regcache, int regnum) ppcnbsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
@ -109,7 +110,8 @@ ppcnbsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
} }
static void static void
ppcnbsd_store_inferior_registers (struct regcache *regcache, int regnum) ppcnbsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);

View file

@ -73,7 +73,8 @@ getfpregs_supplies (struct gdbarch *gdbarch, int regnum)
for all registers. */ for all registers. */
static void static void
ppcobsd_fetch_registers (struct regcache *regcache, int regnum) ppcobsd_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct reg regs; struct reg regs;
@ -108,7 +109,8 @@ ppcobsd_fetch_registers (struct regcache *regcache, int regnum)
this for all registers. */ this for all registers. */
static void static void
ppcobsd_store_registers (struct regcache *regcache, int regnum) ppcobsd_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct reg regs; struct reg regs;

View file

@ -29,6 +29,7 @@
#include "gdbcmd.h" #include "gdbcmd.h"
#include "gdbthread.h" #include "gdbthread.h"
#include "regcache.h" #include "regcache.h"
#include "inf-child.h"
#if defined (NEW_PROC_API) #if defined (NEW_PROC_API)
#define _STRUCTURED_PROC 1 /* Should be done by configure script. */ #define _STRUCTURED_PROC 1 /* Should be done by configure script. */
@ -111,17 +112,17 @@
* This module defines the GDB target vector and its methods. * This module defines the GDB target vector and its methods.
*/ */
static void procfs_open (char *, int);
static void procfs_attach (struct target_ops *, char *, int); static void procfs_attach (struct target_ops *, char *, int);
static void procfs_detach (struct target_ops *, char *, int); static void procfs_detach (struct target_ops *, char *, int);
static void procfs_resume (ptid_t, int, enum target_signal); static void procfs_resume (struct target_ops *,
static int procfs_can_run (void); ptid_t, int, enum target_signal);
static void procfs_stop (ptid_t); static void procfs_stop (ptid_t);
static void procfs_files_info (struct target_ops *); static void procfs_files_info (struct target_ops *);
static void procfs_fetch_registers (struct regcache *, int); static void procfs_fetch_registers (struct target_ops *,
static void procfs_store_registers (struct regcache *, int); struct regcache *, int);
static void procfs_store_registers (struct target_ops *,
struct regcache *, int);
static void procfs_notice_signals (ptid_t); static void procfs_notice_signals (ptid_t);
static void procfs_prepare_to_store (struct regcache *);
static void procfs_kill_inferior (void); static void procfs_kill_inferior (void);
static void procfs_mourn_inferior (struct target_ops *ops); static void procfs_mourn_inferior (struct target_ops *ops);
static void procfs_create_inferior (struct target_ops *, char *, static void procfs_create_inferior (struct target_ops *, char *,
@ -137,9 +138,9 @@ static LONGEST procfs_xfer_partial (struct target_ops *ops,
gdb_byte *readbuf, const gdb_byte *writebuf, gdb_byte *readbuf, const gdb_byte *writebuf,
ULONGEST offset, LONGEST len); ULONGEST offset, LONGEST len);
static int procfs_thread_alive (ptid_t); static int procfs_thread_alive (struct target_ops *ops, ptid_t);
void procfs_find_new_threads (void); void procfs_find_new_threads (struct target_ops *ops);
char *procfs_pid_to_str (struct target_ops *, ptid_t); char *procfs_pid_to_str (struct target_ops *, ptid_t);
static int proc_find_memory_regions (int (*) (CORE_ADDR, static int proc_find_memory_regions (int (*) (CORE_ADDR,
@ -152,8 +153,6 @@ static char * procfs_make_note_section (bfd *, int *);
static int procfs_can_use_hw_breakpoint (int, int, int); static int procfs_can_use_hw_breakpoint (int, int, int);
struct target_ops procfs_ops; /* the target vector */
#if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
/* When GDB is built as 64-bit application on Solaris, the auxv data is /* When GDB is built as 64-bit application on Solaris, the auxv data is
presented in 64-bit format. We need to provide a custom parser to handle presented in 64-bit format. We need to provide a custom parser to handle
@ -182,60 +181,46 @@ procfs_auxv_parse (struct target_ops *ops, gdb_byte **readptr,
} }
#endif #endif
static void static struct target_ops *
init_procfs_ops (void) procfs_target (void)
{ {
procfs_ops.to_shortname = "procfs"; struct target_ops *t = inf_child_target ();
procfs_ops.to_longname = "Unix /proc child process";
procfs_ops.to_doc = t->to_shortname = "procfs";
t->to_longname = "Unix /proc child process";
t->to_doc =
"Unix /proc child process (started by the \"run\" command)."; "Unix /proc child process (started by the \"run\" command).";
procfs_ops.to_open = procfs_open; t->to_create_inferior = procfs_create_inferior;
procfs_ops.to_can_run = procfs_can_run; t->to_kill = procfs_kill_inferior;
procfs_ops.to_create_inferior = procfs_create_inferior; t->to_mourn_inferior = procfs_mourn_inferior;
procfs_ops.to_kill = procfs_kill_inferior; t->to_attach = procfs_attach;
procfs_ops.to_mourn_inferior = procfs_mourn_inferior; t->to_detach = procfs_detach;
procfs_ops.to_attach = procfs_attach; t->to_wait = procfs_wait;
procfs_ops.to_detach = procfs_detach; t->to_resume = procfs_resume;
procfs_ops.to_wait = procfs_wait; t->to_fetch_registers = procfs_fetch_registers;
procfs_ops.to_resume = procfs_resume; t->to_store_registers = procfs_store_registers;
procfs_ops.to_prepare_to_store = procfs_prepare_to_store; t->to_xfer_partial = procfs_xfer_partial;
procfs_ops.to_fetch_registers = procfs_fetch_registers; t->deprecated_xfer_memory = procfs_xfer_memory;
procfs_ops.to_store_registers = procfs_store_registers; t->to_notice_signals = procfs_notice_signals;
procfs_ops.to_xfer_partial = procfs_xfer_partial; t->to_files_info = procfs_files_info;
procfs_ops.deprecated_xfer_memory = procfs_xfer_memory; t->to_stop = procfs_stop;
procfs_ops.to_insert_breakpoint = memory_insert_breakpoint;
procfs_ops.to_remove_breakpoint = memory_remove_breakpoint;
procfs_ops.to_notice_signals = procfs_notice_signals;
procfs_ops.to_files_info = procfs_files_info;
procfs_ops.to_stop = procfs_stop;
procfs_ops.to_terminal_init = terminal_init_inferior; t->to_find_new_threads = procfs_find_new_threads;
procfs_ops.to_terminal_inferior = terminal_inferior; t->to_thread_alive = procfs_thread_alive;
procfs_ops.to_terminal_ours_for_output = terminal_ours_for_output; t->to_pid_to_str = procfs_pid_to_str;
procfs_ops.to_terminal_ours = terminal_ours;
procfs_ops.to_terminal_save_ours = terminal_save_ours;
procfs_ops.to_terminal_info = child_terminal_info;
procfs_ops.to_find_new_threads = procfs_find_new_threads; t->to_has_thread_control = tc_schedlock;
procfs_ops.to_thread_alive = procfs_thread_alive; t->to_find_memory_regions = proc_find_memory_regions;
procfs_ops.to_pid_to_str = procfs_pid_to_str; t->to_make_corefile_notes = procfs_make_note_section;
t->to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint;
procfs_ops.to_has_all_memory = 1;
procfs_ops.to_has_memory = 1;
procfs_ops.to_has_execution = 1;
procfs_ops.to_has_stack = 1;
procfs_ops.to_has_registers = 1;
procfs_ops.to_stratum = process_stratum;
procfs_ops.to_has_thread_control = tc_schedlock;
procfs_ops.to_find_memory_regions = proc_find_memory_regions;
procfs_ops.to_make_corefile_notes = procfs_make_note_section;
procfs_ops.to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint;
#if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) #if defined(PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
procfs_ops.to_auxv_parse = procfs_auxv_parse; t->to_auxv_parse = procfs_auxv_parse;
#endif #endif
procfs_ops.to_magic = OPS_MAGIC; t->to_magic = OPS_MAGIC;
return t;
} }
/* =================== END, TARGET_OPS "MODULE" =================== */ /* =================== END, TARGET_OPS "MODULE" =================== */
@ -3630,7 +3615,7 @@ procfs_attach (struct target_ops *ops, char *args, int from_tty)
fflush (stdout); fflush (stdout);
} }
inferior_ptid = do_attach (pid_to_ptid (pid)); inferior_ptid = do_attach (pid_to_ptid (pid));
push_target (&procfs_ops); push_target (ops);
} }
static void static void
@ -3659,7 +3644,7 @@ procfs_detach (struct target_ops *ops, char *args, int from_tty)
inferior_ptid = null_ptid; inferior_ptid = null_ptid;
detach_inferior (pid); detach_inferior (pid);
unpush_target (&procfs_ops); unpush_target (ops);
} }
static ptid_t static ptid_t
@ -3790,7 +3775,8 @@ do_detach (int signo)
when the process is resumed. */ when the process is resumed. */
static void static void
procfs_fetch_registers (struct regcache *regcache, int regnum) procfs_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
gdb_gregset_t *gregs; gdb_gregset_t *gregs;
procinfo *pi; procinfo *pi;
@ -3827,17 +3813,6 @@ procfs_fetch_registers (struct regcache *regcache, int regnum)
} }
} }
/* Get ready to modify the registers array. On machines which store
individual registers, this doesn't need to do anything. On
machines which store all the registers in one fell swoop, such as
/proc, this makes sure that registers contains all the registers
from the program being debugged. */
static void
procfs_prepare_to_store (struct regcache *regcache)
{
}
/* Store register REGNUM back into the inferior. If REGNUM is -1, do /* Store register REGNUM back into the inferior. If REGNUM is -1, do
this for all registers. this for all registers.
@ -3849,7 +3824,8 @@ procfs_prepare_to_store (struct regcache *regcache)
writing one register might affect the value of others, etc. */ writing one register might affect the value of others, etc. */
static void static void
procfs_store_registers (struct regcache *regcache, int regnum) procfs_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
gdb_gregset_t *gregs; gdb_gregset_t *gregs;
procinfo *pi; procinfo *pi;
@ -4564,7 +4540,8 @@ make_signal_thread_runnable (procinfo *process, procinfo *pi, void *ptr)
*/ */
static void static void
procfs_resume (ptid_t ptid, int step, enum target_signal signo) procfs_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signo)
{ {
procinfo *pi, *thread; procinfo *pi, *thread;
int native_signo; int native_signo;
@ -4700,44 +4677,6 @@ procfs_files_info (struct target_ops *ignore)
target_pid_to_str (inferior_ptid)); target_pid_to_str (inferior_ptid));
} }
/*
* Function: target_open
*
* A dummy: you don't open procfs.
*/
static void
procfs_open (char *args, int from_tty)
{
error (_("Use the \"run\" command to start a Unix child process."));
}
/*
* Function: target_can_run
*
* This tells GDB that this target vector can be invoked
* for "run" or "attach".
*/
int procfs_suppress_run = 0; /* Non-zero if procfs should pretend not to
be a runnable target. Used by targets
that can sit atop procfs, such as solaris
thread support. */
static int
procfs_can_run (void)
{
/* This variable is controlled by modules that sit atop procfs that
may layer their own process structure atop that provided here.
sol-thread.c does this because of the Solaris two-level thread
model. */
/* NOTE: possibly obsolete -- use the thread_stratum approach instead. */
return !procfs_suppress_run;
}
/* /*
* Function: target_stop * Function: target_stop
* *
@ -4856,7 +4795,7 @@ procfs_mourn_inferior (struct target_ops *ops)
if (pi) if (pi)
destroy_procinfo (pi); destroy_procinfo (pi);
} }
unpush_target (&procfs_ops); unpush_target (ops);
if (dbx_link_bpt != NULL) if (dbx_link_bpt != NULL)
{ {
@ -4878,7 +4817,7 @@ procfs_mourn_inferior (struct target_ops *ops)
*/ */
static void static void
procfs_init_inferior (int pid) procfs_init_inferior (struct target_ops *ops, int pid)
{ {
procinfo *pi; procinfo *pi;
gdb_sigset_t signals; gdb_sigset_t signals;
@ -4887,8 +4826,7 @@ procfs_init_inferior (int pid)
/* This routine called on the parent side (GDB side) /* This routine called on the parent side (GDB side)
after GDB forks the inferior. */ after GDB forks the inferior. */
push_target (ops);
push_target (&procfs_ops);
if ((pi = create_procinfo (pid, 0)) == NULL) if ((pi = create_procinfo (pid, 0)) == NULL)
perror ("procfs: out of memory in 'init_inferior'"); perror ("procfs: out of memory in 'init_inferior'");
@ -5119,6 +5057,8 @@ procfs_create_inferior (struct target_ops *ops, char *exec_file,
{ {
char *shell_file = getenv ("SHELL"); char *shell_file = getenv ("SHELL");
char *tryname; char *tryname;
int pid;
if (shell_file != NULL && strchr (shell_file, '/') == NULL) if (shell_file != NULL && strchr (shell_file, '/') == NULL)
{ {
@ -5187,8 +5127,10 @@ procfs_create_inferior (struct target_ops *ops, char *exec_file,
shell_file = tryname; shell_file = tryname;
} }
fork_inferior (exec_file, allargs, env, procfs_set_exec_trap, pid = fork_inferior (exec_file, allargs, env, procfs_set_exec_trap,
procfs_init_inferior, NULL, shell_file); NULL, NULL, shell_file);
procfs_init_inferior (ops, pid);
#ifdef SYS_syssgi #ifdef SYS_syssgi
/* Make sure to cancel the syssgi() syscall-exit notifications. /* Make sure to cancel the syssgi() syscall-exit notifications.
@ -5227,7 +5169,7 @@ procfs_notice_thread (procinfo *pi, procinfo *thread, void *ptr)
*/ */
void void
procfs_find_new_threads (void) procfs_find_new_threads (struct target_ops *ops)
{ {
procinfo *pi; procinfo *pi;
@ -5247,7 +5189,7 @@ procfs_find_new_threads (void)
*/ */
static int static int
procfs_thread_alive (ptid_t ptid) procfs_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
int proc, thread; int proc, thread;
procinfo *pi; procinfo *pi;
@ -6024,8 +5966,12 @@ proc_untrace_sysexit_cmd (char *args, int from_tty)
void void
_initialize_procfs (void) _initialize_procfs (void)
{ {
init_procfs_ops (); struct target_ops * t;
add_target (&procfs_ops);
t = procfs_target ();
add_target (t);
add_info ("proc", info_proc_cmd, _("\ add_info ("proc", info_proc_cmd, _("\
Show /proc process information about any running process.\n\ Show /proc process information about any running process.\n\
Specify process id, or use the program being debugged by default.\n\ Specify process id, or use the program being debugged by default.\n\

View file

@ -446,7 +446,8 @@ m32r_close (int quitting)
/* Tell the remote machine to resume. */ /* Tell the remote machine to resume. */
static void static void
m32r_resume (ptid_t ptid, int step, enum target_signal sig) m32r_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal sig)
{ {
unsigned long pc_addr, bp_addr, ab_addr; unsigned long pc_addr, bp_addr, ab_addr;
int ib_breakpoints; int ib_breakpoints;
@ -879,7 +880,7 @@ m32r_detach (struct target_ops *ops, char *args, int from_tty)
if (remote_debug) if (remote_debug)
fprintf_unfiltered (gdb_stdlog, "m32r_detach(%d)\n", from_tty); fprintf_unfiltered (gdb_stdlog, "m32r_detach(%d)\n", from_tty);
m32r_resume (inferior_ptid, 0, 0); m32r_resume (ops, inferior_ptid, 0, 0);
/* calls m32r_close to do the real work */ /* calls m32r_close to do the real work */
pop_target (); pop_target ();
@ -910,30 +911,21 @@ get_reg_id (int regno)
return regno; return regno;
} }
/* Read the remote registers into the block REGS. */
static void m32r_fetch_register (struct regcache *, int);
static void
m32r_fetch_registers (struct regcache *regcache)
{
int regno;
for (regno = 0;
regno < gdbarch_num_regs (get_regcache_arch (regcache));
regno++)
m32r_fetch_register (regcache, regno);
}
/* Fetch register REGNO, or all registers if REGNO is -1. /* Fetch register REGNO, or all registers if REGNO is -1.
Returns errno value. */ Returns errno value. */
static void static void
m32r_fetch_register (struct regcache *regcache, int regno) m32r_fetch_register (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
unsigned long val, val2, regid; unsigned long val, val2, regid;
if (regno == -1) if (regno == -1)
m32r_fetch_registers (regcache); {
for (regno = 0;
regno < gdbarch_num_regs (get_regcache_arch (regcache));
regno++)
m32r_fetch_register (ops, regcache, regno);
}
else else
{ {
char buffer[MAX_REGISTER_SIZE]; char buffer[MAX_REGISTER_SIZE];
@ -961,33 +953,22 @@ m32r_fetch_register (struct regcache *regcache, int regno)
return; return;
} }
/* Store the remote registers from the contents of the block REGS. */
static void m32r_store_register (struct regcache *, int);
static void
m32r_store_registers (struct regcache *regcache)
{
int regno;
for (regno = 0;
regno < gdbarch_num_regs (get_regcache_arch (regcache));
regno++)
m32r_store_register (regcache, regno);
registers_changed ();
}
/* Store register REGNO, or all if REGNO == 0. /* Store register REGNO, or all if REGNO == 0.
Return errno value. */ Return errno value. */
static void static void
m32r_store_register (struct regcache *regcache, int regno) m32r_store_register (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int regid; int regid;
ULONGEST regval, tmp; ULONGEST regval, tmp;
if (regno == -1) if (regno == -1)
m32r_store_registers (regcache); {
for (regno = 0;
regno < gdbarch_num_regs (get_regcache_arch (regcache));
regno++)
m32r_store_register (ops, regcache, regno);
}
else else
{ {
regcache_cooked_read_unsigned (regcache, regno, &regval); regcache_cooked_read_unsigned (regcache, regno, &regval);
@ -1495,7 +1476,7 @@ m32r_stopped_by_watchpoint (void)
/* Check to see if a thread is still alive. */ /* Check to see if a thread is still alive. */
static int static int
m32r_thread_alive (ptid_t ptid) m32r_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
if (ptid_equal (ptid, remote_m32r_ptid)) if (ptid_equal (ptid, remote_m32r_ptid))
/* The main task is always alive. */ /* The main task is always alive. */

View file

@ -86,17 +86,10 @@ static void mips_close (int quitting);
static void mips_detach (struct target_ops *ops, char *args, int from_tty); static void mips_detach (struct target_ops *ops, char *args, int from_tty);
static void mips_resume (ptid_t ptid, int step,
enum target_signal siggnal);
static int mips_map_regno (struct gdbarch *, int); static int mips_map_regno (struct gdbarch *, int);
static void mips_fetch_registers (struct regcache *regcache, int regno);
static void mips_prepare_to_store (struct regcache *regcache); static void mips_prepare_to_store (struct regcache *regcache);
static void mips_store_registers (struct regcache *regcache, int regno);
static unsigned int mips_fetch_word (CORE_ADDR addr); static unsigned int mips_fetch_word (CORE_ADDR addr);
static int mips_store_word (CORE_ADDR addr, unsigned int value, static int mips_store_word (CORE_ADDR addr, unsigned int value,
@ -1667,7 +1660,8 @@ mips_detach (struct target_ops *ops, char *args, int from_tty)
where PMON does return a reply. */ where PMON does return a reply. */
static void static void
mips_resume (ptid_t ptid, int step, enum target_signal siggnal) mips_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal siggnal)
{ {
int err; int err;
@ -1899,7 +1893,8 @@ mips_map_regno (struct gdbarch *gdbarch, int regno)
/* Fetch the remote registers. */ /* Fetch the remote registers. */
static void static void
mips_fetch_registers (struct regcache *regcache, int regno) mips_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
unsigned LONGEST val; unsigned LONGEST val;
@ -1908,7 +1903,7 @@ mips_fetch_registers (struct regcache *regcache, int regno)
if (regno == -1) if (regno == -1)
{ {
for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++) for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
mips_fetch_registers (regcache, regno); mips_fetch_registers (ops, regcache, regno);
return; return;
} }
@ -1962,7 +1957,8 @@ mips_prepare_to_store (struct regcache *regcache)
/* Store remote register(s). */ /* Store remote register(s). */
static void static void
mips_store_registers (struct regcache *regcache, int regno) mips_store_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
ULONGEST val; ULONGEST val;
@ -1971,7 +1967,7 @@ mips_store_registers (struct regcache *regcache, int regno)
if (regno == -1) if (regno == -1)
{ {
for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++) for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
mips_store_registers (regcache, regno); mips_store_registers (ops, regcache, regno);
return; return;
} }

View file

@ -72,10 +72,6 @@ static void gdb_os_evprintf_filtered (host_callback *, const char *, va_list);
static void gdb_os_error (host_callback *, const char *, ...) ATTR_NORETURN; static void gdb_os_error (host_callback *, const char *, ...) ATTR_NORETURN;
static void gdbsim_fetch_register (struct regcache *regcache, int regno);
static void gdbsim_store_register (struct regcache *regcache, int regno);
static void gdbsim_kill (void); static void gdbsim_kill (void);
static void gdbsim_load (char *prog, int fromtty); static void gdbsim_load (char *prog, int fromtty);
@ -277,13 +273,14 @@ one2one_register_sim_regno (struct gdbarch *gdbarch, int regnum)
} }
static void static void
gdbsim_fetch_register (struct regcache *regcache, int regno) gdbsim_fetch_register (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
if (regno == -1) if (regno == -1)
{ {
for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++) for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
gdbsim_fetch_register (regcache, regno); gdbsim_fetch_register (ops, regcache, regno);
return; return;
} }
@ -345,13 +342,14 @@ gdbsim_fetch_register (struct regcache *regcache, int regno)
static void static void
gdbsim_store_register (struct regcache *regcache, int regno) gdbsim_store_register (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
if (regno == -1) if (regno == -1)
{ {
for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++) for (regno = 0; regno < gdbarch_num_regs (gdbarch); regno++)
gdbsim_store_register (regcache, regno); gdbsim_store_register (ops, regcache, regno);
return; return;
} }
else if (gdbarch_register_sim_regno (gdbarch, regno) >= 0) else if (gdbarch_register_sim_regno (gdbarch, regno) >= 0)
@ -860,7 +858,7 @@ simulator_command (char *args, int from_tty)
/* Check to see if a thread is still alive. */ /* Check to see if a thread is still alive. */
static int static int
gdbsim_thread_alive (ptid_t ptid) gdbsim_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
if (ptid_equal (ptid, remote_sim_ptid)) if (ptid_equal (ptid, remote_sim_ptid))
/* The simulators' task is always alive. */ /* The simulators' task is always alive. */

View file

@ -91,10 +91,6 @@ static void remote_files_info (struct target_ops *ignore);
static void remote_prepare_to_store (struct regcache *regcache); static void remote_prepare_to_store (struct regcache *regcache);
static void remote_fetch_registers (struct regcache *regcache, int regno);
static void remote_resume (ptid_t ptid, int step,
enum target_signal siggnal);
static void remote_open (char *name, int from_tty); static void remote_open (char *name, int from_tty);
static void extended_remote_open (char *name, int from_tty); static void extended_remote_open (char *name, int from_tty);
@ -103,8 +99,6 @@ static void remote_open_1 (char *, int, struct target_ops *, int extended_p);
static void remote_close (int quitting); static void remote_close (int quitting);
static void remote_store_registers (struct regcache *regcache, int regno);
static void remote_mourn (struct target_ops *ops); static void remote_mourn (struct target_ops *ops);
static void extended_remote_restart (void); static void extended_remote_restart (void);
@ -141,8 +135,6 @@ static void interrupt_query (void);
static void set_general_thread (struct ptid ptid); static void set_general_thread (struct ptid ptid);
static void set_continue_thread (struct ptid ptid); static void set_continue_thread (struct ptid ptid);
static int remote_thread_alive (ptid_t);
static void get_offsets (void); static void get_offsets (void);
static void skip_frame (void); static void skip_frame (void);
@ -1327,7 +1319,7 @@ set_general_process (void)
system. */ system. */
static int static int
remote_thread_alive (ptid_t ptid) remote_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
struct remote_state *rs = get_remote_state (); struct remote_state *rs = get_remote_state ();
int tid = ptid_get_tid (ptid); int tid = ptid_get_tid (ptid);
@ -2133,7 +2125,7 @@ remote_find_new_threads (void)
*/ */
static void static void
remote_threads_info (void) remote_threads_info (struct target_ops *ops)
{ {
struct remote_state *rs = get_remote_state (); struct remote_state *rs = get_remote_state ();
char *bufp; char *bufp;
@ -2580,7 +2572,7 @@ remote_start_remote (struct ui_out *uiout, void *opaque)
controlling. We default to adding them in the running state. controlling. We default to adding them in the running state.
The '?' query below will then tell us about which threads are The '?' query below will then tell us about which threads are
stopped. */ stopped. */
remote_threads_info (); remote_threads_info (args->target);
} }
else if (rs->non_stop_aware) else if (rs->non_stop_aware)
{ {
@ -3413,7 +3405,7 @@ extended_remote_attach_1 (struct target_ops *target, char *args, int from_tty)
if (non_stop) if (non_stop)
/* Get list of threads. */ /* Get list of threads. */
remote_threads_info (); remote_threads_info (target);
else else
/* Add the main thread to the thread list. */ /* Add the main thread to the thread list. */
add_thread_silent (inferior_ptid); add_thread_silent (inferior_ptid);
@ -3696,7 +3688,8 @@ static enum target_signal last_sent_signal = TARGET_SIGNAL_0;
static int last_sent_step; static int last_sent_step;
static void static void
remote_resume (ptid_t ptid, int step, enum target_signal siggnal) remote_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal siggnal)
{ {
struct remote_state *rs = get_remote_state (); struct remote_state *rs = get_remote_state ();
char *buf; char *buf;
@ -4960,7 +4953,8 @@ fetch_registers_using_g (struct regcache *regcache)
} }
static void static void
remote_fetch_registers (struct regcache *regcache, int regnum) remote_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct remote_state *rs = get_remote_state (); struct remote_state *rs = get_remote_state ();
struct remote_arch_state *rsa = get_remote_arch_state (); struct remote_arch_state *rsa = get_remote_arch_state ();
@ -5109,7 +5103,8 @@ store_registers_using_G (const struct regcache *regcache)
of the register cache buffer. FIXME: ignores errors. */ of the register cache buffer. FIXME: ignores errors. */
static void static void
remote_store_registers (struct regcache *regcache, int regnum) remote_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct remote_state *rs = get_remote_state (); struct remote_state *rs = get_remote_state ();
struct remote_arch_state *rsa = get_remote_arch_state (); struct remote_arch_state *rsa = get_remote_arch_state ();

View file

@ -334,7 +334,8 @@ store_register (const struct regcache *regcache, int regno)
REGNO otherwise. */ REGNO otherwise. */
static void static void
rs6000_fetch_inferior_registers (struct regcache *regcache, int regno) rs6000_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
if (regno != -1) if (regno != -1)
@ -376,7 +377,8 @@ rs6000_fetch_inferior_registers (struct regcache *regcache, int regno)
Otherwise, REGNO specifies which register (so we can save time). */ Otherwise, REGNO specifies which register (so we can save time). */
static void static void
rs6000_store_inferior_registers (struct regcache *regcache, int regno) rs6000_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch *gdbarch = get_regcache_arch (regcache);
if (regno != -1) if (regno != -1)

View file

@ -204,7 +204,8 @@ store_fpregs (const struct regcache *regcache, int tid, int regnum)
/* Fetch register REGNUM from the child process. If REGNUM is -1, do /* Fetch register REGNUM from the child process. If REGNUM is -1, do
this for all registers. */ this for all registers. */
static void static void
s390_linux_fetch_inferior_registers (struct regcache *regcache, int regnum) s390_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
int tid = s390_inferior_tid (); int tid = s390_inferior_tid ();
@ -220,7 +221,8 @@ s390_linux_fetch_inferior_registers (struct regcache *regcache, int regnum)
/* Store register REGNUM back into the child process. If REGNUM is /* Store register REGNUM back into the child process. If REGNUM is
-1, do this for all registers. */ -1, do this for all registers. */
static void static void
s390_linux_store_inferior_registers (struct regcache *regcache, int regnum) s390_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
int tid = s390_inferior_tid (); int tid = s390_inferior_tid ();

View file

@ -41,7 +41,8 @@
|| (regno) == SR_REGNUM) || (regno) == SR_REGNUM)
static void static void
shnbsd_fetch_inferior_registers (struct regcache *regcache, int regno) shnbsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (regno == -1 || GETREGS_SUPPLIES (get_regcache_arch (regcache), regno)) if (regno == -1 || GETREGS_SUPPLIES (get_regcache_arch (regcache), regno))
{ {
@ -59,7 +60,8 @@ shnbsd_fetch_inferior_registers (struct regcache *regcache, int regno)
} }
static void static void
shnbsd_store_inferior_registers (struct regcache *regcache, int regno) shnbsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
if (regno == -1 || GETREGS_SUPPLIES (get_regcache_arch (regcache), regno)) if (regno == -1 || GETREGS_SUPPLIES (get_regcache_arch (regcache), regno))
{ {

View file

@ -68,18 +68,8 @@
#include "gdb_string.h" #include "gdb_string.h"
extern struct target_ops sol_thread_ops; /* Forward declaration */
extern struct target_ops sol_core_ops; /* Forward declaration */
/* place to store core_ops before we overwrite it */
static struct target_ops orig_core_ops;
struct target_ops sol_thread_ops; struct target_ops sol_thread_ops;
struct target_ops sol_core_ops;
extern int procfs_suppress_run;
extern struct target_ops procfs_ops; /* target vector for procfs.c */
extern struct target_ops core_ops; /* target vector for corelow.c */
extern char *procfs_pid_to_str (struct target_ops *ops, ptid_t ptid); extern char *procfs_pid_to_str (struct target_ops *ops, ptid_t ptid);
/* Prototypes for supply_gregset etc. */ /* Prototypes for supply_gregset etc. */
@ -104,12 +94,7 @@ static struct ps_prochandle main_ph;
static td_thragent_t *main_ta; static td_thragent_t *main_ta;
static int sol_thread_active = 0; static int sol_thread_active = 0;
static void sol_thread_resume (ptid_t ptid, int step, enum target_signal signo);
static int sol_thread_alive (ptid_t ptid);
static void sol_core_close (int quitting);
static void init_sol_thread_ops (void); static void init_sol_thread_ops (void);
static void init_sol_core_ops (void);
/* Default definitions: These must be defined in tm.h if they are to /* Default definitions: These must be defined in tm.h if they are to
be shared with a process module such as procfs. */ be shared with a process module such as procfs. */
@ -309,7 +294,7 @@ lwp_to_thread (ptid_t lwp)
/* It's an LWP. Convert it to a thread ID. */ /* It's an LWP. Convert it to a thread ID. */
if (!sol_thread_alive (lwp)) if (!target_thread_alive (lwp))
return pid_to_ptid (-1); /* Must be a defunct LPW. */ return pid_to_ptid (-1); /* Must be a defunct LPW. */
val = p_td_ta_map_lwp2thr (main_ta, GET_LWP (lwp), &th); val = p_td_ta_map_lwp2thr (main_ta, GET_LWP (lwp), &th);
@ -335,41 +320,8 @@ lwp_to_thread (ptid_t lwp)
/* Most target vector functions from here on actually just pass /* Most target vector functions from here on actually just pass
through to procfs.c, as they don't need to do anything specific for through to the layer beneath, as they don't need to do anything
threads. */ specific for threads. */
static void
sol_thread_open (char *arg, int from_tty)
{
procfs_ops.to_open (arg, from_tty);
}
/* Attach to process PID, then initialize for debugging it and wait
for the trace-trap that results from attaching. */
static void
sol_thread_attach (struct target_ops *ops, char *args, int from_tty)
{
sol_thread_active = 0;
procfs_ops.to_attach (&procfs_ops, args, from_tty);
/* Must get symbols from shared libraries before libthread_db can run! */
solib_add (NULL, from_tty, (struct target_ops *) 0, auto_solib_add);
if (sol_thread_active)
{
ptid_t ptid;
printf_filtered ("sol-thread active.\n");
main_ph.ptid = inferior_ptid; /* Save for xfer_memory. */
push_target (&sol_thread_ops);
ptid = lwp_to_thread (inferior_ptid);
if (PIDGET (ptid) != -1)
thread_change_ptid (inferior_ptid, ptid);
}
/* FIXME: Might want to iterate over all the threads and register
them. */
}
/* Take a program previously attached to and detaches it. The program /* Take a program previously attached to and detaches it. The program
resumes execution and will no longer stop on signals, etc. We'd resumes execution and will no longer stop on signals, etc. We'd
@ -381,10 +333,12 @@ sol_thread_attach (struct target_ops *ops, char *args, int from_tty)
static void static void
sol_thread_detach (struct target_ops *ops, char *args, int from_tty) sol_thread_detach (struct target_ops *ops, char *args, int from_tty)
{ {
struct target_ops *beneath = find_target_beneath (ops);
sol_thread_active = 0; sol_thread_active = 0;
inferior_ptid = pid_to_ptid (PIDGET (main_ph.ptid)); inferior_ptid = pid_to_ptid (PIDGET (main_ph.ptid));
unpush_target (&sol_thread_ops); unpush_target (ops);
procfs_ops.to_detach (&procfs_ops, args, from_tty); beneath->to_detach (beneath, args, from_tty);
} }
/* Resume execution of process PTID. If STEP is nozero, then just /* Resume execution of process PTID. If STEP is nozero, then just
@ -393,9 +347,11 @@ sol_thread_detach (struct target_ops *ops, char *args, int from_tty)
ID for procfs. */ ID for procfs. */
static void static void
sol_thread_resume (ptid_t ptid, int step, enum target_signal signo) sol_thread_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal signo)
{ {
struct cleanup *old_chain; struct cleanup *old_chain;
struct target_ops *beneath = find_target_beneath (ops);
old_chain = save_inferior_ptid (); old_chain = save_inferior_ptid ();
@ -415,7 +371,7 @@ sol_thread_resume (ptid_t ptid, int step, enum target_signal signo)
GET_THREAD (save_ptid)); GET_THREAD (save_ptid));
} }
procfs_ops.to_resume (ptid, step, signo); beneath->to_resume (beneath, ptid, step, signo);
do_cleanups (old_chain); do_cleanups (old_chain);
} }
@ -429,6 +385,7 @@ sol_thread_wait (struct target_ops *ops,
{ {
ptid_t rtnval; ptid_t rtnval;
ptid_t save_ptid; ptid_t save_ptid;
struct target_ops *beneath = find_target_beneath (ops);
struct cleanup *old_chain; struct cleanup *old_chain;
save_ptid = inferior_ptid; save_ptid = inferior_ptid;
@ -450,7 +407,7 @@ sol_thread_wait (struct target_ops *ops,
GET_THREAD (save_ptid)); GET_THREAD (save_ptid));
} }
rtnval = procfs_ops.to_wait (&procfs_ops, ptid, ourstatus); rtnval = beneath->to_wait (beneath, ptid, ourstatus);
if (ourstatus->kind != TARGET_WAITKIND_EXITED) if (ourstatus->kind != TARGET_WAITKIND_EXITED)
{ {
@ -477,7 +434,8 @@ sol_thread_wait (struct target_ops *ops,
} }
static void static void
sol_thread_fetch_registers (struct regcache *regcache, int regnum) sol_thread_fetch_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
thread_t thread; thread_t thread;
td_thrhandle_t thandle; td_thrhandle_t thandle;
@ -486,6 +444,7 @@ sol_thread_fetch_registers (struct regcache *regcache, int regnum)
prfpregset_t fpregset; prfpregset_t fpregset;
gdb_gregset_t *gregset_p = &gregset; gdb_gregset_t *gregset_p = &gregset;
gdb_fpregset_t *fpregset_p = &fpregset; gdb_fpregset_t *fpregset_p = &fpregset;
struct target_ops *beneath = find_target_beneath (ops);
#if 0 #if 0
int xregsize; int xregsize;
@ -494,11 +453,8 @@ sol_thread_fetch_registers (struct regcache *regcache, int regnum)
if (!is_thread (inferior_ptid)) if (!is_thread (inferior_ptid))
{ {
/* It's an LWP; pass the request on to procfs. */ /* It's an LWP; pass the request on to the layer beneath. */
if (target_has_execution) beneath->to_fetch_registers (beneath, regcache, regnum);
procfs_ops.to_fetch_registers (regcache, regnum);
else
orig_core_ops.to_fetch_registers (regcache, regnum);
return; return;
} }
@ -555,7 +511,8 @@ sol_thread_fetch_registers (struct regcache *regcache, int regnum)
} }
static void static void
sol_thread_store_registers (struct regcache *regcache, int regnum) sol_thread_store_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
thread_t thread; thread_t thread;
td_thrhandle_t thandle; td_thrhandle_t thandle;
@ -569,8 +526,10 @@ sol_thread_store_registers (struct regcache *regcache, int regnum)
if (!is_thread (inferior_ptid)) if (!is_thread (inferior_ptid))
{ {
/* It's an LWP; pass the request on to procfs.c. */ struct target_ops *beneath = find_target_beneath (ops);
procfs_ops.to_store_registers (regcache, regnum);
/* It's an LWP; pass the request on to the layer beneath. */
beneath->to_store_registers (beneath, regcache, regnum);
return; return;
} }
@ -644,56 +603,6 @@ sol_thread_store_registers (struct regcache *regcache, int regnum)
#endif #endif
} }
/* Get ready to modify the registers array. On machines which store
individual registers, this doesn't need to do anything. On
machines which store all the registers in one fell swoop, this
makes sure that registers contains all the registers from the
program being debugged. */
static void
sol_thread_prepare_to_store (struct regcache *regcache)
{
procfs_ops.to_prepare_to_store (regcache);
}
/* Transfer LEN bytes between GDB address MYADDR and target address
MEMADDR. If DOWRITE is non-zero, transfer them to the target,
otherwise transfer them from the target. TARGET is unused.
Returns the number of bytes transferred. */
static int
sol_thread_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len,
int dowrite, struct mem_attrib *attrib,
struct target_ops *target)
{
int retval;
struct cleanup *old_chain;
old_chain = save_inferior_ptid ();
if (is_thread (inferior_ptid) || !target_thread_alive (inferior_ptid))
{
/* It's either a thread or an LWP that isn't alive. Any live
LWP will do so use the first available.
NOTE: We don't need to call switch_to_thread; we're just
reading memory. */
inferior_ptid = procfs_first_available ();
}
if (target_has_execution)
retval = procfs_ops.deprecated_xfer_memory (memaddr, myaddr, len,
dowrite, attrib, target);
else
retval = orig_core_ops.deprecated_xfer_memory (memaddr, myaddr, len,
dowrite, attrib, target);
do_cleanups (old_chain);
return retval;
}
/* Perform partial transfers on OBJECT. See target_read_partial and /* Perform partial transfers on OBJECT. See target_read_partial and
target_write_partial for details of each variant. One, and only target_write_partial for details of each variant. One, and only
one, of readbuf or writebuf must be non-NULL. */ one, of readbuf or writebuf must be non-NULL. */
@ -706,6 +615,7 @@ sol_thread_xfer_partial (struct target_ops *ops, enum target_object object,
{ {
int retval; int retval;
struct cleanup *old_chain; struct cleanup *old_chain;
struct target_ops *beneath = find_target_beneath (ops);
old_chain = save_inferior_ptid (); old_chain = save_inferior_ptid ();
@ -719,59 +629,67 @@ sol_thread_xfer_partial (struct target_ops *ops, enum target_object object,
inferior_ptid = procfs_first_available (); inferior_ptid = procfs_first_available ();
} }
if (target_has_execution) retval = beneath->to_xfer_partial (beneath, object, annex,
retval = procfs_ops.to_xfer_partial (ops, object, annex, readbuf, writebuf, offset, len);
readbuf, writebuf, offset, len);
else
retval = orig_core_ops.to_xfer_partial (ops, object, annex,
readbuf, writebuf, offset, len);
do_cleanups (old_chain); do_cleanups (old_chain);
return retval; return retval;
} }
/* Print status information about what we're accessing. */
static void static void
sol_thread_files_info (struct target_ops *ignore) check_for_thread_db (void)
{ {
procfs_ops.to_files_info (ignore); td_err_e err;
} ptid_t ptid;
static void /* Do nothing if we couldn't load libthread_db.so.1. */
sol_thread_kill_inferior (void) if (p_td_ta_new == NULL)
{ return;
procfs_ops.to_kill ();
}
static void if (sol_thread_active)
sol_thread_notice_signals (ptid_t ptid) /* Nothing to do. The thread library was already detected and the
{ target vector was already activated. */
procfs_ops.to_notice_signals (pid_to_ptid (PIDGET (ptid))); return;
}
/* Fork an inferior process, and start debugging it with /proc. */ /* Now, initialize libthread_db. This needs to be done after the
shared libraries are located because it needs information from
the user's thread library. */
static void err = p_td_init ();
sol_thread_create_inferior (struct target_ops *ops, char *exec_file, if (err != TD_OK)
char *allargs, char **env, int from_tty)
{
sol_thread_active = 0;
procfs_ops.to_create_inferior (&procfs_ops, exec_file, allargs, env, from_tty);
if (sol_thread_active && !ptid_equal (inferior_ptid, null_ptid))
{ {
ptid_t ptid; warning (_("sol_thread_new_objfile: td_init: %s"), td_err_string (err));
return;
}
/* Save for xfer_memory. */ /* Now attempt to open a connection to the thread library. */
main_ph.ptid = inferior_ptid; err = p_td_ta_new (&main_ph, &main_ta);
switch (err)
{
case TD_NOLIBTHREAD:
/* No thread library was detected. */
break;
case TD_OK:
printf_unfiltered (_("[Thread debugging using libthread_db enabled]\n"));
/* The thread library was detected. Activate the sol_thread target. */
push_target (&sol_thread_ops); push_target (&sol_thread_ops);
sol_thread_active = 1;
main_ph.ptid = inferior_ptid; /* Save for xfer_memory. */
ptid = lwp_to_thread (inferior_ptid); ptid = lwp_to_thread (inferior_ptid);
if (PIDGET (ptid) != -1) if (PIDGET (ptid) != -1)
thread_change_ptid (inferior_ptid, ptid); inferior_ptid = ptid;
target_find_new_threads ();
break;
default:
warning (_("Cannot initialize thread debugging library: %s"),
td_err_string (err));
break;
} }
} }
@ -784,40 +702,8 @@ sol_thread_create_inferior (struct target_ops *ops, char *exec_file,
static void static void
sol_thread_new_objfile (struct objfile *objfile) sol_thread_new_objfile (struct objfile *objfile)
{ {
td_err_e val; if (objfile != NULL)
check_for_thread_db ();
if (!objfile)
{
sol_thread_active = 0;
return;
}
/* Don't do anything if init failed to resolve the libthread_db
library. */
if (!procfs_suppress_run)
return;
/* Now, initialize libthread_db. This needs to be done after the
shared libraries are located because it needs information from
the user's thread library. */
val = p_td_init ();
if (val != TD_OK)
{
warning (_("sol_thread_new_objfile: td_init: %s"), td_err_string (val));
return;
}
val = p_td_ta_new (&main_ph, &main_ta);
if (val == TD_NOLIBTHREAD)
return;
else if (val != TD_OK)
{
warning (_("sol_thread_new_objfile: td_ta_new: %s"), td_err_string (val));
return;
}
sol_thread_active = 1;
} }
/* Clean up after the inferior dies. */ /* Clean up after the inferior dies. */
@ -825,40 +711,19 @@ sol_thread_new_objfile (struct objfile *objfile)
static void static void
sol_thread_mourn_inferior (struct target_ops *ops) sol_thread_mourn_inferior (struct target_ops *ops)
{ {
struct target_ops *beneath = find_target_beneath (ops);
sol_thread_active = 0; sol_thread_active = 0;
unpush_target (&sol_thread_ops);
procfs_ops.to_mourn_inferior (&procfs_ops); unpush_target (ops);
beneath->to_mourn_inferior (beneath);
} }
/* Mark our target-struct as eligible for stray "run" and "attach"
commands. */
static int
sol_thread_can_run (void)
{
return procfs_suppress_run;
}
/*
LOCAL FUNCTION
sol_thread_alive - test thread for "aliveness"
SYNOPSIS
static bool sol_thread_alive (ptid_t ptid);
DESCRIPTION
returns true if thread still active in inferior.
*/
/* Return true if PTID is still active in the inferior. */ /* Return true if PTID is still active in the inferior. */
static int static int
sol_thread_alive (ptid_t ptid) sol_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
if (is_thread (ptid)) if (is_thread (ptid))
{ {
@ -876,19 +741,13 @@ sol_thread_alive (ptid_t ptid)
} }
else else
{ {
/* It's an LPW; pass the request on to procfs. */ struct target_ops *beneath = find_target_beneath (ops);
if (target_has_execution)
return procfs_ops.to_thread_alive (ptid); /* It's an LPW; pass the request on to the layer below. */
else return beneath->to_thread_alive (beneath, ptid);
return orig_core_ops.to_thread_alive (ptid);
} }
} }
static void
sol_thread_stop (ptid_t ptid)
{
procfs_ops.to_stop (ptid);
}
/* These routines implement the lower half of the thread_db interface, /* These routines implement the lower half of the thread_db interface,
i.e. the ps_* routines. */ i.e. the ps_* routines. */
@ -980,6 +839,7 @@ static ps_err_e
rw_common (int dowrite, const struct ps_prochandle *ph, gdb_ps_addr_t addr, rw_common (int dowrite, const struct ps_prochandle *ph, gdb_ps_addr_t addr,
char *buf, int size) char *buf, int size)
{ {
int ret;
struct cleanup *old_chain; struct cleanup *old_chain;
old_chain = save_inferior_ptid (); old_chain = save_inferior_ptid ();
@ -1001,50 +861,14 @@ rw_common (int dowrite, const struct ps_prochandle *ph, gdb_ps_addr_t addr,
addr &= 0xffffffff; addr &= 0xffffffff;
#endif #endif
while (size > 0) if (dowrite)
{ ret = target_write_memory (addr, buf, size);
int cc; else
ret = target_read_memory (addr, buf, size);
/* FIXME: passing 0 as attrib argument. */
if (target_has_execution)
cc = procfs_ops.deprecated_xfer_memory (addr, buf, size,
dowrite, 0, &procfs_ops);
else
cc = orig_core_ops.deprecated_xfer_memory (addr, buf, size,
dowrite, 0, &core_ops);
if (cc < 0)
{
if (dowrite == 0)
print_sys_errmsg ("rw_common (): read", errno);
else
print_sys_errmsg ("rw_common (): write", errno);
do_cleanups (old_chain);
return PS_ERR;
}
else if (cc == 0)
{
if (dowrite == 0)
warning (_("rw_common (): unable to read at addr 0x%lx"),
(long) addr);
else
warning (_("rw_common (): unable to write at addr 0x%lx"),
(long) addr);
do_cleanups (old_chain);
return PS_ERR;
}
size -= cc;
buf += cc;
}
do_cleanups (old_chain); do_cleanups (old_chain);
return PS_OK; return (ret == 0 ? PS_OK : PS_ERR);
} }
/* Copies SIZE bytes from target process .data segment to debugger memory. */ /* Copies SIZE bytes from target process .data segment to debugger memory. */
@ -1096,10 +920,7 @@ ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset)
inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid)); inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid));
regcache = get_thread_regcache (inferior_ptid); regcache = get_thread_regcache (inferior_ptid);
if (target_has_execution) target_fetch_registers (regcache, -1);
procfs_ops.to_fetch_registers (regcache, -1);
else
orig_core_ops.to_fetch_registers (regcache, -1);
fill_gregset (regcache, (gdb_gregset_t *) gregset, -1); fill_gregset (regcache, (gdb_gregset_t *) gregset, -1);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -1122,10 +943,7 @@ ps_lsetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid,
regcache = get_thread_regcache (inferior_ptid); regcache = get_thread_regcache (inferior_ptid);
supply_gregset (regcache, (const gdb_gregset_t *) gregset); supply_gregset (regcache, (const gdb_gregset_t *) gregset);
if (target_has_execution) target_store_registers (regcache, -1);
procfs_ops.to_store_registers (regcache, -1);
else
orig_core_ops.to_store_registers (regcache, -1);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -1232,10 +1050,7 @@ ps_lgetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid,
inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid)); inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid));
regcache = get_thread_regcache (inferior_ptid); regcache = get_thread_regcache (inferior_ptid);
if (target_has_execution) target_fetch_registers (regcache, -1);
procfs_ops.to_fetch_registers (regcache, -1);
else
orig_core_ops.to_fetch_registers (regcache, -1);
fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1); fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -1258,10 +1073,7 @@ ps_lsetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid,
regcache = get_thread_regcache (inferior_ptid); regcache = get_thread_regcache (inferior_ptid);
supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset); supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset);
if (target_has_execution) target_store_registers (regcache, -1);
procfs_ops.to_store_registers (regcache, -1);
else
orig_core_ops.to_store_registers (regcache, -1);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -1328,10 +1140,6 @@ solaris_pid_to_str (struct target_ops *ops, ptid_t ptid)
{ {
static char buf[100]; static char buf[100];
/* In case init failed to resolve the libthread_db library. */
if (!procfs_suppress_run)
return procfs_pid_to_str (&procfs_ops, ptid);
if (is_thread (ptid)) if (is_thread (ptid))
{ {
ptid_t lwp; ptid_t lwp;
@ -1377,21 +1185,13 @@ sol_find_new_threads_callback (const td_thrhandle_t *th, void *ignored)
} }
static void static void
sol_find_new_threads (void) sol_find_new_threads (struct target_ops *ops)
{ {
/* Don't do anything if init failed to resolve the libthread_db struct target_ops *beneath = find_target_beneath (ops);
library. */
if (!procfs_suppress_run)
return;
if (PIDGET (inferior_ptid) == -1)
{
printf_filtered ("No process.\n");
return;
}
/* First Find any new LWP's. */ /* First Find any new LWP's. */
procfs_ops.to_find_new_threads (); if (beneath->to_find_new_threads != NULL)
beneath->to_find_new_threads (beneath);
/* Then find any new user-level threads. */ /* Then find any new user-level threads. */
p_td_ta_thr_iter (main_ta, sol_find_new_threads_callback, (void *) 0, p_td_ta_thr_iter (main_ta, sol_find_new_threads_callback, (void *) 0,
@ -1399,31 +1199,6 @@ sol_find_new_threads (void)
TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS); TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
} }
static void
sol_core_open (char *filename, int from_tty)
{
orig_core_ops.to_open (filename, from_tty);
}
static void
sol_core_close (int quitting)
{
orig_core_ops.to_close (quitting);
}
static void
sol_core_detach (struct target_ops *ops, char *args, int from_tty)
{
unpush_target (&core_ops);
orig_core_ops.to_detach (&orig_core_ops, args, from_tty);
}
static void
sol_core_files_info (struct target_ops *t)
{
orig_core_ops.to_files_info (t);
}
/* Worker bee for the "info sol-thread" command. This is a callback /* Worker bee for the "info sol-thread" command. This is a callback
function that gets called once for each Solaris user-level thread function that gets called once for each Solaris user-level thread
(i.e. not for LWPs) in the inferior. Print anything interesting (i.e. not for LWPs) in the inferior. Print anything interesting
@ -1511,119 +1286,32 @@ info_solthreads (char *args, int from_tty)
TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS); TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
} }
static int
sol_find_memory_regions (int (*func) (CORE_ADDR, unsigned long,
int, int, int, void *),
void *data)
{
return procfs_ops.to_find_memory_regions (func, data);
}
static char *
sol_make_note_section (bfd *obfd, int *note_size)
{
return procfs_ops.to_make_corefile_notes (obfd, note_size);
}
static int
ignore (struct bp_target_info *bp_tgt)
{
return 0;
}
static void static void
init_sol_thread_ops (void) init_sol_thread_ops (void)
{ {
sol_thread_ops.to_shortname = "solaris-threads"; sol_thread_ops.to_shortname = "solaris-threads";
sol_thread_ops.to_longname = "Solaris threads and pthread."; sol_thread_ops.to_longname = "Solaris threads and pthread.";
sol_thread_ops.to_doc = "Solaris threads and pthread support."; sol_thread_ops.to_doc = "Solaris threads and pthread support.";
sol_thread_ops.to_open = sol_thread_open;
sol_thread_ops.to_attach = sol_thread_attach;
sol_thread_ops.to_detach = sol_thread_detach; sol_thread_ops.to_detach = sol_thread_detach;
sol_thread_ops.to_resume = sol_thread_resume; sol_thread_ops.to_resume = sol_thread_resume;
sol_thread_ops.to_wait = sol_thread_wait; sol_thread_ops.to_wait = sol_thread_wait;
sol_thread_ops.to_fetch_registers = sol_thread_fetch_registers; sol_thread_ops.to_fetch_registers = sol_thread_fetch_registers;
sol_thread_ops.to_store_registers = sol_thread_store_registers; sol_thread_ops.to_store_registers = sol_thread_store_registers;
sol_thread_ops.to_prepare_to_store = sol_thread_prepare_to_store;
sol_thread_ops.deprecated_xfer_memory = sol_thread_xfer_memory;
sol_thread_ops.to_xfer_partial = sol_thread_xfer_partial; sol_thread_ops.to_xfer_partial = sol_thread_xfer_partial;
sol_thread_ops.to_files_info = sol_thread_files_info;
sol_thread_ops.to_insert_breakpoint = memory_insert_breakpoint;
sol_thread_ops.to_remove_breakpoint = memory_remove_breakpoint;
sol_thread_ops.to_terminal_init = terminal_init_inferior;
sol_thread_ops.to_terminal_inferior = terminal_inferior;
sol_thread_ops.to_terminal_ours_for_output = terminal_ours_for_output;
sol_thread_ops.to_terminal_ours = terminal_ours;
sol_thread_ops.to_terminal_save_ours = terminal_save_ours;
sol_thread_ops.to_terminal_info = child_terminal_info;
sol_thread_ops.to_kill = sol_thread_kill_inferior;
sol_thread_ops.to_create_inferior = sol_thread_create_inferior;
sol_thread_ops.to_mourn_inferior = sol_thread_mourn_inferior; sol_thread_ops.to_mourn_inferior = sol_thread_mourn_inferior;
sol_thread_ops.to_can_run = sol_thread_can_run;
sol_thread_ops.to_notice_signals = sol_thread_notice_signals;
sol_thread_ops.to_thread_alive = sol_thread_alive; sol_thread_ops.to_thread_alive = sol_thread_alive;
sol_thread_ops.to_pid_to_str = solaris_pid_to_str; sol_thread_ops.to_pid_to_str = solaris_pid_to_str;
sol_thread_ops.to_find_new_threads = sol_find_new_threads; sol_thread_ops.to_find_new_threads = sol_find_new_threads;
sol_thread_ops.to_stop = sol_thread_stop; sol_thread_ops.to_stratum = thread_stratum;
sol_thread_ops.to_stratum = process_stratum;
sol_thread_ops.to_has_all_memory = 1;
sol_thread_ops.to_has_memory = 1;
sol_thread_ops.to_has_stack = 1;
sol_thread_ops.to_has_registers = 1;
sol_thread_ops.to_has_execution = 1;
sol_thread_ops.to_has_thread_control = tc_none;
sol_thread_ops.to_find_memory_regions = sol_find_memory_regions;
sol_thread_ops.to_make_corefile_notes = sol_make_note_section;
sol_thread_ops.to_magic = OPS_MAGIC; sol_thread_ops.to_magic = OPS_MAGIC;
} }
static void
init_sol_core_ops (void)
{
sol_core_ops.to_shortname = "solaris-core";
sol_core_ops.to_longname = "Solaris core threads and pthread.";
sol_core_ops.to_doc = "Solaris threads and pthread support for core files.";
sol_core_ops.to_open = sol_core_open;
sol_core_ops.to_close = sol_core_close;
sol_core_ops.to_attach = sol_thread_attach;
sol_core_ops.to_detach = sol_core_detach;
sol_core_ops.to_fetch_registers = sol_thread_fetch_registers;
sol_core_ops.deprecated_xfer_memory = sol_thread_xfer_memory;
sol_core_ops.to_xfer_partial = sol_thread_xfer_partial;
sol_core_ops.to_files_info = sol_core_files_info;
sol_core_ops.to_insert_breakpoint = ignore;
sol_core_ops.to_remove_breakpoint = ignore;
sol_core_ops.to_create_inferior = sol_thread_create_inferior;
sol_core_ops.to_stratum = core_stratum;
sol_core_ops.to_has_memory = 1;
sol_core_ops.to_has_stack = 1;
sol_core_ops.to_has_registers = 1;
sol_core_ops.to_has_thread_control = tc_none;
sol_core_ops.to_thread_alive = sol_thread_alive;
sol_core_ops.to_pid_to_str = solaris_pid_to_str;
/* On Solaris/x86, when debugging a threaded core file from process
<n>, the following causes "info threads" to produce "procfs:
couldn't find pid <n> in procinfo list" where <n> is the pid of
the process that produced the core file. Disable it for now. */
#if 0
sol_core_ops.to_find_new_threads = sol_find_new_threads;
#endif
sol_core_ops.to_magic = OPS_MAGIC;
}
/* We suppress the call to add_target of core_ops in corelow because
if there are two targets in the stratum core_stratum,
find_core_target won't know which one to return. See corelow.c for
an additonal comment on coreops_suppress_target. */
int coreops_suppress_target = 1;
void void
_initialize_sol_thread (void) _initialize_sol_thread (void)
{ {
void *dlhandle; void *dlhandle;
init_sol_thread_ops (); init_sol_thread_ops ();
init_sol_core_ops ();
dlhandle = dlopen ("libthread_db.so.1", RTLD_NOW); dlhandle = dlopen ("libthread_db.so.1", RTLD_NOW);
if (!dlhandle) if (!dlhandle)
@ -1659,19 +1347,9 @@ _initialize_sol_thread (void)
add_target (&sol_thread_ops); add_target (&sol_thread_ops);
procfs_suppress_run = 1;
add_cmd ("sol-threads", class_maintenance, info_solthreads, add_cmd ("sol-threads", class_maintenance, info_solthreads,
_("Show info on Solaris user threads."), &maintenanceinfolist); _("Show info on Solaris user threads."), &maintenanceinfolist);
/* FIXME: This code takes errant advantage of the order in which
initialization routines are run. _initialize_corelow must run before
this one otherwise orig_core_ops will still contain zeros and the work
of init_sol_core_ops will be undone. */
memcpy (&orig_core_ops, &core_ops, sizeof (struct target_ops));
memcpy (&core_ops, &sol_core_ops, sizeof (struct target_ops));
add_target (&core_ops);
/* Hook into new_objfile notification. */ /* Hook into new_objfile notification. */
observer_attach_new_objfile (sol_thread_new_objfile); observer_attach_new_objfile (sol_thread_new_objfile);
return; return;
@ -1683,8 +1361,5 @@ _initialize_sol_thread (void)
if (dlhandle) if (dlhandle)
dlclose (dlhandle); dlclose (dlhandle);
/* Allow the user to debug non-threaded core files. */
add_target (&core_ops);
return; return;
} }

View file

@ -20,6 +20,7 @@
#include "defs.h" #include "defs.h"
#include "frame.h" #include "frame.h"
#include "symtab.h" #include "symtab.h"
#include "inferior.h"
#include "sol2-tdep.h" #include "sol2-tdep.h"
@ -34,3 +35,15 @@ sol2_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
return 0; return 0;
} }
/* This is how we want PTIDs from Solaris core files to be
printed. */
char *
sol2_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid)
{
static char buf[80];
xsnprintf (buf, sizeof buf, "LWP %ld", ptid_get_lwp (ptid));
return buf;
}

View file

@ -24,4 +24,6 @@ struct gdbarch;
CORE_ADDR sol2_skip_solib_resolver (struct gdbarch *, CORE_ADDR); CORE_ADDR sol2_skip_solib_resolver (struct gdbarch *, CORE_ADDR);
char *sol2_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid);
#endif /* sol2-tdep.h */ #endif /* sol2-tdep.h */

View file

@ -134,7 +134,8 @@ sparc32_fpregset_supplies_p (int regnum)
for all registers (including the floating-point registers). */ for all registers (including the floating-point registers). */
void void
sparc_fetch_inferior_registers (struct regcache *regcache, int regnum) sparc_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
int pid; int pid;
@ -185,7 +186,8 @@ sparc_fetch_inferior_registers (struct regcache *regcache, int regnum)
} }
void void
sparc_store_inferior_registers (struct regcache *regcache, int regnum) sparc_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
int pid; int pid;

View file

@ -40,7 +40,9 @@ extern int sparc32_fpregset_supplies_p (int regnum);
extern struct target_ops *sparc_target (void); extern struct target_ops *sparc_target (void);
extern void sparc_fetch_inferior_registers (struct regcache *, int); extern void sparc_fetch_inferior_registers (struct target_ops *,
extern void sparc_store_inferior_registers (struct regcache *, int); struct regcache *, int);
extern void sparc_store_inferior_registers (struct target_ops *,
struct regcache *, int);
#endif /* sparc-nat.h */ #endif /* sparc-nat.h */

View file

@ -235,6 +235,9 @@ sparc32_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* Solaris encodes the pid of the inferior in regset section /* Solaris encodes the pid of the inferior in regset section
names. */ names. */
set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
/* How to print LWP PTIDs from core files. */
set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str);
} }

View file

@ -184,6 +184,9 @@ sparc64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* Solaris encodes the pid of the inferior in regset section /* Solaris encodes the pid of the inferior in regset section
names. */ names. */
set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1); set_gdbarch_core_reg_section_encodes_pid (gdbarch, 1);
/* How to print LWP PTIDs from core files. */
set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str);
} }

View file

@ -452,7 +452,8 @@ spu_child_wait (struct target_ops *ops,
/* Override the fetch_inferior_register routine. */ /* Override the fetch_inferior_register routine. */
static void static void
spu_fetch_inferior_registers (struct regcache *regcache, int regno) spu_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int fd; int fd;
ULONGEST addr; ULONGEST addr;
@ -493,7 +494,8 @@ spu_fetch_inferior_registers (struct regcache *regcache, int regno)
/* Override the store_inferior_register routine. */ /* Override the store_inferior_register routine. */
static void static void
spu_store_inferior_registers (struct regcache *regcache, int regno) spu_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regno)
{ {
int fd; int fd;
ULONGEST addr; ULONGEST addr;

View file

@ -97,12 +97,6 @@ static struct target_ops debug_target;
static void debug_to_open (char *, int); static void debug_to_open (char *, int);
static void debug_to_resume (ptid_t, int, enum target_signal);
static void debug_to_fetch_registers (struct regcache *, int);
static void debug_to_store_registers (struct regcache *, int);
static void debug_to_prepare_to_store (struct regcache *); static void debug_to_prepare_to_store (struct regcache *);
static void debug_to_files_info (struct target_ops *); static void debug_to_files_info (struct target_ops *);
@ -152,8 +146,6 @@ static int debug_to_can_run (void);
static void debug_to_notice_signals (ptid_t); static void debug_to_notice_signals (ptid_t);
static int debug_to_thread_alive (ptid_t);
static void debug_to_stop (ptid_t); static void debug_to_stop (ptid_t);
/* NOTE: cagney/2004-09-29: Many targets reference this variable in /* NOTE: cagney/2004-09-29: Many targets reference this variable in
@ -412,10 +404,10 @@ update_current_target (void)
INHERIT (to_attach_no_wait, t); INHERIT (to_attach_no_wait, t);
/* Do not inherit to_detach. */ /* Do not inherit to_detach. */
/* Do not inherit to_disconnect. */ /* Do not inherit to_disconnect. */
INHERIT (to_resume, t); /* Do not inherit to_resume. */
/* Do not inherit to_wait. */ /* Do not inherit to_wait. */
INHERIT (to_fetch_registers, t); /* Do not inherit to_fetch_registers. */
INHERIT (to_store_registers, t); /* Do not inherit to_store_registers. */
INHERIT (to_prepare_to_store, t); INHERIT (to_prepare_to_store, t);
INHERIT (deprecated_xfer_memory, t); INHERIT (deprecated_xfer_memory, t);
INHERIT (to_files_info, t); INHERIT (to_files_info, t);
@ -455,8 +447,8 @@ update_current_target (void)
/* Do not inherit to_mourn_inferiour. */ /* Do not inherit to_mourn_inferiour. */
INHERIT (to_can_run, t); INHERIT (to_can_run, t);
INHERIT (to_notice_signals, t); INHERIT (to_notice_signals, t);
INHERIT (to_thread_alive, t); /* Do not inherit to_thread_alive. */
INHERIT (to_find_new_threads, t); /* Do not inherit to_find_new_threads. */
/* Do not inherit to_pid_to_str. */ /* Do not inherit to_pid_to_str. */
INHERIT (to_extra_thread_info, t); INHERIT (to_extra_thread_info, t);
INHERIT (to_stop, t); INHERIT (to_stop, t);
@ -509,15 +501,6 @@ update_current_target (void)
de_fault (to_post_attach, de_fault (to_post_attach,
(void (*) (int)) (void (*) (int))
target_ignore); target_ignore);
de_fault (to_resume,
(void (*) (ptid_t, int, enum target_signal))
noprocess);
de_fault (to_fetch_registers,
(void (*) (struct regcache *, int))
target_ignore);
de_fault (to_store_registers,
(void (*) (struct regcache *, int))
noprocess);
de_fault (to_prepare_to_store, de_fault (to_prepare_to_store,
(void (*) (struct regcache *)) (void (*) (struct regcache *))
noprocess); noprocess);
@ -614,12 +597,6 @@ update_current_target (void)
de_fault (to_notice_signals, de_fault (to_notice_signals,
(void (*) (ptid_t)) (void (*) (ptid_t))
target_ignore); target_ignore);
de_fault (to_thread_alive,
(int (*) (ptid_t))
return_zero);
de_fault (to_find_new_threads,
(void (*) (void))
target_ignore);
de_fault (to_extra_thread_info, de_fault (to_extra_thread_info,
(char *(*) (struct thread_info *)) (char *(*) (struct thread_info *))
return_zero); return_zero);
@ -1892,10 +1869,28 @@ target_pid_to_str (ptid_t ptid)
void void
target_resume (ptid_t ptid, int step, enum target_signal signal) target_resume (ptid_t ptid, int step, enum target_signal signal)
{ {
struct target_ops *t;
dcache_invalidate (target_dcache); dcache_invalidate (target_dcache);
(*current_target.to_resume) (ptid, step, signal);
set_executing (ptid, 1); for (t = current_target.beneath; t != NULL; t = t->beneath)
set_running (ptid, 1); {
if (t->to_resume != NULL)
{
t->to_resume (t, ptid, step, signal);
if (targetdebug)
fprintf_unfiltered (gdb_stdlog, "target_resume (%d, %s, %s)\n",
PIDGET (ptid),
step ? "step" : "continue",
target_signal_to_name (signal));
set_executing (ptid, 1);
set_running (ptid, 1);
return;
}
}
noprocess ();
} }
/* Look through the list of possible targets for a target that can /* Look through the list of possible targets for a target that can
follow forks. */ follow forks. */
@ -2607,6 +2602,45 @@ target_attach (char *args, int from_tty)
"could not find a target to attach"); "could not find a target to attach");
} }
int
target_thread_alive (ptid_t ptid)
{
struct target_ops *t;
for (t = current_target.beneath; t != NULL; t = t->beneath)
{
if (t->to_thread_alive != NULL)
{
int retval;
retval = t->to_thread_alive (t, ptid);
if (targetdebug)
fprintf_unfiltered (gdb_stdlog, "target_thread_alive (%d) = %d\n",
PIDGET (ptid), retval);
return retval;
}
}
return 0;
}
void
target_find_new_threads (void)
{
struct target_ops *t;
for (t = current_target.beneath; t != NULL; t = t->beneath)
{
if (t->to_find_new_threads != NULL)
{
t->to_find_new_threads (t);
if (targetdebug)
fprintf_unfiltered (gdb_stdlog, "target_find_new_threads ()\n");
return;
}
}
}
static void static void
debug_to_post_attach (int pid) debug_to_post_attach (int pid)
{ {
@ -2615,16 +2649,6 @@ debug_to_post_attach (int pid)
fprintf_unfiltered (gdb_stdlog, "target_post_attach (%d)\n", pid); fprintf_unfiltered (gdb_stdlog, "target_post_attach (%d)\n", pid);
} }
static void
debug_to_resume (ptid_t ptid, int step, enum target_signal siggnal)
{
debug_target.to_resume (ptid, step, siggnal);
fprintf_unfiltered (gdb_stdlog, "target_resume (%d, %s, %s)\n", PIDGET (ptid),
step ? "step" : "continue",
target_signal_to_name (siggnal));
}
/* Return a pretty printed form of target_waitstatus. /* Return a pretty printed form of target_waitstatus.
Space for the result is malloc'd, caller must free. */ Space for the result is malloc'd, caller must free. */
@ -2700,19 +2724,41 @@ debug_print_register (const char * func,
fprintf_unfiltered (gdb_stdlog, "\n"); fprintf_unfiltered (gdb_stdlog, "\n");
} }
static void void
debug_to_fetch_registers (struct regcache *regcache, int regno) target_fetch_registers (struct regcache *regcache, int regno)
{ {
debug_target.to_fetch_registers (regcache, regno); struct target_ops *t;
debug_print_register ("target_fetch_registers", regcache, regno); for (t = current_target.beneath; t != NULL; t = t->beneath)
{
if (t->to_fetch_registers != NULL)
{
t->to_fetch_registers (t, regcache, regno);
if (targetdebug)
debug_print_register ("target_fetch_registers", regcache, regno);
return;
}
}
} }
static void void
debug_to_store_registers (struct regcache *regcache, int regno) target_store_registers (struct regcache *regcache, int regno)
{ {
debug_target.to_store_registers (regcache, regno);
debug_print_register ("target_store_registers", regcache, regno); struct target_ops *t;
fprintf_unfiltered (gdb_stdlog, "\n"); for (t = current_target.beneath; t != NULL; t = t->beneath)
{
if (t->to_store_registers != NULL)
{
t->to_store_registers (t, regcache, regno);
if (targetdebug)
{
debug_print_register ("target_store_registers", regcache, regno);
}
return;
}
}
noprocess ();
} }
static void static void
@ -3124,27 +3170,6 @@ debug_to_notice_signals (ptid_t ptid)
PIDGET (ptid)); PIDGET (ptid));
} }
static int
debug_to_thread_alive (ptid_t ptid)
{
int retval;
retval = debug_target.to_thread_alive (ptid);
fprintf_unfiltered (gdb_stdlog, "target_thread_alive (%d) = %d\n",
PIDGET (ptid), retval);
return retval;
}
static void
debug_to_find_new_threads (void)
{
debug_target.to_find_new_threads ();
fputs_unfiltered ("target_find_new_threads ()\n", gdb_stdlog);
}
static void static void
debug_to_stop (ptid_t ptid) debug_to_stop (ptid_t ptid)
{ {
@ -3182,9 +3207,6 @@ setup_target_debug (void)
current_target.to_open = debug_to_open; current_target.to_open = debug_to_open;
current_target.to_post_attach = debug_to_post_attach; current_target.to_post_attach = debug_to_post_attach;
current_target.to_resume = debug_to_resume;
current_target.to_fetch_registers = debug_to_fetch_registers;
current_target.to_store_registers = debug_to_store_registers;
current_target.to_prepare_to_store = debug_to_prepare_to_store; current_target.to_prepare_to_store = debug_to_prepare_to_store;
current_target.deprecated_xfer_memory = deprecated_debug_xfer_memory; current_target.deprecated_xfer_memory = deprecated_debug_xfer_memory;
current_target.to_files_info = debug_to_files_info; current_target.to_files_info = debug_to_files_info;
@ -3219,8 +3241,6 @@ setup_target_debug (void)
current_target.to_has_exited = debug_to_has_exited; current_target.to_has_exited = debug_to_has_exited;
current_target.to_can_run = debug_to_can_run; current_target.to_can_run = debug_to_can_run;
current_target.to_notice_signals = debug_to_notice_signals; current_target.to_notice_signals = debug_to_notice_signals;
current_target.to_thread_alive = debug_to_thread_alive;
current_target.to_find_new_threads = debug_to_find_new_threads;
current_target.to_stop = debug_to_stop; current_target.to_stop = debug_to_stop;
current_target.to_rcmd = debug_to_rcmd; current_target.to_rcmd = debug_to_rcmd;
current_target.to_pid_to_exec_file = debug_to_pid_to_exec_file; current_target.to_pid_to_exec_file = debug_to_pid_to_exec_file;

View file

@ -332,11 +332,11 @@ struct target_ops
void (*to_post_attach) (int); void (*to_post_attach) (int);
void (*to_detach) (struct target_ops *ops, char *, int); void (*to_detach) (struct target_ops *ops, char *, int);
void (*to_disconnect) (struct target_ops *, char *, int); void (*to_disconnect) (struct target_ops *, char *, int);
void (*to_resume) (ptid_t, int, enum target_signal); void (*to_resume) (struct target_ops *, ptid_t, int, enum target_signal);
ptid_t (*to_wait) (struct target_ops *, ptid_t (*to_wait) (struct target_ops *,
ptid_t, struct target_waitstatus *); ptid_t, struct target_waitstatus *);
void (*to_fetch_registers) (struct regcache *, int); void (*to_fetch_registers) (struct target_ops *, struct regcache *, int);
void (*to_store_registers) (struct regcache *, int); void (*to_store_registers) (struct target_ops *, struct regcache *, int);
void (*to_prepare_to_store) (struct regcache *); void (*to_prepare_to_store) (struct regcache *);
/* Transfer LEN bytes of memory between GDB address MYADDR and /* Transfer LEN bytes of memory between GDB address MYADDR and
@ -404,8 +404,8 @@ struct target_ops
void (*to_mourn_inferior) (struct target_ops *); void (*to_mourn_inferior) (struct target_ops *);
int (*to_can_run) (void); int (*to_can_run) (void);
void (*to_notice_signals) (ptid_t ptid); void (*to_notice_signals) (ptid_t ptid);
int (*to_thread_alive) (ptid_t ptid); int (*to_thread_alive) (struct target_ops *, ptid_t ptid);
void (*to_find_new_threads) (void); void (*to_find_new_threads) (struct target_ops *);
char *(*to_pid_to_str) (struct target_ops *, ptid_t); char *(*to_pid_to_str) (struct target_ops *, ptid_t);
char *(*to_extra_thread_info) (struct thread_info *); char *(*to_extra_thread_info) (struct thread_info *);
void (*to_stop) (ptid_t); void (*to_stop) (ptid_t);
@ -634,15 +634,13 @@ extern ptid_t target_wait (ptid_t ptid, struct target_waitstatus *status);
/* Fetch at least register REGNO, or all regs if regno == -1. No result. */ /* Fetch at least register REGNO, or all regs if regno == -1. No result. */
#define target_fetch_registers(regcache, regno) \ extern void target_fetch_registers (struct regcache *regcache, int regno);
(*current_target.to_fetch_registers) (regcache, regno)
/* Store at least register REGNO, or all regs if REGNO == -1. /* Store at least register REGNO, or all regs if REGNO == -1.
It can store as many registers as it wants to, so target_prepare_to_store It can store as many registers as it wants to, so target_prepare_to_store
must have been previously called. Calls error() if there are problems. */ must have been previously called. Calls error() if there are problems. */
#define target_store_registers(regcache, regs) \ extern void target_store_registers (struct regcache *regcache, int regs);
(*current_target.to_store_registers) (regcache, regs)
/* Get ready to modify the registers array. On machines which store /* Get ready to modify the registers array. On machines which store
individual registers, this doesn't need to do anything. On machines individual registers, this doesn't need to do anything. On machines
@ -918,13 +916,11 @@ void target_mourn_inferior (void);
/* Check to see if a thread is still alive. */ /* Check to see if a thread is still alive. */
#define target_thread_alive(ptid) \ extern int target_thread_alive (ptid_t ptid);
(*current_target.to_thread_alive) (ptid)
/* Query for new threads and add them to the thread list. */ /* Query for new threads and add them to the thread list. */
#define target_find_new_threads() \ extern void target_find_new_threads (void);
(*current_target.to_find_new_threads) ()
/* Make target stop in a continuable fashion. (For instance, under /* Make target stop in a continuable fashion. (For instance, under
Unix, this should act like SIGSTOP). This function is normally Unix, this should act like SIGSTOP). This function is normally

View file

@ -63,7 +63,8 @@ vaxbsd_collect_gregset (const struct regcache *regcache,
for all registers. */ for all registers. */
static void static void
vaxbsd_fetch_inferior_registers (struct regcache *regcache, int regnum) vaxbsd_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct reg regs; struct reg regs;
@ -78,7 +79,8 @@ vaxbsd_fetch_inferior_registers (struct regcache *regcache, int regnum)
this for all registers. */ this for all registers. */
static void static void
vaxbsd_store_inferior_registers (struct regcache *regcache, int regnum) vaxbsd_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
struct reg regs; struct reg regs;

View file

@ -401,7 +401,8 @@ do_windows_fetch_inferior_registers (struct regcache *regcache, int r)
} }
static void static void
windows_fetch_inferior_registers (struct regcache *regcache, int r) windows_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int r)
{ {
current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE); current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE);
/* Check if current_thread exists. Windows sometimes uses a non-existent /* Check if current_thread exists. Windows sometimes uses a non-existent
@ -427,7 +428,8 @@ do_windows_store_inferior_registers (const struct regcache *regcache, int r)
/* Store a new register value into the current thread context */ /* Store a new register value into the current thread context */
static void static void
windows_store_inferior_registers (struct regcache *regcache, int r) windows_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int r)
{ {
current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE); current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE);
/* Check if current_thread exists. Windows sometimes uses a non-existent /* Check if current_thread exists. Windows sometimes uses a non-existent
@ -1165,7 +1167,8 @@ fake_create_process (void)
} }
static void static void
windows_resume (ptid_t ptid, int step, enum target_signal sig) windows_resume (struct target_ops *ops,
ptid_t ptid, int step, enum target_signal sig)
{ {
thread_info *th; thread_info *th;
DWORD continue_status = DBG_CONTINUE; DWORD continue_status = DBG_CONTINUE;
@ -1224,8 +1227,9 @@ windows_resume (ptid_t ptid, int step, enum target_signal sig)
if (step) if (step)
{ {
/* Single step by setting t bit */ /* Single step by setting t bit */
windows_fetch_inferior_registers (get_current_regcache (), windows_fetch_inferior_registers (ops,
gdbarch_ps_regnum (current_gdbarch)); get_current_regcache (),
gdbarch_ps_regnum (current_gdbarch));
th->context.EFlags |= FLAG_TRACE_BIT; th->context.EFlags |= FLAG_TRACE_BIT;
} }
@ -1258,7 +1262,8 @@ windows_resume (ptid_t ptid, int step, enum target_signal sig)
handling by WFI (or whatever). handling by WFI (or whatever).
*/ */
static int static int
get_windows_debug_event (int pid, struct target_waitstatus *ourstatus) get_windows_debug_event (struct target_ops *ops,
int pid, struct target_waitstatus *ourstatus)
{ {
BOOL debug_event; BOOL debug_event;
DWORD continue_status, event_code; DWORD continue_status, event_code;
@ -1475,7 +1480,7 @@ windows_wait (struct target_ops *ops,
to find a better solution to that problem. But in the meantime, to find a better solution to that problem. But in the meantime,
the current approach already greatly mitigate this issue. */ the current approach already greatly mitigate this issue. */
SetConsoleCtrlHandler (NULL, TRUE); SetConsoleCtrlHandler (NULL, TRUE);
retval = get_windows_debug_event (pid, ourstatus); retval = get_windows_debug_event (ops, pid, ourstatus);
SetConsoleCtrlHandler (NULL, FALSE); SetConsoleCtrlHandler (NULL, FALSE);
if (retval) if (retval)
@ -1722,7 +1727,7 @@ windows_detach (struct target_ops *ops, char *args, int from_tty)
if (has_detach_ability ()) if (has_detach_ability ())
{ {
ptid_t ptid = {-1}; ptid_t ptid = {-1};
windows_resume (ptid, 0, TARGET_SIGNAL_0); windows_resume (ops, ptid, 0, TARGET_SIGNAL_0);
if (!kernel32_DebugActiveProcessStop (current_event.dwProcessId)) if (!kernel32_DebugActiveProcessStop (current_event.dwProcessId))
{ {
@ -2269,7 +2274,7 @@ cygwin_get_dr6 (void)
by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
it means that the thread has died. Otherwise it is assumed to be alive. */ it means that the thread has died. Otherwise it is assumed to be alive. */
static int static int
windows_thread_alive (ptid_t ptid) windows_thread_alive (struct target_ops *ops, ptid_t ptid)
{ {
int tid; int tid;

View file

@ -265,7 +265,8 @@ store_xtregs (struct regcache *regcache, int regnum)
} }
void void
xtensa_linux_fetch_inferior_registers (struct regcache *regcache, int regnum) xtensa_linux_fetch_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
{ {
@ -279,7 +280,8 @@ xtensa_linux_fetch_inferior_registers (struct regcache *regcache, int regnum)
} }
void void
xtensa_linux_store_inferior_registers (struct regcache *regcache, int regnum) xtensa_linux_store_inferior_registers (struct target_ops *ops,
struct regcache *regcache, int regnum)
{ {
if (regnum == -1) if (regnum == -1)
{ {