Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@vmware.com>
To: teawater <teawater@gmail.com>
Cc: "gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Subject: Re: [reverse RFA] Change from "to_prepare_to_store" to "to_store_registers"
Date: Mon, 06 Oct 2008 01:33:00 -0000	[thread overview]
Message-ID: <48E96A51.1090506@vmware.com> (raw)
In-Reply-To: <daef60380810032333k3766f70cm7b26ff4978dde603@mail.gmail.com>

Good, please commit
(would you add the corresponding change to regcache.c too?)

teawater wrote:
> Hi,
> 
> To_prepare_to_store can make process record control the register
> change operation before set the value of regcache in function
> "regcache_raw_write". But it can't get the regnum.
> So I change it to "to_store_registers". It can get the regnum. And if
> record want cancel the operation the operation. It can invalidate the
> value with itself.
> 
> 2008-10-04  Hui Zhu  <teawater@gmail.com>
> 
>         Change from "to_prepare_to_store" to "to_store_registers".
> 
>         * record.c (record_beneath_to_prepare_to_store): Removed.
>         (record_beneath_to_store_registers): New function pointer.
>         Instead "record_beneath_to_prepare_to_store". Will point
>         to the low strata target "to_store_registers" function.
>         (record_prepare_to_store): Removed.
>         (record_store_registers): New function.
>         Instead "record_prepare_to_store". Record the change of
>         registers from GDB.
>         (init_record_ops): Change record_prepare_to_store to
>         record_store_registers.
>         * record.h (record_beneath_to_prepare_to_store): Removed.
>         (record_beneath_to_store_registers): New extern.
>         * target.c (update_current_target): Change
>         record_beneath_to_prepare_to_store to
>         record_beneath_to_store_registers.
> 
> Thanks,
> Hui
> 
> 
> ------------------------------------------------------------------------
> 
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,23 @@
> +2008-10-04  Hui Zhu  <teawater@gmail.com>
> +
> +	Change from "to_prepare_to_store" to "to_store_registers".
> +
> +	* record.c (record_beneath_to_prepare_to_store): Removed.
> +	(record_beneath_to_store_registers): New function pointer.
> +	Instead "record_beneath_to_prepare_to_store". Will point
> +	to the low strata target "to_store_registers" function.
> +	(record_prepare_to_store): Removed.
> +	(record_store_registers): New function.
> +	Instead "record_prepare_to_store". Record the change of
> +	registers from GDB.
> +	(init_record_ops): Change record_prepare_to_store to
> +	record_store_registers.
> +	* record.h (record_beneath_to_prepare_to_store): Removed.
> +	(record_beneath_to_store_registers): New extern.
> +	* target.c (update_current_target): Change
> +	record_beneath_to_prepare_to_store to
> +	record_beneath_to_store_registers.
> +
>  2008-10-02  Michael Snyder  <msnyder@vmware.com>
>  
>  	* reverse.c (reverse-continue): Remove a comma from docs string,
> --- a/record.c
> +++ b/record.c
> @@ -56,7 +56,7 @@ extern struct bp_location *bp_location_c
>  /* The real beneath function pointers.  */
>  void (*record_beneath_to_resume) (ptid_t, int, enum target_signal);
>  ptid_t (*record_beneath_to_wait) (ptid_t, struct target_waitstatus *);
> -void (*record_beneath_to_prepare_to_store) (struct regcache *);
> +void (*record_beneath_to_store_registers) (struct regcache *, int regno);
>  LONGEST (*record_beneath_to_xfer_partial) (struct target_ops * ops,
>  					   enum target_object object,
>  					   const char *annex,
> @@ -805,23 +805,51 @@ record_registers_change (struct regcache
>      }
>  }
>  
> -/* XXX: I don't know how to do if GDB call function target_store_registers
> -   without call function target_prepare_to_store.  */
> -
>  static void
> -record_prepare_to_store (struct regcache *regcache)
> +record_store_registers (struct regcache *regcache, int regno)
>  {
>    if (!record_not_record)
>      {
>        if (RECORD_IS_REPLAY)
>  	{
> +	  int n;
>  	  struct cleanup *old_cleanups;
> +
>  	  /* Let user choice if he want to write register or not.  */
> -	  if (!nquery (_("Becuse GDB is in replay mode, changing the value of a register will destroy the record from this point forward.  Change register %s?"),
> -		       gdbarch_register_name (get_regcache_arch
> -					      (regcache),
> -					      record_regcache_raw_write_regnum)))
> +	  if (regno < 0)
> +	    {
> +	      n =
> +		nquery (_
> +			("Becuse GDB is in replay mode, changing the value of a register will destroy the record from this point forward. Change all register?"));
> +	    }
> +	  else
> +	    {
> +	      n =
> +		nquery (_
> +			("Becuse GDB is in replay mode, changing the value of a register will destroy the record from this point forward. Change register %s?"),
> +			gdbarch_register_name (get_regcache_arch (regcache),
> +					       regno));
> +	    }
> +
> +	  if (!n)
>  	    {
> +	      /* Invalidate the value of regcache that set in function
> +	         "regcache_raw_write". */
> +	      if (regno < 0)
> +		{
> +		  int i;
> +		  for (i = 0;
> +		       i < gdbarch_num_regs (get_regcache_arch (regcache));
> +		       i++)
> +		    {
> +		      regcache_invalidate (regcache, i);
> +		    }
> +		}
> +	      else
> +		{
> +		  regcache_invalidate (regcache, regno);
> +		}
> +
>  	      error (_("Record: record cancel the operation."));
>  	    }
>  
> @@ -829,9 +857,9 @@ record_prepare_to_store (struct regcache
>  	  record_list_release_next ();
>  	}
>  
> -      record_registers_change (regcache, record_regcache_raw_write_regnum);
> +      record_registers_change (regcache, regno);
>      }
> -  record_beneath_to_prepare_to_store (regcache);
> +  record_beneath_to_store_registers (regcache, regno);
>  }
>  
>  /* record_xfer_partial -- behavior is conditional on RECORD_IS_REPLAY.
> @@ -964,7 +992,7 @@ init_record_ops (void)
>    record_ops.to_mourn_inferior = record_mourn_inferior;
>    record_ops.to_kill = record_kill;
>    record_ops.to_create_inferior = find_default_create_inferior;	/* Make record suppport command "run".  */
> -  record_ops.to_prepare_to_store = record_prepare_to_store;
> +  record_ops.to_store_registers = record_store_registers;
>    record_ops.to_xfer_partial = record_xfer_partial;
>    record_ops.to_insert_breakpoint = record_insert_breakpoint;
>    record_ops.to_remove_breakpoint = record_remove_breakpoint;
> --- a/record.h
> +++ b/record.h
> @@ -75,7 +75,6 @@ extern struct regcache *record_regcache;
>  
>  extern struct target_ops record_ops;
>  extern int record_resume_step;
> -extern int record_regcache_raw_write_regnum;
>  extern enum exec_direction_kind record_execdir;
>  
>  extern int record_arch_list_add_reg (int num);
> @@ -86,7 +85,7 @@ extern void record_not_record_set (void)
>  
>  extern void (*record_beneath_to_resume) (ptid_t, int, enum target_signal);
>  extern ptid_t (*record_beneath_to_wait) (ptid_t, struct target_waitstatus *);
> -extern void (*record_beneath_to_prepare_to_store) (struct regcache *);
> +extern void (*record_beneath_to_store_registers) (struct regcache *, int regno);
>  extern LONGEST (*record_beneath_to_xfer_partial) (struct target_ops * ops,
>  						  enum target_object object,
>  						  const char *annex,
> --- a/target.c
> +++ b/target.c
> @@ -380,7 +380,7 @@ update_current_target (void)
>  	current_target.FIELD = (TARGET)->FIELD
>  
>    record_beneath_to_resume = NULL;
> -  record_beneath_to_prepare_to_store = NULL;
> +  record_beneath_to_store_registers = NULL;
>    record_beneath_to_xfer_partial = NULL;
>    record_beneath_to_insert_breakpoint = NULL;
>    record_beneath_to_remove_breakpoint = NULL;
> @@ -485,9 +485,9 @@ update_current_target (void)
>               {
>                 record_beneath_to_wait = t->to_wait;
>               }
> -           if (!record_beneath_to_prepare_to_store)
> +           if (!record_beneath_to_store_registers)
>               {
> -               record_beneath_to_prepare_to_store = t->to_prepare_to_store;
> +               record_beneath_to_store_registers = t->to_store_registers;
>               }
>             if (!record_beneath_to_xfer_partial)
>               {


  reply	other threads:[~2008-10-06  1:33 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-04  6:34 teawater
2008-10-06  1:33 ` Michael Snyder [this message]
2008-10-06  7:49   ` teawater
2008-10-06 17:39     ` Michael Snyder
2008-10-06 23:00       ` teawater

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48E96A51.1090506@vmware.com \
    --to=msnyder@vmware.com \
    --cc=gdb-patches@sourceware.org \
    --cc=teawater@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox