From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michael Snyder To: Andrew Cagney Cc: gdb-patches@sources.redhat.com Subject: Re: [PATCH] pseudo-register un-optimization Date: Mon, 13 Aug 2001 11:23:00 -0000 Message-id: <3B7819F8.6AA0FF98@cygnus.com> References: <3B7456F6.5596AE84@cygnus.com> <3B7473C0.5020702@cygnus.com> X-SW-Source: 2001-08/msg00141.html Andrew Cagney wrote: > > > > > > > 2001-08-10 Michael Snyder > > > > * regcache.c (legacy_write_register_gen): Don't 'optimize out' > > a write_register to a pseudo-reg. Target_store_pseudo_register > > needs to get called, because these regs may be computed and may > > have side-effects. > > Michael, can you expand a little? This is legacy code, so as long as > this change is to keep an old target working, I'm not too fussed. > > However, if this is for a new target then it should really be looking at > gdbarch_register_{read,write} and bypassing the legacy mess entirely. This is fixing an earlier change that broke part of the intended functionality of pseudo-registers. The pseudo-register store method should be called any time that the pseudo-register is modified, even if the pseudo-register is an alias for a real register. This is so that modifying a pseudo-register can have enforced side-effects such as re-computing other pseudo-registers. > > Andrew > > > Index: regcache.c > > =================================================================== > > RCS file: /cvs/src/src/gdb/regcache.c,v > > retrieving revision 1.24 > > diff -c -3 -p -r1.24 regcache.c > > *** regcache.c 2001/06/15 23:50:46 1.24 > > --- regcache.c 2001/08/10 21:49:23 > > *************** legacy_write_register_gen (int regnum, c > > *** 334,348 **** > > > > size = REGISTER_RAW_SIZE (regnum); > > > > - /* If we have a valid copy of the register, and new value == old value, > > - then don't bother doing the actual store. */ > > - > > - if (register_cached (regnum) > > - && memcmp (register_buffer (regnum), myaddr, size) == 0) > > - return; > > - > > if (real_register (regnum)) > > ! target_prepare_to_store (); > > > > memcpy (register_buffer (regnum), myaddr, size); > > > > --- 334,349 ---- > > > > size = REGISTER_RAW_SIZE (regnum); > > > > if (real_register (regnum)) > > ! { > > ! /* If we have a valid copy of the register, and new value == old > > ! value, then don't bother doing the actual store. */ > > ! if (register_cached (regnum) > > ! && memcmp (register_buffer (regnum), myaddr, size) == 0) > > ! return; > > ! else > > ! target_prepare_to_store (); > > ! } > > > > memcpy (register_buffer (regnum), myaddr, size); > > > >