* regcache.h (struct thread_info): Forward declare.

(struct regcache): New.
	(new_register_cache): Adjust prototype.
	(get_thread_regcache): Declare.
	(free_register_cache): Adjust prototype.
	(registers_to_string, registers_from_string): Ditto.
	(supply_register, supply_register_by_name, collect_register)
	(collect_register_as_string, collect_register_by_name): Ditto.
	* regcache.c (struct inferior_regcache_data): Delete.
	(get_regcache): Rename to ...
	(get_thread_regcache): ... this.  Adjust.  Switch inferior before
	fetching registers.
	(regcache_invalidate_one): Adjust.
	(regcache_invalidate): Fix prototype.
	(new_register_cache): Return the new register cache.
	(free_register_cache): Change prototype.
	(realloc_register_cache): Adjust.
	(registers_to_string): Change prototype to take a regcache.  Adjust.
	(registers_from_string): Ditto.
	(register_data): Ditto.
	(supply_register): Ditto.
	(supply_register_by_name): Ditto.
	(collect_register): Ditto.
	(collect_register_as_string): Ditto.
	(collect_register_by_name): Ditto.
	* server.c (process_serial_event): Adjust.
	* linux-low.h (regset_fill_func, regset_store_func): Change
	prototype.
	(get_pc, set_pc, collect_ptrace_register, supply_ptrace_register):
	Change prototype.
	* linux-low.c (get_stop_pc): Adjust.
	(check_removed_breakpoint): Adjust.
	(linux_wait_for_event): Adjust.
	(linux_resume_one_lwp): Adjust.
	(fetch_register): Add regcache parameter.  Adjust.
	(usr_store_inferior_registers): Ditto.
	(regsets_fetch_inferior_registers): Ditto.
	(regsets_store_inferior_registers): Ditto.
	(linux_fetch_registers, linux_store_registers): Ditto.
	* i387-fp.c (i387_cache_to_fsave): Change prototype to take a
	regcache.  Adjust.
	(i387_fsave_to_cache, i387_cache_to_fxsave, i387_fxsave_to_cache): Ditto.
	* i387-fp.h (i387_cache_to_fsave, i387_fsave_to_cache): Change
	prototype to take a regcache.
	(i387_cache_to_fxsave, i387_fxsave_to_cache): Ditto.
	* remote-utils.c (convert_ascii_to_int, outreg)
	(prepare_resume_reply): Change prototype to take a regcache.
	Adjust.
	* target.h (struct target_ops) <fetch_registers, store_registers>:
	Change prototype to take a regcache.
	(fetch_inferior_registers, store_inferior_registers): Change
	prototype to take a regcache.  Adjust.
	* proc-service.c (ps_lgetregs): Adjust.
	* linux-x86-low.c (x86_fill_gregset, x86_store_gregset)
	(x86_fill_fpregset, x86_store_fpregset, x86_fill_fpxregset)
	(x86_store_fpxregset, x86_get_pc, x86_set_pc): Change prototype to
	take a regcache.  Adjust.
	* linux-arm-low.c (arm_fill_gregset, arm_store_gregset)
	(arm_fill_wmmxregset, arm_store_wmmxregset, arm_fill_vfpregset)
	(arm_store_vfpregset, arm_get_pc, arm_set_pc):
	(arm_breakpoint_at): Change prototype to take a regcache.  Adjust.
	* linux-cris-low.c (cris_get_pc, cris_set_pc)
	(cris_cannot_fetch_register):
	(cris_breakpoint_at): Change prototype to take a regcache.
	Adjust.
	* linux-crisv32-low.c (cris_get_pc, cris_set_pc,
	cris_reinsert_addr, cris_write_data_breakpoint): Change prototype
	to take a regcache.  Adjust.
	(cris_breakpoint_at, cris_insert_point, cris_remove_point):
	Adjust.
	* linux-m32r-low.c (m32r_get_pc, m32r_set_pc): Change prototype to
	take a regcache.  Adjust.
	* linux-m68k-low.c (m68k_fill_gregset, m68k_store_gregset)
	(m68k_fill_fpregset, m68k_store_fpregset, m68k_get_pc,
	(m68k_set_pc): Change prototype to take a regcache.  Adjust.
	* linux-mips-low.c (mips_get_pc):
	(mips_set_pc): Change prototype to take a regcache.  Adjust.
	(mips_reinsert_addr): Adjust.
	(mips_collect_register): Change prototype to take a regcache.
	Adjust.
	(mips_supply_register):
	(mips_collect_register_32bit, mips_supply_register_32bit)
	(mips_fill_gregset, mips_store_gregset, mips_fill_fpregset)
	(mips_store_fpregset): Ditto.
	* linux-ppc-low.c (ppc_supply_ptrace_register, ppc_supply_ptrace_register):
	Ditto.
	(parse_spufs_run): Adjust.
	(ppc_get_pc, ppc_set_pc, ppc_fill_gregset, ppc_fill_vsxregset)
	(ppc_store_vsxregset, ppc_fill_vrregset, ppc_store_vrregset)
	(ppc_fill_evrregset, ppc_store_evrregset): Change prototype to
	take a regcache.  Adjust.
	* linux-s390-low.c (s390_collect_ptrace_register)
	(s390_supply_ptrace_register, s390_fill_gregset, s390_get_pc)
	(s390_set_pc): Change prototype to take a regcache.  Adjust.
	(s390_arch_setup): Adjust.
	* linux-sh-low.c (sh_get_pc, sh_breakpoint_at)
	(sh_fill_gregset): Change prototype to take a regcache.  Adjust.
	* linux-sparc-low.c (sparc_fill_gregset_to_stack)
	(sparc_fill_gregset, sparc_store_gregset_from_stack)
	(sparc_store_gregset, sparc_get_pc): Change prototype to take a
	regcache.  Adjust.
	(sparc_breakpoint_at): Adjust.
	* linux-xtensa-low.c (xtensa_fill_gregset):
	(xtensa_store_gregset):
	(xtensa_fill_xtregset, xtensa_store_xtregset, xtensa_get_pc)
	(xtensa_set_pc): Change prototype to take a regcache.  Adjust.
	* nto-low.c (nto_fetch_registers, nto_store_registers): Change
	prototype to take a regcache.  Adjust.
	* win32-arm-low.c (arm_fetch_inferior_register)
	(arm_store_inferior_register): Change prototype to take a
	regcache.  Adjust.
	* win32-i386-low.c (i386_fetch_inferior_register)
	(i386_store_inferior_register): Change prototype to take a
	regcache.  Adjust.
	* win32-low.c (child_fetch_inferior_registers)
	(child_store_inferior_registers): Change prototype to take a
	regcache.  Adjust.
	(win32_wait): Adjust.
	(win32_fetch_inferior_registers): Change prototype to take a
	regcache.  Adjust.
	(win32_store_inferior_registers): Adjust.
	* win32-low.h (struct win32_target_ops) <fetch_inferior_register,
	store_inferior_register>: Change prototype to take a regcache.
This commit is contained in:
Pedro Alves
2010-01-20 22:55:38 +00:00
parent 23787403e0
commit 442ea88105
28 changed files with 660 additions and 453 deletions

View File

@ -451,7 +451,8 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
static CORE_ADDR
get_stop_pc (void)
{
CORE_ADDR stop_pc = (*the_low_target.get_pc) ();
struct regcache *regcache = get_thread_regcache (current_inferior, 1);
CORE_ADDR stop_pc = (*the_low_target.get_pc) (regcache);
if (! get_thread_lwp (current_inferior)->stepping)
stop_pc -= the_low_target.decr_pc_after_break;
@ -884,6 +885,7 @@ check_removed_breakpoint (struct lwp_info *event_child)
{
CORE_ADDR stop_pc;
struct thread_info *saved_inferior;
struct regcache *regcache;
if (event_child->pending_is_breakpoint == 0)
return 0;
@ -894,7 +896,7 @@ check_removed_breakpoint (struct lwp_info *event_child)
saved_inferior = current_inferior;
current_inferior = get_lwp_thread (event_child);
regcache = get_thread_regcache (current_inferior, 1);
stop_pc = get_stop_pc ();
/* If the PC has changed since we stopped, then we shouldn't do
@ -930,7 +932,7 @@ check_removed_breakpoint (struct lwp_info *event_child)
{
if (debug_threads)
fprintf (stderr, "Set pc to 0x%lx\n", (long) stop_pc);
(*the_low_target.set_pc) (stop_pc);
(*the_low_target.set_pc) (regcache, stop_pc);
}
/* We consumed the pending SIGTRAP. */
@ -1063,11 +1065,12 @@ retry:
&& the_low_target.get_pc != NULL)
{
struct thread_info *saved_inferior = current_inferior;
struct regcache *regcache = get_thread_regcache (current_inferior, 1);
CORE_ADDR pc;
current_inferior = (struct thread_info *)
find_inferior_id (&all_threads, child->head.id);
pc = (*the_low_target.get_pc) ();
pc = (*the_low_target.get_pc) (regcache);
fprintf (stderr, "linux_wait_for_lwp: pc is 0x%lx\n", (long) pc);
current_inferior = saved_inferior;
}
@ -1832,7 +1835,8 @@ linux_resume_one_lwp (struct lwp_info *lwp,
if (debug_threads && the_low_target.get_pc != NULL)
{
CORE_ADDR pc = (*the_low_target.get_pc) ();
struct regcache *regcache = get_thread_regcache (current_inferior, 1);
CORE_ADDR pc = (*the_low_target.get_pc) (regcache);
fprintf (stderr, " resuming from pc 0x%lx\n", (long) pc);
}
@ -2121,7 +2125,7 @@ register_addr (int regnum)
/* Fetch one register. */
static void
fetch_register (int regno)
fetch_register (struct regcache *regcache, int regno)
{
CORE_ADDR regaddr;
int i, size;
@ -2160,29 +2164,29 @@ fetch_register (int regno)
}
if (the_low_target.supply_ptrace_register)
the_low_target.supply_ptrace_register (regno, buf);
the_low_target.supply_ptrace_register (regcache, regno, buf);
else
supply_register (regno, buf);
supply_register (regcache, regno, buf);
error_exit:;
}
/* Fetch all registers, or just one, from the child process. */
static void
usr_fetch_inferior_registers (int regno)
usr_fetch_inferior_registers (struct regcache *regcache, int regno)
{
if (regno == -1)
for (regno = 0; regno < the_low_target.num_regs; regno++)
fetch_register (regno);
fetch_register (regcache, regno);
else
fetch_register (regno);
fetch_register (regcache, regno);
}
/* Store our register values back into the inferior.
If REGNO is -1, do this for all registers.
Otherwise, REGNO specifies which register (so we can save time). */
static void
usr_store_inferior_registers (int regno)
usr_store_inferior_registers (struct regcache *regcache, int regno)
{
CORE_ADDR regaddr;
int i, size;
@ -2207,9 +2211,9 @@ usr_store_inferior_registers (int regno)
memset (buf, 0, size);
if (the_low_target.collect_ptrace_register)
the_low_target.collect_ptrace_register (regno, buf);
the_low_target.collect_ptrace_register (regcache, regno, buf);
else
collect_register (regno, buf);
collect_register (regcache, regno, buf);
pid = lwpid_of (get_thread_lwp (current_inferior));
for (i = 0; i < size; i += sizeof (PTRACE_XFER_TYPE))
@ -2241,7 +2245,7 @@ usr_store_inferior_registers (int regno)
}
else
for (regno = 0; regno < the_low_target.num_regs; regno++)
usr_store_inferior_registers (regno);
usr_store_inferior_registers (regcache, regno);
}
#endif /* HAVE_LINUX_USRREGS */
@ -2250,7 +2254,7 @@ usr_store_inferior_registers (int regno)
#ifdef HAVE_LINUX_REGSETS
static int
regsets_fetch_inferior_registers ()
regsets_fetch_inferior_registers (struct regcache *regcache)
{
struct regset_info *regset;
int saw_general_regs = 0;
@ -2296,7 +2300,7 @@ regsets_fetch_inferior_registers ()
}
else if (regset->type == GENERAL_REGS)
saw_general_regs = 1;
regset->store_function (buf);
regset->store_function (regcache, buf);
regset ++;
free (buf);
}
@ -2307,7 +2311,7 @@ regsets_fetch_inferior_registers ()
}
static int
regsets_store_inferior_registers ()
regsets_store_inferior_registers (struct regcache *regcache)
{
struct regset_info *regset;
int saw_general_regs = 0;
@ -2341,7 +2345,7 @@ regsets_store_inferior_registers ()
if (res == 0)
{
/* Then overlay our cached registers on that. */
regset->fill_function (buf);
regset->fill_function (regcache, buf);
/* Only now do we write the register set. */
#ifndef __sparc__
@ -2391,26 +2395,26 @@ regsets_store_inferior_registers ()
void
linux_fetch_registers (int regno)
linux_fetch_registers (struct regcache *regcache, int regno)
{
#ifdef HAVE_LINUX_REGSETS
if (regsets_fetch_inferior_registers () == 0)
if (regsets_fetch_inferior_registers (regcache) == 0)
return;
#endif
#ifdef HAVE_LINUX_USRREGS
usr_fetch_inferior_registers (regno);
usr_fetch_inferior_registers (regcache, regno);
#endif
}
void
linux_store_registers (int regno)
linux_store_registers (struct regcache *regcache, int regno)
{
#ifdef HAVE_LINUX_REGSETS
if (regsets_store_inferior_registers () == 0)
if (regsets_store_inferior_registers (regcache) == 0)
return;
#endif
#ifdef HAVE_LINUX_USRREGS
usr_store_inferior_registers (regno);
usr_store_inferior_registers (regcache, regno);
#endif
}