Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Schimpe, Christina" <christina.schimpe@intel.com>
To: Guinevere Larsen <guinevere@redhat.com>,
	"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Subject: RE: [PATCH v3 5/7] gdb/record: extract the PC to record_full_instruction
Date: Fri, 29 May 2026 12:40:07 +0000	[thread overview]
Message-ID: <SN7PR11MB763892FB73F69292CCA6459BF9162@SN7PR11MB7638.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20260515163706.3355686-7-guinevere@redhat.com>

> -----Original Message-----
> From: Guinevere Larsen <guinevere@redhat.com>
> Sent: Freitag, 15. Mai 2026 18:37
> To: gdb-patches@sourceware.org
> Cc: Guinevere Larsen <guinevere@redhat.com>
> Subject: [PATCH v3 5/7] gdb/record: extract the PC to record_full_instruction
> 
> This commit makes it so the PC is not saved as part of the
> record_full_instruction effects, but rather gets a special location.
> That is because a couple of commands would really benefit from it being easy
> to find the PC (especially ones from record-btrace that's haven't been
> implemented to record-full yet, such as the ones in PR record/18059), while
> also possibly allowing for one fewer resizing of the effect vector (and saving
> an entire byte in the process).
> 
> This commit also refactored record_full_read_entry_from_bfd and
> record_full_write_entry_to_bfd, to make them methods of
> record_full_reg_entry and record_full_mem_entry, and also creates similar
> methods for record_full_entry and record_full_instruction.
> These could be turned into constructors in a future step of
> c++ification, but it felt like too much change for a single commit.
> ---
>  gdb/record-full.c | 386 ++++++++++++++++++++++++++++------------------
>  1 file changed, 239 insertions(+), 147 deletions(-)
> 
> diff --git a/gdb/record-full.c b/gdb/record-full.c index
> 8cabd6e9438..17696e07c0d 100644
> --- a/gdb/record-full.c
> +++ b/gdb/record-full.c
> @@ -143,6 +143,14 @@ struct record_full_mem_entry
> 
>    DISABLE_COPY_AND_ASSIGN (record_full_mem_entry);
> 
> +  /* Create a mem_entry from a bfd file, when restoring a recording.
> +*/
> +  static record_full_mem_entry from_bfd (bfd *cbfd, asection* osec,
> +					 int *bfd_offset);
> +
> +  /* Save this mem entry to a bfd file.  */
> +  void to_bfd (gdb_bfd_ref_ptr obfd, asection *osec, int *bfd_offset,
> +	       gdbarch *gdbarch);
> +

I believe only in one of those to_bfd functions the gdbarch parameter is used.
Did you intentionally keep it the function which don't have use the parameter in to_bfd ?

And it might be a good idea to describe the parameters a bit, too. 😊

>    gdb_byte *get_loc ()
>    {
>      if (len > sizeof (u.buf))
> @@ -252,6 +260,14 @@ struct record_full_reg_entry
> 
>    DISABLE_COPY_AND_ASSIGN (record_full_reg_entry);
> 
> +  /* Create a reg_entry from a bfd file, when restoring a recording.
> +*/
> +  static record_full_reg_entry from_bfd (bfd *cbfd, asection* osec,
> +					 int *bfd_offset);
> +
> +  /* Save this reg entry to a bfd file.  */
> +  void to_bfd (gdb_bfd_ref_ptr obfd, asection *osec, int *bfd_offset,
> +	       gdbarch *gdbarch);
> +
>    gdb_byte *get_loc ()
>    {
>      if (len > sizeof (u.buf))
> @@ -314,6 +330,13 @@ class record_full_entry
> 
>    DISABLE_COPY_AND_ASSIGN (record_full_entry);
> 
> +  /* Create a generic entry from a bfd file, when restoring a
> + recording.  */  static void from_bfd (bfd *cbfd, asection* osec, int
> + *bfd_offset);
> +
> +  /* Save this entry to a bfd file.  */
> +  void to_bfd (gdb_bfd_ref_ptr obfd, asection *osec, int *bfd_offset,
> +	       gdbarch *gdbarch);
> +
>    record_full_reg_entry& reg ()
>    {
>      gdb_assert (type () == record_full_reg); @@ -374,6 +397,7 @@ class
> record_full_entry
>       this one;
>     * sigval: Whether the inferior received a signal while the following
>       instruction was being recorded;
> +   * pc: The Program Counter for where the instruction starts;

"for where" sounds a bit odd, what do you think about:

The Program Counter at the start of the instruction.

>     * effects: A list of record_full_entry structures, each of which
>       describing one effect that the instruction has on the inferior.
> 
> @@ -388,10 +412,18 @@ struct record_full_instruction
>    uint32_t insn_num;
>    std::optional<gdb_signal> sigval;
>    std::vector<record_full_entry> effects;
> +  record_full_reg_entry pc;
> 
>    /* Execute the full instruction.  As a side effect, set
>       record_full_stop_reason.  */
>    void exec_insn (regcache *regcache);
> +
> +  /* Create a full recorded instruction from a bfd.  */  static void
> + from_bfd (bfd *cbfd, asection* osec, int *bfd_offset);
> +
> +  /* Save this instruction to a bfd file.  */
> +  void to_bfd (gdb_bfd_ref_ptr obfd, asection *osec, int *bfd_offset,
> +	       gdbarch *gdbarch);
>  };
> 
>  /* If true, query if PREC cannot record memory @@ -695,7 +727,10 @@
> record_full_arch_list_add_reg (struct regcache *regcache, int regnum)
> 
>    regcache->cooked_read (regnum, rec.get_loc ());
> 
> -  record_full_arch_list_add (rec);
> +  if (regnum == gdbarch_pc_regnum (regcache->arch ()))
> +      record_full_incomplete_instruction.pc = std::move (rec.reg ());
> + else
> +    record_full_arch_list_add (rec);

Nit: indent is only 2 spaces.

>    return 0;
>  }
> @@ -849,6 +884,7 @@ static enum target_stop_reason
> record_full_stop_reason
> 
>  void record_full_instruction::exec_insn (regcache *regcache)  {
> +  pc.execute (regcache);
>    for (auto &entry : effects)
>      if (entry.execute (regcache))
>        record_full_stop_reason = TARGET_STOPPED_BY_WATCHPOINT; @@ -
> 2207,68 +2243,88 @@ netorder32 (uint32_t input)
>    return ret;
>  }
> 
> -static void
> -record_full_read_entry_from_bfd (bfd *cbfd, asection *osec, int *bfd_offset)
> +record_full_reg_entry
> +record_full_reg_entry::from_bfd (bfd *cbfd, asection *osec, int
> +*bfd_offset)
>  {
> -  uint8_t rectype;
> -  uint32_t regnum, len;
> -  uint64_t addr;
> +  uint32_t regnum;
>    regcache *cache = get_thread_regcache (inferior_thread ());
> 
> +  /* Get register number to regnum.  */
> +  bfdcore_read (cbfd, osec, &regnum, sizeof (regnum),
> +		bfd_offset);
> +  regnum = netorder32 (regnum);
> +
> +  record_full_reg_entry reg (cache->arch (), regnum);
> +
> +  /* Get val.  */
> +  bfdcore_read (cbfd, osec, reg.get_loc (),
> +		reg.len, bfd_offset);
> +
> +  if (record_debug)
> +    gdb_printf (gdb_stdlog,
> +		"  Reading register %d (1 "
> +		"plus %lu plus %d bytes)\n",
> +		reg.num,
> +		(unsigned long) sizeof (regnum),
> +		reg.len);
> +  return reg;
> +
> +}
> +
> +record_full_mem_entry
> +record_full_mem_entry::from_bfd (bfd *cbfd, asection *osec, int
> +*bfd_offset) {
> +  uint32_t len;
> +  uint64_t addr;
> +
> +  /* Get len.  */
> +  bfdcore_read (cbfd, osec, &len, sizeof (len), bfd_offset);  len =
> + netorder32 (len);
> +
> +  /* Get addr.  */
> +  bfdcore_read (cbfd, osec, &addr, sizeof (addr),
> +		bfd_offset);
> +  addr = netorder64 (addr);
> +
> +  record_full_mem_entry mem (addr, len);
> +
> +  /* Get val.  */
> +  bfdcore_read (cbfd, osec, mem.get_loc (),
> +		len, bfd_offset);
> +
> +  if (record_debug)
> +    gdb_printf (gdb_stdlog,
> +		"  Reading memory %s (1 plus "
> +		"%lu plus %lu plus %d bytes)\n",
> +		paddress (get_current_arch (),
> +			  mem.addr),
> +		(unsigned long) sizeof (addr),
> +		(unsigned long) sizeof (len),
> +		len);
> +
> +  return mem;
> +}
> +
> +void
> +record_full_entry::from_bfd (bfd *cbfd, asection *osec, int
> +*bfd_offset) {
> +  uint8_t rectype;
> +  record_full_entry rec;
> +
>    bfdcore_read (cbfd, osec, &rectype, sizeof (rectype), bfd_offset);
>    switch (rectype)
>      {
>      case record_full_reg: /* reg */
>        {
> -	/* Get register number to regnum.  */
> -	bfdcore_read (cbfd, osec, &regnum, sizeof (regnum), bfd_offset);
> -	regnum = netorder32 (regnum);
> -
> -	record_full_entry rec (record_full_reg, cache->arch (), regnum);
> -
> -	/* Get val.  */
> -	bfdcore_read (cbfd, osec, rec.get_loc (),
> -		      rec.reg ().len, bfd_offset);
> -
> -	if (record_debug)
> -	  gdb_printf (gdb_stdlog,
> -		      "  Reading register %d (1 "
> -		      "plus %lu plus %d bytes)\n",
> -		      rec.reg ().num,
> -		      (unsigned long) sizeof (regnum),
> -		      rec.reg ().len);
> -
> -	record_full_arch_list_add (rec);
> +	rec.entry = std::move (record_full_reg_entry::from_bfd
> +				(cbfd, osec, bfd_offset));
>  	break;
>        }
> 
>      case record_full_mem: /* mem */
>        {
> -	/* Get len.  */
> -	bfdcore_read (cbfd, osec, &len, sizeof (len), bfd_offset);
> -	len = netorder32 (len);
> -
> -	/* Get addr.  */
> -	bfdcore_read (cbfd, osec, &addr, sizeof (addr),
> -		      bfd_offset);
> -	addr = netorder64 (addr);
> -
> -	record_full_entry rec (record_full_mem, addr, len);
> -
> -	/* Get val.  */
> -	bfdcore_read (cbfd, osec, rec.get_loc (), len, bfd_offset);
> -
> -	if (record_debug)
> -	  gdb_printf (gdb_stdlog,
> -		      "  Reading memory %s (1 plus "
> -		      "%lu plus %lu plus %d bytes)\n",
> -		      paddress (get_current_arch (),
> -				rec.mem ().addr),
> -		      (unsigned long) sizeof (addr),
> -		      (unsigned long) sizeof (len),
> -		      len);
> -
> -	record_full_arch_list_add (rec);
> +	rec.entry = std::move (record_full_mem_entry::from_bfd
> +				(cbfd, osec, bfd_offset));
>  	break;
>        }
> 
> @@ -2279,6 +2335,39 @@ record_full_read_entry_from_bfd (bfd *cbfd,
> asection *osec, int *bfd_offset)
>  			    bfd_get_filename (cbfd)));
>        break;
>      }
> +  record_full_arch_list_add (rec);
> +}
> +
> +void
> +record_full_instruction::from_bfd (bfd *cbfd, asection *osec, int
> +*bfd_offset) {
> +  uint32_t eff_count = 0;
> +  uint8_t sigval;
> +  uint32_t insn_num;
> +
> +  /* First read the generic information for an instruction.  */
> +  bfdcore_read (cbfd, osec, &sigval, sizeof (uint8_t), bfd_offset);
> +  bfdcore_read (cbfd, osec, &eff_count, sizeof (uint32_t),
> +		bfd_offset);
> +  bfdcore_read (cbfd, osec, &insn_num, sizeof (uint32_t),
> +		bfd_offset);
> +
> +  record_full_incomplete_instruction.insn_num = netorder32 (insn_num);
> + if (sigval != GDB_SIGNAL_0)
> +    record_full_incomplete_instruction.sigval = (gdb_signal) sigval;
> +
> +  record_full_incomplete_instruction.pc
> +    = record_full_reg_entry::from_bfd (cbfd, osec, bfd_offset);
> +
> +  eff_count = netorder32 (eff_count);
> +
> +  /* This deals with all the side effects.  */ while (eff_count > 0)
> +    {
> +      eff_count--;
> +
> +      record_full_entry::from_bfd (cbfd, osec, bfd_offset);
> +    }
>  }
> 
>  /* Restore the execution log from core file CBFD.  */ @@ -2325,30 +2414,8
> @@ record_full_restore (struct bfd &cbfd)
>        while (bfd_offset < osec_size)
>  	{
>  	  record_full_reset_incomplete ();
> -	  uint32_t eff_count = 0;
> -	  uint8_t sigval;
> -	  uint32_t insn_num;
> -
> -	  /* First read the generic information for an instruction.  */
> -	  bfdcore_read (&cbfd, osec, &sigval, sizeof (uint8_t), &bfd_offset);
> -	  bfdcore_read (&cbfd, osec, &eff_count, sizeof (uint32_t),
> -			&bfd_offset);
> -	  bfdcore_read (&cbfd, osec, &insn_num, sizeof (uint32_t),
> -			&bfd_offset);
> -
> -	  record_full_incomplete_instruction.insn_num = netorder32
> (insn_num);
> -	  if (sigval != GDB_SIGNAL_0)
> -	    record_full_incomplete_instruction.sigval = (gdb_signal) sigval;
> 
> -	  eff_count = netorder32 (eff_count);
> -
> -	  /* This deals with all the side effects.  */
> -	 while (eff_count > 0)
> -	   {
> -	     eff_count--;
> -
> -	     record_full_read_entry_from_bfd (&cbfd, osec, &bfd_offset);
> -	   }
> +	  record_full_instruction::from_bfd (&cbfd, osec, &bfd_offset);
> 
>  	  record_full_save_instruction ();
>  	}
> @@ -2404,71 +2471,109 @@ cmd_record_full_restore (const char *args, int
> from_tty)
>    record_full_open (nullptr, from_tty);  }
> 
> -static void
> -record_full_write_entry_to_bfd (record_full_entry &entry,
> -				gdb_bfd_ref_ptr obfd,
> -				asection *osec, int *bfd_offset,
> -				gdbarch *gdbarch)
> +void
> +record_full_reg_entry::to_bfd (gdb_bfd_ref_ptr obfd,
> +			       asection *osec, int *bfd_offset,
> +			       gdbarch *gdbarch)
> +{
> +  uint32_t regnum;
> +
> +  if (record_debug)
> +    gdb_printf (gdb_stdlog,
> +		"  Writing register %d (1 "
> +		"plus %lu plus %d bytes)\n",
> +		this->num,
> +		(unsigned long) sizeof (regnum),
> +		this->len);
> +
> +  /* Write regnum.  */
> +  regnum = netorder32 (this->num);
> +  bfdcore_write (obfd.get (), osec, &regnum, sizeof (regnum),
> + bfd_offset);
> +
> +  /* Write regval.  */
> +  bfdcore_write (obfd.get (), osec, this->get_loc (), this->len,
> +bfd_offset); }
> +
> +void
> +record_full_mem_entry::to_bfd (gdb_bfd_ref_ptr obfd,
> +			       asection *osec, int *bfd_offset,
> +			       gdbarch *gdbarch)
> +{
> +  uint32_t len;
> +  uint64_t addr;
> +
> +  if (record_debug)
> +    gdb_printf (gdb_stdlog,
> +		"  Writing memory %s (1 plus "
> +		"%lu plus %lu plus %d bytes)\n",
> +		paddress (gdbarch, this->addr),
> +		(unsigned long) sizeof (addr),
> +		(unsigned long) sizeof (len),
> +		this->len);
> +
> +  /* Write memlen.  */
> +  len = netorder32 (this->len);
> +  bfdcore_write (obfd.get (), osec, &len, sizeof (len), bfd_offset);
> +
> +  /* Write memaddr.  */
> +  addr = netorder64 (this->addr);
> +  bfdcore_write (obfd.get (), osec, &addr, sizeof (addr), bfd_offset);
> +
> +  /* Write memval.  */
> +  bfdcore_write (obfd.get (), osec, this->get_loc (), this->len,
> +bfd_offset); }
> +
> +void
> +record_full_entry::to_bfd (gdb_bfd_ref_ptr obfd, asection *osec,
> +			   int *bfd_offset, gdbarch *gdbarch)
>  {
>    /* Save entry.  */
>    uint8_t type;
> -  uint32_t regnum, len;
> -  uint64_t addr;
> 
> -  type = entry.type ();
> +  type = this->type ();
>    bfdcore_write (obfd.get (), osec, &type, sizeof (type), bfd_offset);
> 
>    switch (type)
>      {
>      case record_full_reg: /* reg */
> -      {
> -	auto &reg = entry.reg ();
> -	if (record_debug)
> -	  gdb_printf (gdb_stdlog,
> -		      "  Writing register %d (1 "
> -		      "plus %lu plus %d bytes)\n",
> -		      reg.num,
> -		      (unsigned long) sizeof (regnum),
> -		      reg.len);
> -
> -	/* Write regnum.  */
> -	regnum = netorder32 (reg.num);
> -	bfdcore_write (obfd.get (), osec, &regnum, sizeof (regnum),
> bfd_offset);
> -
> -	/* Write regval.  */
> -	bfdcore_write (obfd.get (), osec, entry.get_loc (), reg.len, bfd_offset);
> -	break;
> -      }
> +      reg ().to_bfd (obfd, osec, bfd_offset, gdbarch);
> +      break;
> 
>      case record_full_mem: /* mem */
> -      {
> -	auto &mem = entry.mem ();
> -	if (record_debug)
> -	  gdb_printf (gdb_stdlog,
> -		      "  Writing memory %s (1 plus "
> -		      "%lu plus %lu plus %d bytes)\n",
> -		      paddress (gdbarch, mem.addr),
> -		      (unsigned long) sizeof (addr),
> -		      (unsigned long) sizeof (len),
> -		      mem.len);
> -
> -	/* Write memlen.  */
> -	len = netorder32 (mem.len);
> -	bfdcore_write (obfd.get (), osec, &len, sizeof (len), bfd_offset);
> -
> -	/* Write memaddr.  */
> -	addr = netorder64 (mem.addr);
> -	bfdcore_write (obfd.get (), osec, &addr, sizeof (addr), bfd_offset);
> -
> -	/* Write memval.  */
> -	bfdcore_write (obfd.get (), osec, entry.get_loc (), mem.len,
> -		       bfd_offset);
> -	break;
> -      }
> +      mem ().to_bfd (obfd, osec, bfd_offset, gdbarch);
> +      break;
>      }
> 
>  }
> 
> +void
> +record_full_instruction::to_bfd (gdb_bfd_ref_ptr obfd, asection *osec,
> +				 int *bfd_offset, gdbarch *gdbarch) {
> +  uint32_t eff_count = (uint32_t) this->effects.size ();
> +  uint32_t insn_num = this->insn_num;
> +  uint8_t sigval = (this->sigval.has_value ())
> +		     ? this->sigval.value ()
> +		     : GDB_SIGNAL_0;
> +
> +  /* Signal.  */
> +  bfdcore_write (obfd.get (), osec, &sigval, sizeof (sigval),
> +bfd_offset);
> +  eff_count = netorder32 (eff_count);
> +  /* Number of effects.  */
> +  bfdcore_write (obfd.get (), osec, &eff_count, sizeof (eff_count),
> +		 bfd_offset);
> +  /* Instruction number.  */
> +  bfdcore_write (obfd.get (), osec, &insn_num, sizeof (uint32_t),
> +		 bfd_offset);
> +
> +  this->pc.to_bfd (obfd, osec, bfd_offset, gdbarch);
> +
> +  for (auto &entry : this->effects)
> +    {
> +      entry.to_bfd (obfd, osec, bfd_offset, gdbarch);
> +    }
> +}
> +
>  /* Save the execution log to a file.  We use a modified elf corefile
>     format, with an extra section for our data.  */
> 
> @@ -2510,6 +2615,7 @@ record_full_base_target::save_record (const char
> *recfilename)
>      {
>        /* Number of effects of an instruction.  */
>        save_size += sizeof (uint32_t) + sizeof (uint8_t) + sizeof (uint32_t);
> +      save_size += 4 + record_full_list[i].pc.len;
>        for (auto &entry : record_full_list[i].effects)
>  	switch (entry.type ())
>  	  {
> @@ -2551,27 +2657,7 @@ record_full_base_target::save_record (const char
> *recfilename)
>       record list.  */
>    for (int i = 0; i < record_full_list.size (); i++)
>      {
> -      uint32_t eff_count = (uint32_t) record_full_list[i].effects.size ();
> -      uint32_t insn_num = record_full_list[i].insn_num;
> -      uint8_t sigval = (record_full_list[i].sigval.has_value ())
> -			 ? record_full_list[i].sigval.value ()
> -			 : GDB_SIGNAL_0;
> -
> -      /* Signal.  */
> -      bfdcore_write (obfd.get (), osec, &sigval, sizeof (sigval), &bfd_offset);
> -      eff_count = netorder32 (eff_count);
> -      /* Number of effects.  */
> -      bfdcore_write (obfd.get (), osec, &eff_count, sizeof (eff_count),
> -		     &bfd_offset);
> -      /* Instruction number.  */
> -      bfdcore_write (obfd.get (), osec, &insn_num, sizeof (uint32_t),
> -		     &bfd_offset);
> -
> -      for (auto &entry : record_full_list[i].effects)
> -	{
> -	  record_full_write_entry_to_bfd (entry, obfd, osec, &bfd_offset,
> -					  gdbarch);
> -	}
> +      record_full_list[i].to_bfd (obfd, osec, &bfd_offset, gdbarch);
>        /* Execute entry.  */
>        if (i < record_full_next_insn)
>  	record_full_list[i].exec_insn (regcache); @@ -2648,6 +2734,9 @@
> maintenance_print_record_instruction (const char *args, int from_tty)
>    auto to_print = record_full_list.begin () + offset;
> 
>    gdbarch *arch = current_inferior ()->arch ();
> +  struct value_print_options opts;
> +  get_user_print_options (&opts);
> +  opts.raw = true;
> 
>    for (auto &entry : to_print->effects)
>      {
> @@ -2661,9 +2750,6 @@ maintenance_print_record_instruction (const char
> *args, int from_tty)
>  					 entry.get_loc ());
>  	      gdb_printf ("Register %s changed: ",
>  			  gdbarch_register_name (arch, entry.reg ().num));
> -	      struct value_print_options opts;
> -	      get_user_print_options (&opts);
> -	      opts.raw = true;
>  	      value_print (val, gdb_stdout, &opts);
>  	      gdb_printf ("\n");
>  	      break;
> @@ -2682,6 +2768,12 @@ maintenance_print_record_instruction (const
> char *args, int from_tty)
>  	    }
>  	}
>      }
> +  type *regtype = gdbarch_register_type (arch, to_print->pc.num);
> +  value *val = value_from_contents (regtype, to_print->pc.get_loc ());
> +  gdb_printf ("Register %s changed: ",
> +	      gdbarch_register_name (arch, to_print->pc.num));
> +  value_print (val, gdb_stdout, &opts);
> +  gdb_printf ("\n");
>  }
> 
>  INIT_GDB_FILE (record_full)
> --
> 2.54.0
> 

Besides those nits, LGTM:

Reviewed-By: Christina Schimpe <christina.schimpe@intel.com>

Christina
Intel Deutschland GmbH
Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany
Tel: +49 89 991 430, www.intel.de
Managing Directors: Harry Demas, Jeffrey Schneiderman, Yin Chong Sorrell
Chairperson of the Supervisory Board: Nicole Lau
Registered Seat: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

  parent reply	other threads:[~2026-05-29 12:40 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-15 16:36 [PATCH v3 0/7] refactor the internals of record-full Guinevere Larsen
2026-05-15 16:36 ` [PATCH v3 1/7] gdb/record: Refactor record history Guinevere Larsen
2026-05-26  8:33   ` Schimpe, Christina
2026-05-28 13:20     ` Guinevere Larsen
2026-05-29 13:47       ` Schimpe, Christina
2026-05-15 16:36 ` [PATCH v3 2/7] gdb/record: remove record_full_insn_num Guinevere Larsen
2026-05-26  8:35   ` Schimpe, Christina
2026-05-15 16:37 ` [PATCH v3 3/7] gdb/record: c++ify internal structures of record-full.c Guinevere Larsen
2026-05-26  9:00   ` Schimpe, Christina
2026-05-27 20:13     ` Guinevere Larsen
2026-05-29 12:09       ` Schimpe, Christina
2026-05-29 16:38         ` Guinevere Larsen
2026-05-15 16:37 ` [PATCH v3 4/7] gdb/record: make record_full_history more c++-like Guinevere Larsen
2026-05-16  1:03   ` Thiago Jung Bauermann
2026-05-26  9:04   ` Schimpe, Christina
2026-05-26 20:07     ` Guinevere Larsen
2026-05-15 16:37 ` [PATCH v3 5/6] gdb/record: Define new version of the record-save section Guinevere Larsen
2026-05-15 16:37 ` [PATCH v3 5/7] gdb/record: extract the PC to record_full_instruction Guinevere Larsen
2026-05-16  1:04   ` Thiago Jung Bauermann
2026-05-29 12:40   ` Schimpe, Christina [this message]
2026-06-01 20:24     ` Guinevere Larsen
2026-05-15 16:37 ` [PATCH v3 6/7] gdb/record: Define new version of the record-save section Guinevere Larsen
2026-05-15 16:37 ` [PATCH v3 6/6] gdb/record: rename record_full_list to record_full_log Guinevere Larsen
2026-05-29 12:05   ` Schimpe, Christina
2026-05-15 16:37 ` [PATCH v3 7/7] " Guinevere Larsen
2026-05-16  1:07   ` Thiago Jung Bauermann
2026-05-15 17:45 ` [PATCH v3 0/7] refactor the internals of record-full Guinevere Larsen

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=SN7PR11MB763892FB73F69292CCA6459BF9162@SN7PR11MB7638.namprd11.prod.outlook.com \
    --to=christina.schimpe@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=guinevere@redhat.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