From 3e00d44febb8093d8dc0e6842b975afb194c4fd1 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 23 Mar 2017 13:37:06 -0400 Subject: [PATCH] Remove some unnecessary inferior_ptid setting/restoring when fetching/storing registers Now that the to_fetch_registers, to_store_registers and to_prepare_to_store target methods don't rely on the value of inferior_ptid anymore, we can remove a bunch of now unnecessary setting and restoring of inferior_ptid. The asserts added recently in target_fetch_registers and target_store_registers, which validate that inferior_ptid matches the regcache's ptid, must go away. It's the whole point of this effort, to not require inferior_ptid to have a particular value when calling these functions. One thing that I noticed is how sol-thread.c's ps_lgetregs and friends use the current value of inferior_ptid instead of what's passed as argument (ph->ptid), unlike proc-service.c's versions of the same functions. Is it expected? I left it like this in the current patch, but unless there's a good reason for it to be that way, I guess we should make it use the parameter. gdb/ChangeLog: * fbsd-tdep.c (fbsd_corefile_thread): Don't set/restore inferior_ptid. * proc-service.c (ps_lgetregs, ps_lsetregs, ps_lgetfpregs, ps_lsetfpregs): Likewise. * regcache.c (regcache_raw_update, regcache_raw_write): Likewise. * sol-thread.c (ps_lgetregs, ps_lsetregs, ps_lgetfpregs, ps_lsetfpregs): Likewise. * target.c (target_fetch_registers, target_store_registers): Remove asserts. --- gdb/ChangeLog | 12 ++++++++++++ gdb/fbsd-tdep.c | 4 ---- gdb/proc-service.c | 36 ++++++++++++---------------------- gdb/regcache.c | 17 +++------------- gdb/sol-thread.c | 48 ++++++++++++---------------------------------- gdb/target.c | 4 ---- 6 files changed, 39 insertions(+), 82 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a3f503d84ec..5ad7ac33036 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2017-03-23 Simon Marchi + + * fbsd-tdep.c (fbsd_corefile_thread): Don't set/restore + inferior_ptid. + * proc-service.c (ps_lgetregs, ps_lsetregs, ps_lgetfpregs, + ps_lsetfpregs): Likewise. + * regcache.c (regcache_raw_update, regcache_raw_write): Likewise. + * sol-thread.c (ps_lgetregs, ps_lsetregs, ps_lgetfpregs, + ps_lsetfpregs): Likewise. + * target.c (target_fetch_registers, target_store_registers): + Remove asserts. + 2017-03-23 Alan Hayward * sol-thread.c (sol_thread_store_registers): Remove regcache calls. diff --git a/gdb/fbsd-tdep.c b/gdb/fbsd-tdep.c index e7579100234..46875d8efd1 100644 --- a/gdb/fbsd-tdep.c +++ b/gdb/fbsd-tdep.c @@ -193,15 +193,11 @@ static void fbsd_corefile_thread (struct thread_info *info, struct fbsd_corefile_thread_data *args) { - struct cleanup *old_chain; struct regcache *regcache; regcache = get_thread_arch_regcache (info->ptid, args->gdbarch); - old_chain = save_inferior_ptid (); - inferior_ptid = info->ptid; target_fetch_registers (regcache, -1); - do_cleanups (old_chain); args->note_data = fbsd_collect_thread_registers (regcache, info->ptid, args->obfd, args->note_data, diff --git a/gdb/proc-service.c b/gdb/proc-service.c index d39830cb692..415ba0a7f3c 100644 --- a/gdb/proc-service.c +++ b/gdb/proc-service.c @@ -158,16 +158,13 @@ ps_pdwrite (gdb_ps_prochandle_t ph, psaddr_t addr, ps_err_e ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset) { - struct cleanup *old_chain = save_inferior_ptid (); - struct regcache *regcache; - - inferior_ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); - regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ()); + ptid_t ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); + struct regcache *regcache + = get_thread_arch_regcache (ptid, target_gdbarch ()); target_fetch_registers (regcache, -1); fill_gregset (regcache, (gdb_gregset_t *) gregset, -1); - do_cleanups (old_chain); return PS_OK; } @@ -177,16 +174,13 @@ ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset) ps_err_e ps_lsetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const prgregset_t gregset) { - struct cleanup *old_chain = save_inferior_ptid (); - struct regcache *regcache; - - inferior_ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); - regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ()); + ptid_t ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); + struct regcache *regcache + = get_thread_arch_regcache (ptid, target_gdbarch ()); supply_gregset (regcache, (const gdb_gregset_t *) gregset); target_store_registers (regcache, -1); - do_cleanups (old_chain); return PS_OK; } @@ -197,16 +191,13 @@ ps_err_e ps_lgetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, gdb_prfpregset_t *fpregset) { - struct cleanup *old_chain = save_inferior_ptid (); - struct regcache *regcache; - - inferior_ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); - regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ()); + ptid_t ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); + struct regcache *regcache + = get_thread_arch_regcache (ptid, target_gdbarch ()); target_fetch_registers (regcache, -1); fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1); - do_cleanups (old_chain); return PS_OK; } @@ -217,16 +208,13 @@ ps_err_e ps_lsetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const gdb_prfpregset_t *fpregset) { - struct cleanup *old_chain = save_inferior_ptid (); - struct regcache *regcache; - - inferior_ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); - regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ()); + ptid_t ptid = ptid_build (ptid_get_pid (ph->ptid), lwpid, 0); + struct regcache *regcache + = get_thread_arch_regcache (ptid, target_gdbarch ()); supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset); target_store_registers (regcache, -1); - do_cleanups (old_chain); return PS_OK; } diff --git a/gdb/regcache.c b/gdb/regcache.c index 58d4f562921..71223a1dc49 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -666,11 +666,7 @@ regcache_raw_update (struct regcache *regcache, int regnum) if (!regcache->readonly_p && regcache_register_status (regcache, regnum) == REG_UNKNOWN) { - struct cleanup *old_chain = save_inferior_ptid (); - - inferior_ptid = regcache->ptid; target_fetch_registers (regcache, regnum); - do_cleanups (old_chain); /* A number of targets can't access the whole set of raw registers (because the debug API provides no means to get at @@ -937,8 +933,7 @@ void regcache_raw_write (struct regcache *regcache, int regnum, const gdb_byte *buf) { - struct cleanup *chain_before_save_inferior; - struct cleanup *chain_before_invalidate_register; + struct cleanup *old_chain; gdb_assert (regcache != NULL && buf != NULL); gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers); @@ -956,24 +951,18 @@ regcache_raw_write (struct regcache *regcache, int regnum, regcache->descr->sizeof_register[regnum]) == 0)) return; - chain_before_save_inferior = save_inferior_ptid (); - inferior_ptid = regcache->ptid; - target_prepare_to_store (regcache); regcache_raw_set_cached_value (regcache, regnum, buf); /* Register a cleanup function for invalidating the register after it is written, in case of a failure. */ - chain_before_invalidate_register - = make_cleanup_regcache_invalidate (regcache, regnum); + old_chain = make_cleanup_regcache_invalidate (regcache, regnum); target_store_registers (regcache, regnum); /* The target did not throw an error so we can discard invalidating the register and restore the cleanup chain to what it was. */ - discard_cleanups (chain_before_invalidate_register); - - do_cleanups (chain_before_save_inferior); + discard_cleanups (old_chain); } void diff --git a/gdb/sol-thread.c b/gdb/sol-thread.c index e59c0cbbb34..7c1620a0f68 100644 --- a/gdb/sol-thread.c +++ b/gdb/sol-thread.c @@ -872,19 +872,13 @@ ps_ptwrite (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr, ps_err_e ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset) { - struct cleanup *old_chain; - struct regcache *regcache; - - old_chain = save_inferior_ptid (); - - inferior_ptid = ptid_build (ptid_get_pid (inferior_ptid), lwpid, 0); - regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ()); + ptid_t ptid = ptid_build (ptid_get_pid (inferior_ptid), lwpid, 0); + struct regcache *regcache + = get_thread_arch_regcache (ptid, target_gdbarch ()); target_fetch_registers (regcache, -1); fill_gregset (regcache, (gdb_gregset_t *) gregset, -1); - do_cleanups (old_chain); - return PS_OK; } @@ -894,19 +888,13 @@ ps_err_e ps_lsetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const prgregset_t gregset) { - struct cleanup *old_chain; - struct regcache *regcache; - - old_chain = save_inferior_ptid (); - - inferior_ptid = ptid_build (ptid_get_pid (inferior_ptid), lwpid, 0); - regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ()); + ptid_t ptid = ptid_build (ptid_get_pid (inferior_ptid), lwpid, 0); + struct regcache *regcache + = get_thread_arch_regcache (ptid, target_gdbarch ()); supply_gregset (regcache, (const gdb_gregset_t *) gregset); target_store_registers (regcache, -1); - do_cleanups (old_chain); - return PS_OK; } @@ -952,19 +940,13 @@ ps_err_e ps_lgetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prfpregset_t *fpregset) { - struct cleanup *old_chain; - struct regcache *regcache; - - old_chain = save_inferior_ptid (); - - inferior_ptid = ptid_build (ptid_get_pid (inferior_ptid), lwpid, 0); - regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ()); + ptid_t ptid = ptid_build (ptid_get_pid (inferior_ptid), lwpid, 0); + struct regcache *regcache + = get_thread_arch_regcache (ptid, target_gdbarch ()); target_fetch_registers (regcache, -1); fill_fpregset (regcache, (gdb_fpregset_t *) fpregset, -1); - do_cleanups (old_chain); - return PS_OK; } @@ -974,19 +956,13 @@ ps_err_e ps_lsetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, const prfpregset_t * fpregset) { - struct cleanup *old_chain; - struct regcache *regcache; - - old_chain = save_inferior_ptid (); - - inferior_ptid = ptid_build (ptid_get_pid (inferior_ptid), lwpid, 0); - regcache = get_thread_arch_regcache (inferior_ptid, target_gdbarch ()); + ptid_t ptid = ptid_build (ptid_get_pid (inferior_ptid), lwpid, 0); + struct regcache *regcache + = get_thread_arch_regcache (ptid, target_gdbarch ()); supply_fpregset (regcache, (const gdb_fpregset_t *) fpregset); target_store_registers (regcache, -1); - do_cleanups (old_chain); - return PS_OK; } diff --git a/gdb/target.c b/gdb/target.c index 359bf0dec9b..0ff8515d3b7 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3587,8 +3587,6 @@ debug_print_register (const char * func, void target_fetch_registers (struct regcache *regcache, int regno) { - gdb_assert (ptid_equal (regcache_get_ptid (regcache), inferior_ptid)); - current_target.to_fetch_registers (¤t_target, regcache, regno); if (targetdebug) debug_print_register ("target_fetch_registers", regcache, regno); @@ -3600,8 +3598,6 @@ target_store_registers (struct regcache *regcache, int regno) if (!may_write_registers) error (_("Writing to registers is not allowed (regno %d)"), regno); - gdb_assert (ptid_equal (regcache_get_ptid (regcache), inferior_ptid)); - current_target.to_store_registers (¤t_target, regcache, regno); if (targetdebug) { -- 2.30.2