xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/record-full.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* Process record and replay target for GDB, the GNU debugger.
2 
3    Copyright (C) 2013-2023 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 #include "defs.h"
21 #include "gdbcmd.h"
22 #include "regcache.h"
23 #include "gdbthread.h"
24 #include "inferior.h"
25 #include "event-top.h"
26 #include "completer.h"
27 #include "arch-utils.h"
28 #include "gdbcore.h"
29 #include "exec.h"
30 #include "record.h"
31 #include "record-full.h"
32 #include "elf-bfd.h"
33 #include "gcore.h"
34 #include "gdbsupport/event-loop.h"
35 #include "inf-loop.h"
36 #include "gdb_bfd.h"
37 #include "observable.h"
38 #include "infrun.h"
39 #include "gdbsupport/gdb_unlinker.h"
40 #include "gdbsupport/byte-vector.h"
41 #include "async-event.h"
42 
43 #include <signal.h>
44 
45 /* This module implements "target record-full", also known as "process
46    record and replay".  This target sits on top of a "normal" target
47    (a target that "has execution"), and provides a record and replay
48    functionality, including reverse debugging.
49 
50    Target record has two modes: recording, and replaying.
51 
52    In record mode, we intercept the resume and wait methods.
53    Whenever gdb resumes the target, we run the target in single step
54    mode, and we build up an execution log in which, for each executed
55    instruction, we record all changes in memory and register state.
56    This is invisible to the user, to whom it just looks like an
57    ordinary debugging session (except for performance degradation).
58 
59    In replay mode, instead of actually letting the inferior run as a
60    process, we simulate its execution by playing back the recorded
61    execution log.  For each instruction in the log, we simulate the
62    instruction's side effects by duplicating the changes that it would
63    have made on memory and registers.  */
64 
65 #define DEFAULT_RECORD_FULL_INSN_MAX_NUM	200000
66 
67 #define RECORD_FULL_IS_REPLAY \
68   (record_full_list->next || ::execution_direction == EXEC_REVERSE)
69 
70 #define RECORD_FULL_FILE_MAGIC	netorder32(0x20091016)
71 
72 /* These are the core structs of the process record functionality.
73 
74    A record_full_entry is a record of the value change of a register
75    ("record_full_reg") or a part of memory ("record_full_mem").  And each
76    instruction must have a struct record_full_entry ("record_full_end")
77    that indicates that this is the last struct record_full_entry of this
78    instruction.
79 
80    Each struct record_full_entry is linked to "record_full_list" by "prev"
81    and "next" pointers.  */
82 
83 struct record_full_mem_entry
84 {
85   CORE_ADDR addr;
86   int len;
87   /* Set this flag if target memory for this entry
88      can no longer be accessed.  */
89   int mem_entry_not_accessible;
90   union
91   {
92     gdb_byte *ptr;
93     gdb_byte buf[sizeof (gdb_byte *)];
94   } u;
95 };
96 
97 struct record_full_reg_entry
98 {
99   unsigned short num;
100   unsigned short len;
101   union
102   {
103     gdb_byte *ptr;
104     gdb_byte buf[2 * sizeof (gdb_byte *)];
105   } u;
106 };
107 
108 struct record_full_end_entry
109 {
110   enum gdb_signal sigval;
111   ULONGEST insn_num;
112 };
113 
114 enum record_full_type
115 {
116   record_full_end = 0,
117   record_full_reg,
118   record_full_mem
119 };
120 
121 /* This is the data structure that makes up the execution log.
122 
123    The execution log consists of a single linked list of entries
124    of type "struct record_full_entry".  It is doubly linked so that it
125    can be traversed in either direction.
126 
127    The start of the list is anchored by a struct called
128    "record_full_first".  The pointer "record_full_list" either points
129    to the last entry that was added to the list (in record mode), or to
130    the next entry in the list that will be executed (in replay mode).
131 
132    Each list element (struct record_full_entry), in addition to next
133    and prev pointers, consists of a union of three entry types: mem,
134    reg, and end.  A field called "type" determines which entry type is
135    represented by a given list element.
136 
137    Each instruction that is added to the execution log is represented
138    by a variable number of list elements ('entries').  The instruction
139    will have one "reg" entry for each register that is changed by
140    executing the instruction (including the PC in every case).  It
141    will also have one "mem" entry for each memory change.  Finally,
142    each instruction will have an "end" entry that separates it from
143    the changes associated with the next instruction.  */
144 
145 struct record_full_entry
146 {
147   struct record_full_entry *prev;
148   struct record_full_entry *next;
149   enum record_full_type type;
150   union
151   {
152     /* reg */
153     struct record_full_reg_entry reg;
154     /* mem */
155     struct record_full_mem_entry mem;
156     /* end */
157     struct record_full_end_entry end;
158   } u;
159 };
160 
161 /* If true, query if PREC cannot record memory
162    change of next instruction.  */
163 bool record_full_memory_query = false;
164 
165 struct record_full_core_buf_entry
166 {
167   struct record_full_core_buf_entry *prev;
168   struct target_section *p;
169   bfd_byte *buf;
170 };
171 
172 /* Record buf with core target.  */
173 static detached_regcache *record_full_core_regbuf = NULL;
174 static target_section_table record_full_core_sections;
175 static struct record_full_core_buf_entry *record_full_core_buf_list = NULL;
176 
177 /* The following variables are used for managing the linked list that
178    represents the execution log.
179 
180    record_full_first is the anchor that holds down the beginning of
181    the list.
182 
183    record_full_list serves two functions:
184      1) In record mode, it anchors the end of the list.
185      2) In replay mode, it traverses the list and points to
186 	the next instruction that must be emulated.
187 
188    record_full_arch_list_head and record_full_arch_list_tail are used
189    to manage a separate list, which is used to build up the change
190    elements of the currently executing instruction during record mode.
191    When this instruction has been completely annotated in the "arch
192    list", it will be appended to the main execution log.  */
193 
194 static struct record_full_entry record_full_first;
195 static struct record_full_entry *record_full_list = &record_full_first;
196 static struct record_full_entry *record_full_arch_list_head = NULL;
197 static struct record_full_entry *record_full_arch_list_tail = NULL;
198 
199 /* true ask user. false auto delete the last struct record_full_entry.  */
200 static bool record_full_stop_at_limit = true;
201 /* Maximum allowed number of insns in execution log.  */
202 static unsigned int record_full_insn_max_num
203 	= DEFAULT_RECORD_FULL_INSN_MAX_NUM;
204 /* Actual count of insns presently in execution log.  */
205 static unsigned int record_full_insn_num = 0;
206 /* Count of insns logged so far (may be larger
207    than count of insns presently in execution log).  */
208 static ULONGEST record_full_insn_count;
209 
210 static const char record_longname[]
211   = N_("Process record and replay target");
212 static const char record_doc[]
213   = N_("Log program while executing and replay execution from log.");
214 
215 /* Base class implementing functionality common to both the
216    "record-full" and "record-core" targets.  */
217 
218 class record_full_base_target : public target_ops
219 {
220 public:
221   const target_info &info () const override = 0;
222 
223   strata stratum () const override { return record_stratum; }
224 
225   void close () override;
226   void async (bool) override;
227   ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override;
228   bool stopped_by_watchpoint () override;
229   bool stopped_data_address (CORE_ADDR *) override;
230 
231   bool stopped_by_sw_breakpoint () override;
232   bool supports_stopped_by_sw_breakpoint () override;
233 
234   bool stopped_by_hw_breakpoint () override;
235   bool supports_stopped_by_hw_breakpoint () override;
236 
237   bool can_execute_reverse () override;
238 
239   /* Add bookmark target methods.  */
240   gdb_byte *get_bookmark (const char *, int) override;
241   void goto_bookmark (const gdb_byte *, int) override;
242   enum exec_direction_kind execution_direction () override;
243   enum record_method record_method (ptid_t ptid) override;
244   void info_record () override;
245   void save_record (const char *filename) override;
246   bool supports_delete_record () override;
247   void delete_record () override;
248   bool record_is_replaying (ptid_t ptid) override;
249   bool record_will_replay (ptid_t ptid, int dir) override;
250   void record_stop_replaying () override;
251   void goto_record_begin () override;
252   void goto_record_end () override;
253   void goto_record (ULONGEST insn) override;
254 };
255 
256 /* The "record-full" target.  */
257 
258 static const target_info record_full_target_info = {
259   "record-full",
260   record_longname,
261   record_doc,
262 };
263 
264 class record_full_target final : public record_full_base_target
265 {
266 public:
267   const target_info &info () const override
268   { return record_full_target_info; }
269 
270   void resume (ptid_t, int, enum gdb_signal) override;
271   void disconnect (const char *, int) override;
272   void detach (inferior *, int) override;
273   void mourn_inferior () override;
274   void kill () override;
275   void store_registers (struct regcache *, int) override;
276   enum target_xfer_status xfer_partial (enum target_object object,
277 					const char *annex,
278 					gdb_byte *readbuf,
279 					const gdb_byte *writebuf,
280 					ULONGEST offset, ULONGEST len,
281 					ULONGEST *xfered_len) override;
282   int insert_breakpoint (struct gdbarch *,
283 			 struct bp_target_info *) override;
284   int remove_breakpoint (struct gdbarch *,
285 			 struct bp_target_info *,
286 			 enum remove_bp_reason) override;
287 };
288 
289 /* The "record-core" target.  */
290 
291 static const target_info record_full_core_target_info = {
292   "record-core",
293   record_longname,
294   record_doc,
295 };
296 
297 class record_full_core_target final : public record_full_base_target
298 {
299 public:
300   const target_info &info () const override
301   { return record_full_core_target_info; }
302 
303   void resume (ptid_t, int, enum gdb_signal) override;
304   void disconnect (const char *, int) override;
305   void kill () override;
306   void fetch_registers (struct regcache *regcache, int regno) override;
307   void prepare_to_store (struct regcache *regcache) override;
308   void store_registers (struct regcache *, int) override;
309   enum target_xfer_status xfer_partial (enum target_object object,
310 					const char *annex,
311 					gdb_byte *readbuf,
312 					const gdb_byte *writebuf,
313 					ULONGEST offset, ULONGEST len,
314 					ULONGEST *xfered_len) override;
315   int insert_breakpoint (struct gdbarch *,
316 			 struct bp_target_info *) override;
317   int remove_breakpoint (struct gdbarch *,
318 			 struct bp_target_info *,
319 			 enum remove_bp_reason) override;
320 
321   bool has_execution (inferior *inf) override;
322 };
323 
324 static record_full_target record_full_ops;
325 static record_full_core_target record_full_core_ops;
326 
327 void
328 record_full_target::detach (inferior *inf, int from_tty)
329 {
330   record_detach (this, inf, from_tty);
331 }
332 
333 void
334 record_full_target::disconnect (const char *args, int from_tty)
335 {
336   record_disconnect (this, args, from_tty);
337 }
338 
339 void
340 record_full_core_target::disconnect (const char *args, int from_tty)
341 {
342   record_disconnect (this, args, from_tty);
343 }
344 
345 void
346 record_full_target::mourn_inferior ()
347 {
348   record_mourn_inferior (this);
349 }
350 
351 void
352 record_full_target::kill ()
353 {
354   record_kill (this);
355 }
356 
357 /* See record-full.h.  */
358 
359 int
360 record_full_is_used (void)
361 {
362   struct target_ops *t;
363 
364   t = find_record_target ();
365   return (t == &record_full_ops
366 	  || t == &record_full_core_ops);
367 }
368 
369 
370 /* Command lists for "set/show record full".  */
371 static struct cmd_list_element *set_record_full_cmdlist;
372 static struct cmd_list_element *show_record_full_cmdlist;
373 
374 /* Command list for "record full".  */
375 static struct cmd_list_element *record_full_cmdlist;
376 
377 static void record_full_goto_insn (struct record_full_entry *entry,
378 				   enum exec_direction_kind dir);
379 
380 /* Alloc and free functions for record_full_reg, record_full_mem, and
381    record_full_end entries.  */
382 
383 /* Alloc a record_full_reg record entry.  */
384 
385 static inline struct record_full_entry *
386 record_full_reg_alloc (struct regcache *regcache, int regnum)
387 {
388   struct record_full_entry *rec;
389   struct gdbarch *gdbarch = regcache->arch ();
390 
391   rec = XCNEW (struct record_full_entry);
392   rec->type = record_full_reg;
393   rec->u.reg.num = regnum;
394   rec->u.reg.len = register_size (gdbarch, regnum);
395   if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
396     rec->u.reg.u.ptr = (gdb_byte *) xmalloc (rec->u.reg.len);
397 
398   return rec;
399 }
400 
401 /* Free a record_full_reg record entry.  */
402 
403 static inline void
404 record_full_reg_release (struct record_full_entry *rec)
405 {
406   gdb_assert (rec->type == record_full_reg);
407   if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
408     xfree (rec->u.reg.u.ptr);
409   xfree (rec);
410 }
411 
412 /* Alloc a record_full_mem record entry.  */
413 
414 static inline struct record_full_entry *
415 record_full_mem_alloc (CORE_ADDR addr, int len)
416 {
417   struct record_full_entry *rec;
418 
419   rec = XCNEW (struct record_full_entry);
420   rec->type = record_full_mem;
421   rec->u.mem.addr = addr;
422   rec->u.mem.len = len;
423   if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
424     rec->u.mem.u.ptr = (gdb_byte *) xmalloc (len);
425 
426   return rec;
427 }
428 
429 /* Free a record_full_mem record entry.  */
430 
431 static inline void
432 record_full_mem_release (struct record_full_entry *rec)
433 {
434   gdb_assert (rec->type == record_full_mem);
435   if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
436     xfree (rec->u.mem.u.ptr);
437   xfree (rec);
438 }
439 
440 /* Alloc a record_full_end record entry.  */
441 
442 static inline struct record_full_entry *
443 record_full_end_alloc (void)
444 {
445   struct record_full_entry *rec;
446 
447   rec = XCNEW (struct record_full_entry);
448   rec->type = record_full_end;
449 
450   return rec;
451 }
452 
453 /* Free a record_full_end record entry.  */
454 
455 static inline void
456 record_full_end_release (struct record_full_entry *rec)
457 {
458   xfree (rec);
459 }
460 
461 /* Free one record entry, any type.
462    Return entry->type, in case caller wants to know.  */
463 
464 static inline enum record_full_type
465 record_full_entry_release (struct record_full_entry *rec)
466 {
467   enum record_full_type type = rec->type;
468 
469   switch (type) {
470   case record_full_reg:
471     record_full_reg_release (rec);
472     break;
473   case record_full_mem:
474     record_full_mem_release (rec);
475     break;
476   case record_full_end:
477     record_full_end_release (rec);
478     break;
479   }
480   return type;
481 }
482 
483 /* Free all record entries in list pointed to by REC.  */
484 
485 static void
486 record_full_list_release (struct record_full_entry *rec)
487 {
488   if (!rec)
489     return;
490 
491   while (rec->next)
492     rec = rec->next;
493 
494   while (rec->prev)
495     {
496       rec = rec->prev;
497       record_full_entry_release (rec->next);
498     }
499 
500   if (rec == &record_full_first)
501     {
502       record_full_insn_num = 0;
503       record_full_first.next = NULL;
504     }
505   else
506     record_full_entry_release (rec);
507 }
508 
509 /* Free all record entries forward of the given list position.  */
510 
511 static void
512 record_full_list_release_following (struct record_full_entry *rec)
513 {
514   struct record_full_entry *tmp = rec->next;
515 
516   rec->next = NULL;
517   while (tmp)
518     {
519       rec = tmp->next;
520       if (record_full_entry_release (tmp) == record_full_end)
521 	{
522 	  record_full_insn_num--;
523 	  record_full_insn_count--;
524 	}
525       tmp = rec;
526     }
527 }
528 
529 /* Delete the first instruction from the beginning of the log, to make
530    room for adding a new instruction at the end of the log.
531 
532    Note -- this function does not modify record_full_insn_num.  */
533 
534 static void
535 record_full_list_release_first (void)
536 {
537   struct record_full_entry *tmp;
538 
539   if (!record_full_first.next)
540     return;
541 
542   /* Loop until a record_full_end.  */
543   while (1)
544     {
545       /* Cut record_full_first.next out of the linked list.  */
546       tmp = record_full_first.next;
547       record_full_first.next = tmp->next;
548       tmp->next->prev = &record_full_first;
549 
550       /* tmp is now isolated, and can be deleted.  */
551       if (record_full_entry_release (tmp) == record_full_end)
552 	break;	/* End loop at first record_full_end.  */
553 
554       if (!record_full_first.next)
555 	{
556 	  gdb_assert (record_full_insn_num == 1);
557 	  break;	/* End loop when list is empty.  */
558 	}
559     }
560 }
561 
562 /* Add a struct record_full_entry to record_full_arch_list.  */
563 
564 static void
565 record_full_arch_list_add (struct record_full_entry *rec)
566 {
567   if (record_debug > 1)
568     gdb_printf (gdb_stdlog,
569 		"Process record: record_full_arch_list_add %s.\n",
570 		host_address_to_string (rec));
571 
572   if (record_full_arch_list_tail)
573     {
574       record_full_arch_list_tail->next = rec;
575       rec->prev = record_full_arch_list_tail;
576       record_full_arch_list_tail = rec;
577     }
578   else
579     {
580       record_full_arch_list_head = rec;
581       record_full_arch_list_tail = rec;
582     }
583 }
584 
585 /* Return the value storage location of a record entry.  */
586 static inline gdb_byte *
587 record_full_get_loc (struct record_full_entry *rec)
588 {
589   switch (rec->type) {
590   case record_full_mem:
591     if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
592       return rec->u.mem.u.ptr;
593     else
594       return rec->u.mem.u.buf;
595   case record_full_reg:
596     if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
597       return rec->u.reg.u.ptr;
598     else
599       return rec->u.reg.u.buf;
600   case record_full_end:
601   default:
602     gdb_assert_not_reached ("unexpected record_full_entry type");
603     return NULL;
604   }
605 }
606 
607 /* Record the value of a register NUM to record_full_arch_list.  */
608 
609 int
610 record_full_arch_list_add_reg (struct regcache *regcache, int regnum)
611 {
612   struct record_full_entry *rec;
613 
614   if (record_debug > 1)
615     gdb_printf (gdb_stdlog,
616 		"Process record: add register num = %d to "
617 		"record list.\n",
618 		regnum);
619 
620   rec = record_full_reg_alloc (regcache, regnum);
621 
622   regcache->raw_read (regnum, record_full_get_loc (rec));
623 
624   record_full_arch_list_add (rec);
625 
626   return 0;
627 }
628 
629 /* Record the value of a region of memory whose address is ADDR and
630    length is LEN to record_full_arch_list.  */
631 
632 int
633 record_full_arch_list_add_mem (CORE_ADDR addr, int len)
634 {
635   struct record_full_entry *rec;
636 
637   if (record_debug > 1)
638     gdb_printf (gdb_stdlog,
639 		"Process record: add mem addr = %s len = %d to "
640 		"record list.\n",
641 		paddress (target_gdbarch (), addr), len);
642 
643   if (!addr)	/* FIXME: Why?  Some arch must permit it...  */
644     return 0;
645 
646   rec = record_full_mem_alloc (addr, len);
647 
648   if (record_read_memory (target_gdbarch (), addr,
649 			  record_full_get_loc (rec), len))
650     {
651       record_full_mem_release (rec);
652       return -1;
653     }
654 
655   record_full_arch_list_add (rec);
656 
657   return 0;
658 }
659 
660 /* Add a record_full_end type struct record_full_entry to
661    record_full_arch_list.  */
662 
663 int
664 record_full_arch_list_add_end (void)
665 {
666   struct record_full_entry *rec;
667 
668   if (record_debug > 1)
669     gdb_printf (gdb_stdlog,
670 		"Process record: add end to arch list.\n");
671 
672   rec = record_full_end_alloc ();
673   rec->u.end.sigval = GDB_SIGNAL_0;
674   rec->u.end.insn_num = ++record_full_insn_count;
675 
676   record_full_arch_list_add (rec);
677 
678   return 0;
679 }
680 
681 static void
682 record_full_check_insn_num (void)
683 {
684   if (record_full_insn_num == record_full_insn_max_num)
685     {
686       /* Ask user what to do.  */
687       if (record_full_stop_at_limit)
688 	{
689 	  if (!yquery (_("Do you want to auto delete previous execution "
690 			"log entries when record/replay buffer becomes "
691 			"full (record full stop-at-limit)?")))
692 	    error (_("Process record: stopped by user."));
693 	  record_full_stop_at_limit = 0;
694 	}
695     }
696 }
697 
698 /* Before inferior step (when GDB record the running message, inferior
699    only can step), GDB will call this function to record the values to
700    record_full_list.  This function will call gdbarch_process_record to
701    record the running message of inferior and set them to
702    record_full_arch_list, and add it to record_full_list.  */
703 
704 static void
705 record_full_message (struct regcache *regcache, enum gdb_signal signal)
706 {
707   int ret;
708   struct gdbarch *gdbarch = regcache->arch ();
709 
710   try
711     {
712       record_full_arch_list_head = NULL;
713       record_full_arch_list_tail = NULL;
714 
715       /* Check record_full_insn_num.  */
716       record_full_check_insn_num ();
717 
718       /* If gdb sends a signal value to target_resume,
719 	 save it in the 'end' field of the previous instruction.
720 
721 	 Maybe process record should record what really happened,
722 	 rather than what gdb pretends has happened.
723 
724 	 So if Linux delivered the signal to the child process during
725 	 the record mode, we will record it and deliver it again in
726 	 the replay mode.
727 
728 	 If user says "ignore this signal" during the record mode, then
729 	 it will be ignored again during the replay mode (no matter if
730 	 the user says something different, like "deliver this signal"
731 	 during the replay mode).
732 
733 	 User should understand that nothing he does during the replay
734 	 mode will change the behavior of the child.  If he tries,
735 	 then that is a user error.
736 
737 	 But we should still deliver the signal to gdb during the replay,
738 	 if we delivered it during the recording.  Therefore we should
739 	 record the signal during record_full_wait, not
740 	 record_full_resume.  */
741       if (record_full_list != &record_full_first)  /* FIXME better way
742 						      to check */
743 	{
744 	  gdb_assert (record_full_list->type == record_full_end);
745 	  record_full_list->u.end.sigval = signal;
746 	}
747 
748       if (signal == GDB_SIGNAL_0
749 	  || !gdbarch_process_record_signal_p (gdbarch))
750 	ret = gdbarch_process_record (gdbarch,
751 				      regcache,
752 				      regcache_read_pc (regcache));
753       else
754 	ret = gdbarch_process_record_signal (gdbarch,
755 					     regcache,
756 					     signal);
757 
758       if (ret > 0)
759 	error (_("Process record: inferior program stopped."));
760       if (ret < 0)
761 	error (_("Process record: failed to record execution log."));
762     }
763   catch (const gdb_exception &ex)
764     {
765       record_full_list_release (record_full_arch_list_tail);
766       throw;
767     }
768 
769   record_full_list->next = record_full_arch_list_head;
770   record_full_arch_list_head->prev = record_full_list;
771   record_full_list = record_full_arch_list_tail;
772 
773   if (record_full_insn_num == record_full_insn_max_num)
774     record_full_list_release_first ();
775   else
776     record_full_insn_num++;
777 }
778 
779 static bool
780 record_full_message_wrapper_safe (struct regcache *regcache,
781 				  enum gdb_signal signal)
782 {
783   try
784     {
785       record_full_message (regcache, signal);
786     }
787   catch (const gdb_exception &ex)
788     {
789       exception_print (gdb_stderr, ex);
790       return false;
791     }
792 
793   return true;
794 }
795 
796 /* Set to 1 if record_full_store_registers and record_full_xfer_partial
797    doesn't need record.  */
798 
799 static int record_full_gdb_operation_disable = 0;
800 
801 scoped_restore_tmpl<int>
802 record_full_gdb_operation_disable_set (void)
803 {
804   return make_scoped_restore (&record_full_gdb_operation_disable, 1);
805 }
806 
807 /* Flag set to TRUE for target_stopped_by_watchpoint.  */
808 static enum target_stop_reason record_full_stop_reason
809   = TARGET_STOPPED_BY_NO_REASON;
810 
811 /* Execute one instruction from the record log.  Each instruction in
812    the log will be represented by an arbitrary sequence of register
813    entries and memory entries, followed by an 'end' entry.  */
814 
815 static inline void
816 record_full_exec_insn (struct regcache *regcache,
817 		       struct gdbarch *gdbarch,
818 		       struct record_full_entry *entry)
819 {
820   switch (entry->type)
821     {
822     case record_full_reg: /* reg */
823       {
824 	gdb::byte_vector reg (entry->u.reg.len);
825 
826 	if (record_debug > 1)
827 	  gdb_printf (gdb_stdlog,
828 		      "Process record: record_full_reg %s to "
829 		      "inferior num = %d.\n",
830 		      host_address_to_string (entry),
831 		      entry->u.reg.num);
832 
833 	regcache->cooked_read (entry->u.reg.num, reg.data ());
834 	regcache->cooked_write (entry->u.reg.num, record_full_get_loc (entry));
835 	memcpy (record_full_get_loc (entry), reg.data (), entry->u.reg.len);
836       }
837       break;
838 
839     case record_full_mem: /* mem */
840       {
841 	/* Nothing to do if the entry is flagged not_accessible.  */
842 	if (!entry->u.mem.mem_entry_not_accessible)
843 	  {
844 	    gdb::byte_vector mem (entry->u.mem.len);
845 
846 	    if (record_debug > 1)
847 	      gdb_printf (gdb_stdlog,
848 			  "Process record: record_full_mem %s to "
849 			  "inferior addr = %s len = %d.\n",
850 			  host_address_to_string (entry),
851 			  paddress (gdbarch, entry->u.mem.addr),
852 			  entry->u.mem.len);
853 
854 	    if (record_read_memory (gdbarch,
855 				    entry->u.mem.addr, mem.data (),
856 				    entry->u.mem.len))
857 	      entry->u.mem.mem_entry_not_accessible = 1;
858 	    else
859 	      {
860 		if (target_write_memory (entry->u.mem.addr,
861 					 record_full_get_loc (entry),
862 					 entry->u.mem.len))
863 		  {
864 		    entry->u.mem.mem_entry_not_accessible = 1;
865 		    if (record_debug)
866 		      warning (_("Process record: error writing memory at "
867 				 "addr = %s len = %d."),
868 			       paddress (gdbarch, entry->u.mem.addr),
869 			       entry->u.mem.len);
870 		  }
871 		else
872 		  {
873 		    memcpy (record_full_get_loc (entry), mem.data (),
874 			    entry->u.mem.len);
875 
876 		    /* We've changed memory --- check if a hardware
877 		       watchpoint should trap.  Note that this
878 		       presently assumes the target beneath supports
879 		       continuable watchpoints.  On non-continuable
880 		       watchpoints target, we'll want to check this
881 		       _before_ actually doing the memory change, and
882 		       not doing the change at all if the watchpoint
883 		       traps.  */
884 		    if (hardware_watchpoint_inserted_in_range
885 			(regcache->aspace (),
886 			 entry->u.mem.addr, entry->u.mem.len))
887 		      record_full_stop_reason = TARGET_STOPPED_BY_WATCHPOINT;
888 		  }
889 	      }
890 	  }
891       }
892       break;
893     }
894 }
895 
896 static void record_full_restore (void);
897 
898 /* Asynchronous signal handle registered as event loop source for when
899    we have pending events ready to be passed to the core.  */
900 
901 static struct async_event_handler *record_full_async_inferior_event_token;
902 
903 static void
904 record_full_async_inferior_event_handler (gdb_client_data data)
905 {
906   inferior_event_handler (INF_REG_EVENT);
907 }
908 
909 /* Open the process record target for 'core' files.  */
910 
911 static void
912 record_full_core_open_1 (const char *name, int from_tty)
913 {
914   struct regcache *regcache = get_current_regcache ();
915   int regnum = gdbarch_num_regs (regcache->arch ());
916   int i;
917 
918   /* Get record_full_core_regbuf.  */
919   target_fetch_registers (regcache, -1);
920   record_full_core_regbuf = new detached_regcache (regcache->arch (), false);
921 
922   for (i = 0; i < regnum; i ++)
923     record_full_core_regbuf->raw_supply (i, *regcache);
924 
925   record_full_core_sections = build_section_table (core_bfd);
926 
927   current_inferior ()->push_target (&record_full_core_ops);
928   record_full_restore ();
929 }
930 
931 /* Open the process record target for 'live' processes.  */
932 
933 static void
934 record_full_open_1 (const char *name, int from_tty)
935 {
936   if (record_debug)
937     gdb_printf (gdb_stdlog, "Process record: record_full_open_1\n");
938 
939   /* check exec */
940   if (!target_has_execution ())
941     error (_("Process record: the program is not being run."));
942   if (non_stop)
943     error (_("Process record target can't debug inferior in non-stop mode "
944 	     "(non-stop)."));
945 
946   if (!gdbarch_process_record_p (target_gdbarch ()))
947     error (_("Process record: the current architecture doesn't support "
948 	     "record function."));
949 
950   current_inferior ()->push_target (&record_full_ops);
951 }
952 
953 static void record_full_init_record_breakpoints (void);
954 
955 /* Open the process record target.  */
956 
957 static void
958 record_full_open (const char *name, int from_tty)
959 {
960   if (record_debug)
961     gdb_printf (gdb_stdlog, "Process record: record_full_open\n");
962 
963   record_preopen ();
964 
965   /* Reset */
966   record_full_insn_num = 0;
967   record_full_insn_count = 0;
968   record_full_list = &record_full_first;
969   record_full_list->next = NULL;
970 
971   if (core_bfd)
972     record_full_core_open_1 (name, from_tty);
973   else
974     record_full_open_1 (name, from_tty);
975 
976   /* Register extra event sources in the event loop.  */
977   record_full_async_inferior_event_token
978     = create_async_event_handler (record_full_async_inferior_event_handler,
979 				  NULL, "record-full");
980 
981   record_full_init_record_breakpoints ();
982 
983   gdb::observers::record_changed.notify (current_inferior (),  1, "full", NULL);
984 }
985 
986 /* "close" target method.  Close the process record target.  */
987 
988 void
989 record_full_base_target::close ()
990 {
991   struct record_full_core_buf_entry *entry;
992 
993   if (record_debug)
994     gdb_printf (gdb_stdlog, "Process record: record_full_close\n");
995 
996   record_full_list_release (record_full_list);
997 
998   /* Release record_full_core_regbuf.  */
999   if (record_full_core_regbuf)
1000     {
1001       delete record_full_core_regbuf;
1002       record_full_core_regbuf = NULL;
1003     }
1004 
1005   /* Release record_full_core_buf_list.  */
1006   while (record_full_core_buf_list)
1007     {
1008       entry = record_full_core_buf_list;
1009       record_full_core_buf_list = record_full_core_buf_list->prev;
1010       xfree (entry);
1011     }
1012 
1013   if (record_full_async_inferior_event_token)
1014     delete_async_event_handler (&record_full_async_inferior_event_token);
1015 }
1016 
1017 /* "async" target method.  */
1018 
1019 void
1020 record_full_base_target::async (bool enable)
1021 {
1022   if (enable)
1023     mark_async_event_handler (record_full_async_inferior_event_token);
1024   else
1025     clear_async_event_handler (record_full_async_inferior_event_token);
1026 
1027   beneath ()->async (enable);
1028 }
1029 
1030 /* The PTID and STEP arguments last passed to
1031    record_full_target::resume.  */
1032 static ptid_t record_full_resume_ptid = null_ptid;
1033 static int record_full_resume_step = 0;
1034 
1035 /* True if we've been resumed, and so each record_full_wait call should
1036    advance execution.  If this is false, record_full_wait will return a
1037    TARGET_WAITKIND_IGNORE.  */
1038 static int record_full_resumed = 0;
1039 
1040 /* The execution direction of the last resume we got.  This is
1041    necessary for async mode.  Vis (order is not strictly accurate):
1042 
1043    1. user has the global execution direction set to forward
1044    2. user does a reverse-step command
1045    3. record_full_resume is called with global execution direction
1046       temporarily switched to reverse
1047    4. GDB's execution direction is reverted back to forward
1048    5. target record notifies event loop there's an event to handle
1049    6. infrun asks the target which direction was it going, and switches
1050       the global execution direction accordingly (to reverse)
1051    7. infrun polls an event out of the record target, and handles it
1052    8. GDB goes back to the event loop, and goto #4.
1053 */
1054 static enum exec_direction_kind record_full_execution_dir = EXEC_FORWARD;
1055 
1056 /* "resume" target method.  Resume the process record target.  */
1057 
1058 void
1059 record_full_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
1060 {
1061   record_full_resume_ptid = inferior_ptid;
1062   record_full_resume_step = step;
1063   record_full_resumed = 1;
1064   record_full_execution_dir = ::execution_direction;
1065 
1066   if (!RECORD_FULL_IS_REPLAY)
1067     {
1068       struct gdbarch *gdbarch = target_thread_architecture (ptid);
1069 
1070       record_full_message (get_current_regcache (), signal);
1071 
1072       if (!step)
1073 	{
1074 	  /* This is not hard single step.  */
1075 	  if (!gdbarch_software_single_step_p (gdbarch))
1076 	    {
1077 	      /* This is a normal continue.  */
1078 	      step = 1;
1079 	    }
1080 	  else
1081 	    {
1082 	      /* This arch supports soft single step.  */
1083 	      if (thread_has_single_step_breakpoints_set (inferior_thread ()))
1084 		{
1085 		  /* This is a soft single step.  */
1086 		  record_full_resume_step = 1;
1087 		}
1088 	      else
1089 		step = !insert_single_step_breakpoints (gdbarch);
1090 	    }
1091 	}
1092 
1093       /* Make sure the target beneath reports all signals.  */
1094       target_pass_signals ({});
1095 
1096       this->beneath ()->resume (ptid, step, signal);
1097     }
1098 }
1099 
1100 static int record_full_get_sig = 0;
1101 
1102 /* SIGINT signal handler, registered by "wait" method.  */
1103 
1104 static void
1105 record_full_sig_handler (int signo)
1106 {
1107   if (record_debug)
1108     gdb_printf (gdb_stdlog, "Process record: get a signal\n");
1109 
1110   /* It will break the running inferior in replay mode.  */
1111   record_full_resume_step = 1;
1112 
1113   /* It will let record_full_wait set inferior status to get the signal
1114      SIGINT.  */
1115   record_full_get_sig = 1;
1116 }
1117 
1118 /* "wait" target method for process record target.
1119 
1120    In record mode, the target is always run in singlestep mode
1121    (even when gdb says to continue).  The wait method intercepts
1122    the stop events and determines which ones are to be passed on to
1123    gdb.  Most stop events are just singlestep events that gdb is not
1124    to know about, so the wait method just records them and keeps
1125    singlestepping.
1126 
1127    In replay mode, this function emulates the recorded execution log,
1128    one instruction at a time (forward or backward), and determines
1129    where to stop.  */
1130 
1131 static ptid_t
1132 record_full_wait_1 (struct target_ops *ops,
1133 		    ptid_t ptid, struct target_waitstatus *status,
1134 		    target_wait_flags options)
1135 {
1136   scoped_restore restore_operation_disable
1137     = record_full_gdb_operation_disable_set ();
1138 
1139   if (record_debug)
1140     gdb_printf (gdb_stdlog,
1141 		"Process record: record_full_wait "
1142 		"record_full_resume_step = %d, "
1143 		"record_full_resumed = %d, direction=%s\n",
1144 		record_full_resume_step, record_full_resumed,
1145 		record_full_execution_dir == EXEC_FORWARD
1146 		? "forward" : "reverse");
1147 
1148   if (!record_full_resumed)
1149     {
1150       gdb_assert ((options & TARGET_WNOHANG) != 0);
1151 
1152       /* No interesting event.  */
1153       status->set_ignore ();
1154       return minus_one_ptid;
1155     }
1156 
1157   record_full_get_sig = 0;
1158   signal (SIGINT, record_full_sig_handler);
1159 
1160   record_full_stop_reason = TARGET_STOPPED_BY_NO_REASON;
1161 
1162   if (!RECORD_FULL_IS_REPLAY && ops != &record_full_core_ops)
1163     {
1164       if (record_full_resume_step)
1165 	{
1166 	  /* This is a single step.  */
1167 	  return ops->beneath ()->wait (ptid, status, options);
1168 	}
1169       else
1170 	{
1171 	  /* This is not a single step.  */
1172 	  ptid_t ret;
1173 	  CORE_ADDR tmp_pc;
1174 	  struct gdbarch *gdbarch
1175 	    = target_thread_architecture (record_full_resume_ptid);
1176 
1177 	  while (1)
1178 	    {
1179 	      ret = ops->beneath ()->wait (ptid, status, options);
1180 	      if (status->kind () == TARGET_WAITKIND_IGNORE)
1181 		{
1182 		  if (record_debug)
1183 		    gdb_printf (gdb_stdlog,
1184 				"Process record: record_full_wait "
1185 				"target beneath not done yet\n");
1186 		  return ret;
1187 		}
1188 
1189 	      for (thread_info *tp : all_non_exited_threads ())
1190 		delete_single_step_breakpoints (tp);
1191 
1192 	      if (record_full_resume_step)
1193 		return ret;
1194 
1195 	      /* Is this a SIGTRAP?  */
1196 	      if (status->kind () == TARGET_WAITKIND_STOPPED
1197 		  && status->sig () == GDB_SIGNAL_TRAP)
1198 		{
1199 		  struct regcache *regcache;
1200 		  enum target_stop_reason *stop_reason_p
1201 		    = &record_full_stop_reason;
1202 
1203 		  /* Yes -- this is likely our single-step finishing,
1204 		     but check if there's any reason the core would be
1205 		     interested in the event.  */
1206 
1207 		  registers_changed ();
1208 		  switch_to_thread (current_inferior ()->process_target (),
1209 				    ret);
1210 		  regcache = get_current_regcache ();
1211 		  tmp_pc = regcache_read_pc (regcache);
1212 		  const struct address_space *aspace = regcache->aspace ();
1213 
1214 		  if (target_stopped_by_watchpoint ())
1215 		    {
1216 		      /* Always interested in watchpoints.  */
1217 		    }
1218 		  else if (record_check_stopped_by_breakpoint (aspace, tmp_pc,
1219 							       stop_reason_p))
1220 		    {
1221 		      /* There is a breakpoint here.  Let the core
1222 			 handle it.  */
1223 		    }
1224 		  else
1225 		    {
1226 		      /* This is a single-step trap.  Record the
1227 			 insn and issue another step.
1228 			 FIXME: this part can be a random SIGTRAP too.
1229 			 But GDB cannot handle it.  */
1230 		      int step = 1;
1231 
1232 		      if (!record_full_message_wrapper_safe (regcache,
1233 							     GDB_SIGNAL_0))
1234 			{
1235 			   status->set_stopped (GDB_SIGNAL_0);
1236 			   break;
1237 			}
1238 
1239 		      process_stratum_target *proc_target
1240 			= current_inferior ()->process_target ();
1241 
1242 		      if (gdbarch_software_single_step_p (gdbarch))
1243 			{
1244 			  /* Try to insert the software single step breakpoint.
1245 			     If insert success, set step to 0.  */
1246 			  set_executing (proc_target, inferior_ptid, false);
1247 			  SCOPE_EXIT
1248 			    {
1249 			      set_executing (proc_target, inferior_ptid, true);
1250 			    };
1251 
1252 			  reinit_frame_cache ();
1253 			  step = !insert_single_step_breakpoints (gdbarch);
1254 			}
1255 
1256 		      if (record_debug)
1257 			gdb_printf (gdb_stdlog,
1258 				    "Process record: record_full_wait "
1259 				    "issuing one more step in the "
1260 				    "target beneath\n");
1261 		      ops->beneath ()->resume (ptid, step, GDB_SIGNAL_0);
1262 		      proc_target->commit_resumed_state = true;
1263 		      proc_target->commit_resumed ();
1264 		      proc_target->commit_resumed_state = false;
1265 		      continue;
1266 		    }
1267 		}
1268 
1269 	      /* The inferior is broken by a breakpoint or a signal.  */
1270 	      break;
1271 	    }
1272 
1273 	  return ret;
1274 	}
1275     }
1276   else
1277     {
1278       switch_to_thread (current_inferior ()->process_target (),
1279 			record_full_resume_ptid);
1280       struct regcache *regcache = get_current_regcache ();
1281       struct gdbarch *gdbarch = regcache->arch ();
1282       const struct address_space *aspace = regcache->aspace ();
1283       int continue_flag = 1;
1284       int first_record_full_end = 1;
1285 
1286       try
1287 	{
1288 	  CORE_ADDR tmp_pc;
1289 
1290 	  record_full_stop_reason = TARGET_STOPPED_BY_NO_REASON;
1291 	  status->set_stopped (GDB_SIGNAL_0);
1292 
1293 	  /* Check breakpoint when forward execute.  */
1294 	  if (execution_direction == EXEC_FORWARD)
1295 	    {
1296 	      tmp_pc = regcache_read_pc (regcache);
1297 	      if (record_check_stopped_by_breakpoint (aspace, tmp_pc,
1298 						      &record_full_stop_reason))
1299 		{
1300 		  if (record_debug)
1301 		    gdb_printf (gdb_stdlog,
1302 				"Process record: break at %s.\n",
1303 				paddress (gdbarch, tmp_pc));
1304 		  goto replay_out;
1305 		}
1306 	    }
1307 
1308 	  /* If GDB is in terminal_inferior mode, it will not get the
1309 	     signal.  And in GDB replay mode, GDB doesn't need to be
1310 	     in terminal_inferior mode, because inferior will not
1311 	     executed.  Then set it to terminal_ours to make GDB get
1312 	     the signal.  */
1313 	  target_terminal::ours ();
1314 
1315 	  /* In EXEC_FORWARD mode, record_full_list points to the tail of prev
1316 	     instruction.  */
1317 	  if (execution_direction == EXEC_FORWARD && record_full_list->next)
1318 	    record_full_list = record_full_list->next;
1319 
1320 	  /* Loop over the record_full_list, looking for the next place to
1321 	     stop.  */
1322 	  do
1323 	    {
1324 	      /* Check for beginning and end of log.  */
1325 	      if (execution_direction == EXEC_REVERSE
1326 		  && record_full_list == &record_full_first)
1327 		{
1328 		  /* Hit beginning of record log in reverse.  */
1329 		  status->set_no_history ();
1330 		  break;
1331 		}
1332 	      if (execution_direction != EXEC_REVERSE
1333 		  && !record_full_list->next)
1334 		{
1335 		  /* Hit end of record log going forward.  */
1336 		  status->set_no_history ();
1337 		  break;
1338 		}
1339 
1340 	      record_full_exec_insn (regcache, gdbarch, record_full_list);
1341 
1342 	      if (record_full_list->type == record_full_end)
1343 		{
1344 		  if (record_debug > 1)
1345 		    gdb_printf
1346 		      (gdb_stdlog,
1347 		       "Process record: record_full_end %s to "
1348 		       "inferior.\n",
1349 		       host_address_to_string (record_full_list));
1350 
1351 		  if (first_record_full_end
1352 		      && execution_direction == EXEC_REVERSE)
1353 		    {
1354 		      /* When reverse execute, the first
1355 			 record_full_end is the part of current
1356 			 instruction.  */
1357 		      first_record_full_end = 0;
1358 		    }
1359 		  else
1360 		    {
1361 		      /* In EXEC_REVERSE mode, this is the
1362 			 record_full_end of prev instruction.  In
1363 			 EXEC_FORWARD mode, this is the
1364 			 record_full_end of current instruction.  */
1365 		      /* step */
1366 		      if (record_full_resume_step)
1367 			{
1368 			  if (record_debug > 1)
1369 			    gdb_printf (gdb_stdlog,
1370 					"Process record: step.\n");
1371 			  continue_flag = 0;
1372 			}
1373 
1374 		      /* check breakpoint */
1375 		      tmp_pc = regcache_read_pc (regcache);
1376 		      if (record_check_stopped_by_breakpoint
1377 			  (aspace, tmp_pc, &record_full_stop_reason))
1378 			{
1379 			  if (record_debug)
1380 			    gdb_printf (gdb_stdlog,
1381 					"Process record: break "
1382 					"at %s.\n",
1383 					paddress (gdbarch, tmp_pc));
1384 
1385 			  continue_flag = 0;
1386 			}
1387 
1388 		      if (record_full_stop_reason
1389 			  == TARGET_STOPPED_BY_WATCHPOINT)
1390 			{
1391 			  if (record_debug)
1392 			    gdb_printf (gdb_stdlog,
1393 					"Process record: hit hw "
1394 					"watchpoint.\n");
1395 			  continue_flag = 0;
1396 			}
1397 		      /* Check target signal */
1398 		      if (record_full_list->u.end.sigval != GDB_SIGNAL_0)
1399 			/* FIXME: better way to check */
1400 			continue_flag = 0;
1401 		    }
1402 		}
1403 
1404 	      if (continue_flag)
1405 		{
1406 		  if (execution_direction == EXEC_REVERSE)
1407 		    {
1408 		      if (record_full_list->prev)
1409 			record_full_list = record_full_list->prev;
1410 		    }
1411 		  else
1412 		    {
1413 		      if (record_full_list->next)
1414 			record_full_list = record_full_list->next;
1415 		    }
1416 		}
1417 	    }
1418 	  while (continue_flag);
1419 
1420 	replay_out:
1421 	  if (status->kind () == TARGET_WAITKIND_STOPPED)
1422 	    {
1423 	      if (record_full_get_sig)
1424 		status->set_stopped (GDB_SIGNAL_INT);
1425 	      else if (record_full_list->u.end.sigval != GDB_SIGNAL_0)
1426 		/* FIXME: better way to check */
1427 		status->set_stopped (record_full_list->u.end.sigval);
1428 	      else
1429 		status->set_stopped (GDB_SIGNAL_TRAP);
1430 	    }
1431 	}
1432       catch (const gdb_exception &ex)
1433 	{
1434 	  if (execution_direction == EXEC_REVERSE)
1435 	    {
1436 	      if (record_full_list->next)
1437 		record_full_list = record_full_list->next;
1438 	    }
1439 	  else
1440 	    record_full_list = record_full_list->prev;
1441 
1442 	  throw;
1443 	}
1444     }
1445 
1446   signal (SIGINT, handle_sigint);
1447 
1448   return inferior_ptid;
1449 }
1450 
1451 ptid_t
1452 record_full_base_target::wait (ptid_t ptid, struct target_waitstatus *status,
1453 			       target_wait_flags options)
1454 {
1455   ptid_t return_ptid;
1456 
1457   clear_async_event_handler (record_full_async_inferior_event_token);
1458 
1459   return_ptid = record_full_wait_1 (this, ptid, status, options);
1460   if (status->kind () != TARGET_WAITKIND_IGNORE)
1461     {
1462       /* We're reporting a stop.  Make sure any spurious
1463 	 target_wait(WNOHANG) doesn't advance the target until the
1464 	 core wants us resumed again.  */
1465       record_full_resumed = 0;
1466     }
1467   return return_ptid;
1468 }
1469 
1470 bool
1471 record_full_base_target::stopped_by_watchpoint ()
1472 {
1473   if (RECORD_FULL_IS_REPLAY)
1474     return record_full_stop_reason == TARGET_STOPPED_BY_WATCHPOINT;
1475   else
1476     return beneath ()->stopped_by_watchpoint ();
1477 }
1478 
1479 bool
1480 record_full_base_target::stopped_data_address (CORE_ADDR *addr_p)
1481 {
1482   if (RECORD_FULL_IS_REPLAY)
1483     return false;
1484   else
1485     return this->beneath ()->stopped_data_address (addr_p);
1486 }
1487 
1488 /* The stopped_by_sw_breakpoint method of target record-full.  */
1489 
1490 bool
1491 record_full_base_target::stopped_by_sw_breakpoint ()
1492 {
1493   return record_full_stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT;
1494 }
1495 
1496 /* The supports_stopped_by_sw_breakpoint method of target
1497    record-full.  */
1498 
1499 bool
1500 record_full_base_target::supports_stopped_by_sw_breakpoint ()
1501 {
1502   return true;
1503 }
1504 
1505 /* The stopped_by_hw_breakpoint method of target record-full.  */
1506 
1507 bool
1508 record_full_base_target::stopped_by_hw_breakpoint ()
1509 {
1510   return record_full_stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT;
1511 }
1512 
1513 /* The supports_stopped_by_sw_breakpoint method of target
1514    record-full.  */
1515 
1516 bool
1517 record_full_base_target::supports_stopped_by_hw_breakpoint ()
1518 {
1519   return true;
1520 }
1521 
1522 /* Record registers change (by user or by GDB) to list as an instruction.  */
1523 
1524 static void
1525 record_full_registers_change (struct regcache *regcache, int regnum)
1526 {
1527   /* Check record_full_insn_num.  */
1528   record_full_check_insn_num ();
1529 
1530   record_full_arch_list_head = NULL;
1531   record_full_arch_list_tail = NULL;
1532 
1533   if (regnum < 0)
1534     {
1535       int i;
1536 
1537       for (i = 0; i < gdbarch_num_regs (regcache->arch ()); i++)
1538 	{
1539 	  if (record_full_arch_list_add_reg (regcache, i))
1540 	    {
1541 	      record_full_list_release (record_full_arch_list_tail);
1542 	      error (_("Process record: failed to record execution log."));
1543 	    }
1544 	}
1545     }
1546   else
1547     {
1548       if (record_full_arch_list_add_reg (regcache, regnum))
1549 	{
1550 	  record_full_list_release (record_full_arch_list_tail);
1551 	  error (_("Process record: failed to record execution log."));
1552 	}
1553     }
1554   if (record_full_arch_list_add_end ())
1555     {
1556       record_full_list_release (record_full_arch_list_tail);
1557       error (_("Process record: failed to record execution log."));
1558     }
1559   record_full_list->next = record_full_arch_list_head;
1560   record_full_arch_list_head->prev = record_full_list;
1561   record_full_list = record_full_arch_list_tail;
1562 
1563   if (record_full_insn_num == record_full_insn_max_num)
1564     record_full_list_release_first ();
1565   else
1566     record_full_insn_num++;
1567 }
1568 
1569 /* "store_registers" method for process record target.  */
1570 
1571 void
1572 record_full_target::store_registers (struct regcache *regcache, int regno)
1573 {
1574   if (!record_full_gdb_operation_disable)
1575     {
1576       if (RECORD_FULL_IS_REPLAY)
1577 	{
1578 	  int n;
1579 
1580 	  /* Let user choose if he wants to write register or not.  */
1581 	  if (regno < 0)
1582 	    n =
1583 	      query (_("Because GDB is in replay mode, changing the "
1584 		       "value of a register will make the execution "
1585 		       "log unusable from this point onward.  "
1586 		       "Change all registers?"));
1587 	  else
1588 	    n =
1589 	      query (_("Because GDB is in replay mode, changing the value "
1590 		       "of a register will make the execution log unusable "
1591 		       "from this point onward.  Change register %s?"),
1592 		      gdbarch_register_name (regcache->arch (),
1593 					       regno));
1594 
1595 	  if (!n)
1596 	    {
1597 	      /* Invalidate the value of regcache that was set in function
1598 		 "regcache_raw_write".  */
1599 	      if (regno < 0)
1600 		{
1601 		  int i;
1602 
1603 		  for (i = 0;
1604 		       i < gdbarch_num_regs (regcache->arch ());
1605 		       i++)
1606 		    regcache->invalidate (i);
1607 		}
1608 	      else
1609 		regcache->invalidate (regno);
1610 
1611 	      error (_("Process record canceled the operation."));
1612 	    }
1613 
1614 	  /* Destroy the record from here forward.  */
1615 	  record_full_list_release_following (record_full_list);
1616 	}
1617 
1618       record_full_registers_change (regcache, regno);
1619     }
1620   this->beneath ()->store_registers (regcache, regno);
1621 }
1622 
1623 /* "xfer_partial" method.  Behavior is conditional on
1624    RECORD_FULL_IS_REPLAY.
1625    In replay mode, we cannot write memory unles we are willing to
1626    invalidate the record/replay log from this point forward.  */
1627 
1628 enum target_xfer_status
1629 record_full_target::xfer_partial (enum target_object object,
1630 				  const char *annex, gdb_byte *readbuf,
1631 				  const gdb_byte *writebuf, ULONGEST offset,
1632 				  ULONGEST len, ULONGEST *xfered_len)
1633 {
1634   if (!record_full_gdb_operation_disable
1635       && (object == TARGET_OBJECT_MEMORY
1636 	  || object == TARGET_OBJECT_RAW_MEMORY) && writebuf)
1637     {
1638       if (RECORD_FULL_IS_REPLAY)
1639 	{
1640 	  /* Let user choose if he wants to write memory or not.  */
1641 	  if (!query (_("Because GDB is in replay mode, writing to memory "
1642 			"will make the execution log unusable from this "
1643 			"point onward.  Write memory at address %s?"),
1644 		       paddress (target_gdbarch (), offset)))
1645 	    error (_("Process record canceled the operation."));
1646 
1647 	  /* Destroy the record from here forward.  */
1648 	  record_full_list_release_following (record_full_list);
1649 	}
1650 
1651       /* Check record_full_insn_num */
1652       record_full_check_insn_num ();
1653 
1654       /* Record registers change to list as an instruction.  */
1655       record_full_arch_list_head = NULL;
1656       record_full_arch_list_tail = NULL;
1657       if (record_full_arch_list_add_mem (offset, len))
1658 	{
1659 	  record_full_list_release (record_full_arch_list_tail);
1660 	  if (record_debug)
1661 	    gdb_printf (gdb_stdlog,
1662 			"Process record: failed to record "
1663 			"execution log.");
1664 	  return TARGET_XFER_E_IO;
1665 	}
1666       if (record_full_arch_list_add_end ())
1667 	{
1668 	  record_full_list_release (record_full_arch_list_tail);
1669 	  if (record_debug)
1670 	    gdb_printf (gdb_stdlog,
1671 			"Process record: failed to record "
1672 			"execution log.");
1673 	  return TARGET_XFER_E_IO;
1674 	}
1675       record_full_list->next = record_full_arch_list_head;
1676       record_full_arch_list_head->prev = record_full_list;
1677       record_full_list = record_full_arch_list_tail;
1678 
1679       if (record_full_insn_num == record_full_insn_max_num)
1680 	record_full_list_release_first ();
1681       else
1682 	record_full_insn_num++;
1683     }
1684 
1685   return this->beneath ()->xfer_partial (object, annex, readbuf, writebuf,
1686 					 offset, len, xfered_len);
1687 }
1688 
1689 /* This structure represents a breakpoint inserted while the record
1690    target is active.  We use this to know when to install/remove
1691    breakpoints in/from the target beneath.  For example, a breakpoint
1692    may be inserted while recording, but removed when not replaying nor
1693    recording.  In that case, the breakpoint had not been inserted on
1694    the target beneath, so we should not try to remove it there.  */
1695 
1696 struct record_full_breakpoint
1697 {
1698   record_full_breakpoint (struct address_space *address_space_,
1699 			  CORE_ADDR addr_,
1700 			  bool in_target_beneath_)
1701     : address_space (address_space_),
1702       addr (addr_),
1703       in_target_beneath (in_target_beneath_)
1704   {
1705   }
1706 
1707   /* The address and address space the breakpoint was set at.  */
1708   struct address_space *address_space;
1709   CORE_ADDR addr;
1710 
1711   /* True when the breakpoint has been also installed in the target
1712      beneath.  This will be false for breakpoints set during replay or
1713      when recording.  */
1714   bool in_target_beneath;
1715 };
1716 
1717 /* The list of breakpoints inserted while the record target is
1718    active.  */
1719 static std::vector<record_full_breakpoint> record_full_breakpoints;
1720 
1721 /* Sync existing breakpoints to record_full_breakpoints.  */
1722 
1723 static void
1724 record_full_init_record_breakpoints (void)
1725 {
1726   record_full_breakpoints.clear ();
1727 
1728   for (bp_location *loc : all_bp_locations ())
1729     {
1730       if (loc->loc_type != bp_loc_software_breakpoint)
1731 	continue;
1732 
1733       if (loc->inserted)
1734 	record_full_breakpoints.emplace_back
1735 	  (loc->target_info.placed_address_space,
1736 	   loc->target_info.placed_address, 1);
1737     }
1738 }
1739 
1740 /* Behavior is conditional on RECORD_FULL_IS_REPLAY.  We will not actually
1741    insert or remove breakpoints in the real target when replaying, nor
1742    when recording.  */
1743 
1744 int
1745 record_full_target::insert_breakpoint (struct gdbarch *gdbarch,
1746 				       struct bp_target_info *bp_tgt)
1747 {
1748   bool in_target_beneath = false;
1749 
1750   if (!RECORD_FULL_IS_REPLAY)
1751     {
1752       /* When recording, we currently always single-step, so we don't
1753 	 really need to install regular breakpoints in the inferior.
1754 	 However, we do have to insert software single-step
1755 	 breakpoints, in case the target can't hardware step.  To keep
1756 	 things simple, we always insert.  */
1757 
1758       scoped_restore restore_operation_disable
1759 	= record_full_gdb_operation_disable_set ();
1760 
1761       int ret = this->beneath ()->insert_breakpoint (gdbarch, bp_tgt);
1762       if (ret != 0)
1763 	return ret;
1764 
1765       in_target_beneath = true;
1766     }
1767 
1768   /* Use the existing entries if found in order to avoid duplication
1769      in record_full_breakpoints.  */
1770 
1771   for (const record_full_breakpoint &bp : record_full_breakpoints)
1772     {
1773       if (bp.addr == bp_tgt->placed_address
1774 	  && bp.address_space == bp_tgt->placed_address_space)
1775 	{
1776 	  gdb_assert (bp.in_target_beneath == in_target_beneath);
1777 	  return 0;
1778 	}
1779     }
1780 
1781   record_full_breakpoints.emplace_back (bp_tgt->placed_address_space,
1782 					bp_tgt->placed_address,
1783 					in_target_beneath);
1784   return 0;
1785 }
1786 
1787 /* "remove_breakpoint" method for process record target.  */
1788 
1789 int
1790 record_full_target::remove_breakpoint (struct gdbarch *gdbarch,
1791 				       struct bp_target_info *bp_tgt,
1792 				       enum remove_bp_reason reason)
1793 {
1794   for (auto iter = record_full_breakpoints.begin ();
1795        iter != record_full_breakpoints.end ();
1796        ++iter)
1797     {
1798       struct record_full_breakpoint &bp = *iter;
1799 
1800       if (bp.addr == bp_tgt->placed_address
1801 	  && bp.address_space == bp_tgt->placed_address_space)
1802 	{
1803 	  if (bp.in_target_beneath)
1804 	    {
1805 	      scoped_restore restore_operation_disable
1806 		= record_full_gdb_operation_disable_set ();
1807 
1808 	      int ret = this->beneath ()->remove_breakpoint (gdbarch, bp_tgt,
1809 							     reason);
1810 	      if (ret != 0)
1811 		return ret;
1812 	    }
1813 
1814 	  if (reason == REMOVE_BREAKPOINT)
1815 	    unordered_remove (record_full_breakpoints, iter);
1816 	  return 0;
1817 	}
1818     }
1819 
1820   gdb_assert_not_reached ("removing unknown breakpoint");
1821 }
1822 
1823 /* "can_execute_reverse" method for process record target.  */
1824 
1825 bool
1826 record_full_base_target::can_execute_reverse ()
1827 {
1828   return true;
1829 }
1830 
1831 /* "get_bookmark" method for process record and prec over core.  */
1832 
1833 gdb_byte *
1834 record_full_base_target::get_bookmark (const char *args, int from_tty)
1835 {
1836   char *ret = NULL;
1837 
1838   /* Return stringified form of instruction count.  */
1839   if (record_full_list && record_full_list->type == record_full_end)
1840     ret = xstrdup (pulongest (record_full_list->u.end.insn_num));
1841 
1842   if (record_debug)
1843     {
1844       if (ret)
1845 	gdb_printf (gdb_stdlog,
1846 		    "record_full_get_bookmark returns %s\n", ret);
1847       else
1848 	gdb_printf (gdb_stdlog,
1849 		    "record_full_get_bookmark returns NULL\n");
1850     }
1851   return (gdb_byte *) ret;
1852 }
1853 
1854 /* "goto_bookmark" method for process record and prec over core.  */
1855 
1856 void
1857 record_full_base_target::goto_bookmark (const gdb_byte *raw_bookmark,
1858 					int from_tty)
1859 {
1860   const char *bookmark = (const char *) raw_bookmark;
1861 
1862   if (record_debug)
1863     gdb_printf (gdb_stdlog,
1864 		"record_full_goto_bookmark receives %s\n", bookmark);
1865 
1866   std::string name_holder;
1867   if (bookmark[0] == '\'' || bookmark[0] == '\"')
1868     {
1869       if (bookmark[strlen (bookmark) - 1] != bookmark[0])
1870 	error (_("Unbalanced quotes: %s"), bookmark);
1871 
1872       name_holder = std::string (bookmark + 1, strlen (bookmark) - 2);
1873       bookmark = name_holder.c_str ();
1874     }
1875 
1876   record_goto (bookmark);
1877 }
1878 
1879 enum exec_direction_kind
1880 record_full_base_target::execution_direction ()
1881 {
1882   return record_full_execution_dir;
1883 }
1884 
1885 /* The record_method method of target record-full.  */
1886 
1887 enum record_method
1888 record_full_base_target::record_method (ptid_t ptid)
1889 {
1890   return RECORD_METHOD_FULL;
1891 }
1892 
1893 void
1894 record_full_base_target::info_record ()
1895 {
1896   struct record_full_entry *p;
1897 
1898   if (RECORD_FULL_IS_REPLAY)
1899     gdb_printf (_("Replay mode:\n"));
1900   else
1901     gdb_printf (_("Record mode:\n"));
1902 
1903   /* Find entry for first actual instruction in the log.  */
1904   for (p = record_full_first.next;
1905        p != NULL && p->type != record_full_end;
1906        p = p->next)
1907     ;
1908 
1909   /* Do we have a log at all?  */
1910   if (p != NULL && p->type == record_full_end)
1911     {
1912       /* Display instruction number for first instruction in the log.  */
1913       gdb_printf (_("Lowest recorded instruction number is %s.\n"),
1914 		  pulongest (p->u.end.insn_num));
1915 
1916       /* If in replay mode, display where we are in the log.  */
1917       if (RECORD_FULL_IS_REPLAY)
1918 	gdb_printf (_("Current instruction number is %s.\n"),
1919 		    pulongest (record_full_list->u.end.insn_num));
1920 
1921       /* Display instruction number for last instruction in the log.  */
1922       gdb_printf (_("Highest recorded instruction number is %s.\n"),
1923 		  pulongest (record_full_insn_count));
1924 
1925       /* Display log count.  */
1926       gdb_printf (_("Log contains %u instructions.\n"),
1927 		  record_full_insn_num);
1928     }
1929   else
1930     gdb_printf (_("No instructions have been logged.\n"));
1931 
1932   /* Display max log size.  */
1933   gdb_printf (_("Max logged instructions is %u.\n"),
1934 	      record_full_insn_max_num);
1935 }
1936 
1937 bool
1938 record_full_base_target::supports_delete_record ()
1939 {
1940   return true;
1941 }
1942 
1943 /* The "delete_record" target method.  */
1944 
1945 void
1946 record_full_base_target::delete_record ()
1947 {
1948   record_full_list_release_following (record_full_list);
1949 }
1950 
1951 /* The "record_is_replaying" target method.  */
1952 
1953 bool
1954 record_full_base_target::record_is_replaying (ptid_t ptid)
1955 {
1956   return RECORD_FULL_IS_REPLAY;
1957 }
1958 
1959 /* The "record_will_replay" target method.  */
1960 
1961 bool
1962 record_full_base_target::record_will_replay (ptid_t ptid, int dir)
1963 {
1964   /* We can currently only record when executing forwards.  Should we be able
1965      to record when executing backwards on targets that support reverse
1966      execution, this needs to be changed.  */
1967 
1968   return RECORD_FULL_IS_REPLAY || dir == EXEC_REVERSE;
1969 }
1970 
1971 /* Go to a specific entry.  */
1972 
1973 static void
1974 record_full_goto_entry (struct record_full_entry *p)
1975 {
1976   if (p == NULL)
1977     error (_("Target insn not found."));
1978   else if (p == record_full_list)
1979     error (_("Already at target insn."));
1980   else if (p->u.end.insn_num > record_full_list->u.end.insn_num)
1981     {
1982       gdb_printf (_("Go forward to insn number %s\n"),
1983 		  pulongest (p->u.end.insn_num));
1984       record_full_goto_insn (p, EXEC_FORWARD);
1985     }
1986   else
1987     {
1988       gdb_printf (_("Go backward to insn number %s\n"),
1989 		  pulongest (p->u.end.insn_num));
1990       record_full_goto_insn (p, EXEC_REVERSE);
1991     }
1992 
1993   registers_changed ();
1994   reinit_frame_cache ();
1995   inferior_thread ()->set_stop_pc (regcache_read_pc (get_current_regcache ()));
1996   print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
1997 }
1998 
1999 /* The "goto_record_begin" target method.  */
2000 
2001 void
2002 record_full_base_target::goto_record_begin ()
2003 {
2004   struct record_full_entry *p = NULL;
2005 
2006   for (p = &record_full_first; p != NULL; p = p->next)
2007     if (p->type == record_full_end)
2008       break;
2009 
2010   record_full_goto_entry (p);
2011 }
2012 
2013 /* The "goto_record_end" target method.  */
2014 
2015 void
2016 record_full_base_target::goto_record_end ()
2017 {
2018   struct record_full_entry *p = NULL;
2019 
2020   for (p = record_full_list; p->next != NULL; p = p->next)
2021     ;
2022   for (; p!= NULL; p = p->prev)
2023     if (p->type == record_full_end)
2024       break;
2025 
2026   record_full_goto_entry (p);
2027 }
2028 
2029 /* The "goto_record" target method.  */
2030 
2031 void
2032 record_full_base_target::goto_record (ULONGEST target_insn)
2033 {
2034   struct record_full_entry *p = NULL;
2035 
2036   for (p = &record_full_first; p != NULL; p = p->next)
2037     if (p->type == record_full_end && p->u.end.insn_num == target_insn)
2038       break;
2039 
2040   record_full_goto_entry (p);
2041 }
2042 
2043 /* The "record_stop_replaying" target method.  */
2044 
2045 void
2046 record_full_base_target::record_stop_replaying ()
2047 {
2048   goto_record_end ();
2049 }
2050 
2051 /* "resume" method for prec over corefile.  */
2052 
2053 void
2054 record_full_core_target::resume (ptid_t ptid, int step,
2055 				 enum gdb_signal signal)
2056 {
2057   record_full_resume_step = step;
2058   record_full_resumed = 1;
2059   record_full_execution_dir = ::execution_direction;
2060 }
2061 
2062 /* "kill" method for prec over corefile.  */
2063 
2064 void
2065 record_full_core_target::kill ()
2066 {
2067   if (record_debug)
2068     gdb_printf (gdb_stdlog, "Process record: record_full_core_kill\n");
2069 
2070   current_inferior ()->unpush_target (this);
2071 }
2072 
2073 /* "fetch_registers" method for prec over corefile.  */
2074 
2075 void
2076 record_full_core_target::fetch_registers (struct regcache *regcache,
2077 					  int regno)
2078 {
2079   if (regno < 0)
2080     {
2081       int num = gdbarch_num_regs (regcache->arch ());
2082       int i;
2083 
2084       for (i = 0; i < num; i ++)
2085 	regcache->raw_supply (i, *record_full_core_regbuf);
2086     }
2087   else
2088     regcache->raw_supply (regno, *record_full_core_regbuf);
2089 }
2090 
2091 /* "prepare_to_store" method for prec over corefile.  */
2092 
2093 void
2094 record_full_core_target::prepare_to_store (struct regcache *regcache)
2095 {
2096 }
2097 
2098 /* "store_registers" method for prec over corefile.  */
2099 
2100 void
2101 record_full_core_target::store_registers (struct regcache *regcache,
2102 					  int regno)
2103 {
2104   if (record_full_gdb_operation_disable)
2105     record_full_core_regbuf->raw_supply (regno, *regcache);
2106   else
2107     error (_("You can't do that without a process to debug."));
2108 }
2109 
2110 /* "xfer_partial" method for prec over corefile.  */
2111 
2112 enum target_xfer_status
2113 record_full_core_target::xfer_partial (enum target_object object,
2114 				       const char *annex, gdb_byte *readbuf,
2115 				       const gdb_byte *writebuf, ULONGEST offset,
2116 				       ULONGEST len, ULONGEST *xfered_len)
2117 {
2118   if (object == TARGET_OBJECT_MEMORY)
2119     {
2120       if (record_full_gdb_operation_disable || !writebuf)
2121 	{
2122 	  for (target_section &p : record_full_core_sections)
2123 	    {
2124 	      if (offset >= p.addr)
2125 		{
2126 		  struct record_full_core_buf_entry *entry;
2127 		  ULONGEST sec_offset;
2128 
2129 		  if (offset >= p.endaddr)
2130 		    continue;
2131 
2132 		  if (offset + len > p.endaddr)
2133 		    len = p.endaddr - offset;
2134 
2135 		  sec_offset = offset - p.addr;
2136 
2137 		  /* Read readbuf or write writebuf p, offset, len.  */
2138 		  /* Check flags.  */
2139 		  if (p.the_bfd_section->flags & SEC_CONSTRUCTOR
2140 		      || (p.the_bfd_section->flags & SEC_HAS_CONTENTS) == 0)
2141 		    {
2142 		      if (readbuf)
2143 			memset (readbuf, 0, len);
2144 
2145 		      *xfered_len = len;
2146 		      return TARGET_XFER_OK;
2147 		    }
2148 		  /* Get record_full_core_buf_entry.  */
2149 		  for (entry = record_full_core_buf_list; entry;
2150 		       entry = entry->prev)
2151 		    if (entry->p == &p)
2152 		      break;
2153 		  if (writebuf)
2154 		    {
2155 		      if (!entry)
2156 			{
2157 			  /* Add a new entry.  */
2158 			  entry = XNEW (struct record_full_core_buf_entry);
2159 			  entry->p = &p;
2160 			  if (!bfd_malloc_and_get_section
2161 				(p.the_bfd_section->owner,
2162 				 p.the_bfd_section,
2163 				 &entry->buf))
2164 			    {
2165 			      xfree (entry);
2166 			      return TARGET_XFER_EOF;
2167 			    }
2168 			  entry->prev = record_full_core_buf_list;
2169 			  record_full_core_buf_list = entry;
2170 			}
2171 
2172 		      memcpy (entry->buf + sec_offset, writebuf,
2173 			      (size_t) len);
2174 		    }
2175 		  else
2176 		    {
2177 		      if (!entry)
2178 			return this->beneath ()->xfer_partial (object, annex,
2179 							       readbuf, writebuf,
2180 							       offset, len,
2181 							       xfered_len);
2182 
2183 		      memcpy (readbuf, entry->buf + sec_offset,
2184 			      (size_t) len);
2185 		    }
2186 
2187 		  *xfered_len = len;
2188 		  return TARGET_XFER_OK;
2189 		}
2190 	    }
2191 
2192 	  return TARGET_XFER_E_IO;
2193 	}
2194       else
2195 	error (_("You can't do that without a process to debug."));
2196     }
2197 
2198   return this->beneath ()->xfer_partial (object, annex,
2199 					 readbuf, writebuf, offset, len,
2200 					 xfered_len);
2201 }
2202 
2203 /* "insert_breakpoint" method for prec over corefile.  */
2204 
2205 int
2206 record_full_core_target::insert_breakpoint (struct gdbarch *gdbarch,
2207 					    struct bp_target_info *bp_tgt)
2208 {
2209   return 0;
2210 }
2211 
2212 /* "remove_breakpoint" method for prec over corefile.  */
2213 
2214 int
2215 record_full_core_target::remove_breakpoint (struct gdbarch *gdbarch,
2216 					    struct bp_target_info *bp_tgt,
2217 					    enum remove_bp_reason reason)
2218 {
2219   return 0;
2220 }
2221 
2222 /* "has_execution" method for prec over corefile.  */
2223 
2224 bool
2225 record_full_core_target::has_execution (inferior *inf)
2226 {
2227   return true;
2228 }
2229 
2230 /* Record log save-file format
2231    Version 1 (never released)
2232 
2233    Header:
2234      4 bytes: magic number htonl(0x20090829).
2235        NOTE: be sure to change whenever this file format changes!
2236 
2237    Records:
2238      record_full_end:
2239        1 byte:  record type (record_full_end, see enum record_full_type).
2240      record_full_reg:
2241        1 byte:  record type (record_full_reg, see enum record_full_type).
2242        8 bytes: register id (network byte order).
2243        MAX_REGISTER_SIZE bytes: register value.
2244      record_full_mem:
2245        1 byte:  record type (record_full_mem, see enum record_full_type).
2246        8 bytes: memory length (network byte order).
2247        8 bytes: memory address (network byte order).
2248        n bytes: memory value (n == memory length).
2249 
2250    Version 2
2251      4 bytes: magic number netorder32(0x20091016).
2252        NOTE: be sure to change whenever this file format changes!
2253 
2254    Records:
2255      record_full_end:
2256        1 byte:  record type (record_full_end, see enum record_full_type).
2257        4 bytes: signal
2258        4 bytes: instruction count
2259      record_full_reg:
2260        1 byte:  record type (record_full_reg, see enum record_full_type).
2261        4 bytes: register id (network byte order).
2262        n bytes: register value (n == actual register size).
2263 		(eg. 4 bytes for x86 general registers).
2264      record_full_mem:
2265        1 byte:  record type (record_full_mem, see enum record_full_type).
2266        4 bytes: memory length (network byte order).
2267        8 bytes: memory address (network byte order).
2268        n bytes: memory value (n == memory length).
2269 
2270 */
2271 
2272 /* bfdcore_read -- read bytes from a core file section.  */
2273 
2274 static inline void
2275 bfdcore_read (bfd *obfd, asection *osec, void *buf, int len, int *offset)
2276 {
2277   int ret = bfd_get_section_contents (obfd, osec, buf, *offset, len);
2278 
2279   if (ret)
2280     *offset += len;
2281   else
2282     error (_("Failed to read %d bytes from core file %s ('%s')."),
2283 	   len, bfd_get_filename (obfd),
2284 	   bfd_errmsg (bfd_get_error ()));
2285 }
2286 
2287 static inline uint64_t
2288 netorder64 (uint64_t input)
2289 {
2290   uint64_t ret;
2291 
2292   store_unsigned_integer ((gdb_byte *) &ret, sizeof (ret),
2293 			  BFD_ENDIAN_BIG, input);
2294   return ret;
2295 }
2296 
2297 static inline uint32_t
2298 netorder32 (uint32_t input)
2299 {
2300   uint32_t ret;
2301 
2302   store_unsigned_integer ((gdb_byte *) &ret, sizeof (ret),
2303 			  BFD_ENDIAN_BIG, input);
2304   return ret;
2305 }
2306 
2307 /* Restore the execution log from a core_bfd file.  */
2308 static void
2309 record_full_restore (void)
2310 {
2311   uint32_t magic;
2312   struct record_full_entry *rec;
2313   asection *osec;
2314   uint32_t osec_size;
2315   int bfd_offset = 0;
2316   struct regcache *regcache;
2317 
2318   /* We restore the execution log from the open core bfd,
2319      if there is one.  */
2320   if (core_bfd == NULL)
2321     return;
2322 
2323   /* "record_full_restore" can only be called when record list is empty.  */
2324   gdb_assert (record_full_first.next == NULL);
2325 
2326   if (record_debug)
2327     gdb_printf (gdb_stdlog, "Restoring recording from core file.\n");
2328 
2329   /* Now need to find our special note section.  */
2330   osec = bfd_get_section_by_name (core_bfd, "null0");
2331   if (record_debug)
2332     gdb_printf (gdb_stdlog, "Find precord section %s.\n",
2333 		osec ? "succeeded" : "failed");
2334   if (osec == NULL)
2335     return;
2336   osec_size = bfd_section_size (osec);
2337   if (record_debug)
2338     gdb_printf (gdb_stdlog, "%s", bfd_section_name (osec));
2339 
2340   /* Check the magic code.  */
2341   bfdcore_read (core_bfd, osec, &magic, sizeof (magic), &bfd_offset);
2342   if (magic != RECORD_FULL_FILE_MAGIC)
2343     error (_("Version mis-match or file format error in core file %s."),
2344 	   bfd_get_filename (core_bfd));
2345   if (record_debug)
2346     gdb_printf (gdb_stdlog,
2347 		"  Reading 4-byte magic cookie "
2348 		"RECORD_FULL_FILE_MAGIC (0x%s)\n",
2349 		phex_nz (netorder32 (magic), 4));
2350 
2351   /* Restore the entries in recfd into record_full_arch_list_head and
2352      record_full_arch_list_tail.  */
2353   record_full_arch_list_head = NULL;
2354   record_full_arch_list_tail = NULL;
2355   record_full_insn_num = 0;
2356 
2357   try
2358     {
2359       regcache = get_current_regcache ();
2360 
2361       while (1)
2362 	{
2363 	  uint8_t rectype;
2364 	  uint32_t regnum, len, signal, count;
2365 	  uint64_t addr;
2366 
2367 	  /* We are finished when offset reaches osec_size.  */
2368 	  if (bfd_offset >= osec_size)
2369 	    break;
2370 	  bfdcore_read (core_bfd, osec, &rectype, sizeof (rectype), &bfd_offset);
2371 
2372 	  switch (rectype)
2373 	    {
2374 	    case record_full_reg: /* reg */
2375 	      /* Get register number to regnum.  */
2376 	      bfdcore_read (core_bfd, osec, &regnum,
2377 			    sizeof (regnum), &bfd_offset);
2378 	      regnum = netorder32 (regnum);
2379 
2380 	      rec = record_full_reg_alloc (regcache, regnum);
2381 
2382 	      /* Get val.  */
2383 	      bfdcore_read (core_bfd, osec, record_full_get_loc (rec),
2384 			    rec->u.reg.len, &bfd_offset);
2385 
2386 	      if (record_debug)
2387 		gdb_printf (gdb_stdlog,
2388 			    "  Reading register %d (1 "
2389 			    "plus %lu plus %d bytes)\n",
2390 			    rec->u.reg.num,
2391 			    (unsigned long) sizeof (regnum),
2392 			    rec->u.reg.len);
2393 	      break;
2394 
2395 	    case record_full_mem: /* mem */
2396 	      /* Get len.  */
2397 	      bfdcore_read (core_bfd, osec, &len,
2398 			    sizeof (len), &bfd_offset);
2399 	      len = netorder32 (len);
2400 
2401 	      /* Get addr.  */
2402 	      bfdcore_read (core_bfd, osec, &addr,
2403 			    sizeof (addr), &bfd_offset);
2404 	      addr = netorder64 (addr);
2405 
2406 	      rec = record_full_mem_alloc (addr, len);
2407 
2408 	      /* Get val.  */
2409 	      bfdcore_read (core_bfd, osec, record_full_get_loc (rec),
2410 			    rec->u.mem.len, &bfd_offset);
2411 
2412 	      if (record_debug)
2413 		gdb_printf (gdb_stdlog,
2414 			    "  Reading memory %s (1 plus "
2415 			    "%lu plus %lu plus %d bytes)\n",
2416 			    paddress (get_current_arch (),
2417 				      rec->u.mem.addr),
2418 			    (unsigned long) sizeof (addr),
2419 			    (unsigned long) sizeof (len),
2420 			    rec->u.mem.len);
2421 	      break;
2422 
2423 	    case record_full_end: /* end */
2424 	      rec = record_full_end_alloc ();
2425 	      record_full_insn_num ++;
2426 
2427 	      /* Get signal value.  */
2428 	      bfdcore_read (core_bfd, osec, &signal,
2429 			    sizeof (signal), &bfd_offset);
2430 	      signal = netorder32 (signal);
2431 	      rec->u.end.sigval = (enum gdb_signal) signal;
2432 
2433 	      /* Get insn count.  */
2434 	      bfdcore_read (core_bfd, osec, &count,
2435 			    sizeof (count), &bfd_offset);
2436 	      count = netorder32 (count);
2437 	      rec->u.end.insn_num = count;
2438 	      record_full_insn_count = count + 1;
2439 	      if (record_debug)
2440 		gdb_printf (gdb_stdlog,
2441 			    "  Reading record_full_end (1 + "
2442 			    "%lu + %lu bytes), offset == %s\n",
2443 			    (unsigned long) sizeof (signal),
2444 			    (unsigned long) sizeof (count),
2445 			    paddress (get_current_arch (),
2446 				      bfd_offset));
2447 	      break;
2448 
2449 	    default:
2450 	      error (_("Bad entry type in core file %s."),
2451 		     bfd_get_filename (core_bfd));
2452 	      break;
2453 	    }
2454 
2455 	  /* Add rec to record arch list.  */
2456 	  record_full_arch_list_add (rec);
2457 	}
2458     }
2459   catch (const gdb_exception &ex)
2460     {
2461       record_full_list_release (record_full_arch_list_tail);
2462       throw;
2463     }
2464 
2465   /* Add record_full_arch_list_head to the end of record list.  */
2466   record_full_first.next = record_full_arch_list_head;
2467   record_full_arch_list_head->prev = &record_full_first;
2468   record_full_arch_list_tail->next = NULL;
2469   record_full_list = &record_full_first;
2470 
2471   /* Update record_full_insn_max_num.  */
2472   if (record_full_insn_num > record_full_insn_max_num)
2473     {
2474       record_full_insn_max_num = record_full_insn_num;
2475       warning (_("Auto increase record/replay buffer limit to %u."),
2476 	       record_full_insn_max_num);
2477     }
2478 
2479   /* Succeeded.  */
2480   gdb_printf (_("Restored records from core file %s.\n"),
2481 	      bfd_get_filename (core_bfd));
2482 
2483   print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
2484 }
2485 
2486 /* bfdcore_write -- write bytes into a core file section.  */
2487 
2488 static inline void
2489 bfdcore_write (bfd *obfd, asection *osec, void *buf, int len, int *offset)
2490 {
2491   int ret = bfd_set_section_contents (obfd, osec, buf, *offset, len);
2492 
2493   if (ret)
2494     *offset += len;
2495   else
2496     error (_("Failed to write %d bytes to core file %s ('%s')."),
2497 	   len, bfd_get_filename (obfd),
2498 	   bfd_errmsg (bfd_get_error ()));
2499 }
2500 
2501 /* Restore the execution log from a file.  We use a modified elf
2502    corefile format, with an extra section for our data.  */
2503 
2504 static void
2505 cmd_record_full_restore (const char *args, int from_tty)
2506 {
2507   core_file_command (args, from_tty);
2508   record_full_open (args, from_tty);
2509 }
2510 
2511 /* Save the execution log to a file.  We use a modified elf corefile
2512    format, with an extra section for our data.  */
2513 
2514 void
2515 record_full_base_target::save_record (const char *recfilename)
2516 {
2517   struct record_full_entry *cur_record_full_list;
2518   uint32_t magic;
2519   struct regcache *regcache;
2520   struct gdbarch *gdbarch;
2521   int save_size = 0;
2522   asection *osec = NULL;
2523   int bfd_offset = 0;
2524 
2525   /* Open the save file.  */
2526   if (record_debug)
2527     gdb_printf (gdb_stdlog, "Saving execution log to core file '%s'\n",
2528 		recfilename);
2529 
2530   /* Open the output file.  */
2531   gdb_bfd_ref_ptr obfd (create_gcore_bfd (recfilename));
2532 
2533   /* Arrange to remove the output file on failure.  */
2534   gdb::unlinker unlink_file (recfilename);
2535 
2536   /* Save the current record entry to "cur_record_full_list".  */
2537   cur_record_full_list = record_full_list;
2538 
2539   /* Get the values of regcache and gdbarch.  */
2540   regcache = get_current_regcache ();
2541   gdbarch = regcache->arch ();
2542 
2543   /* Disable the GDB operation record.  */
2544   scoped_restore restore_operation_disable
2545     = record_full_gdb_operation_disable_set ();
2546 
2547   /* Reverse execute to the begin of record list.  */
2548   while (1)
2549     {
2550       /* Check for beginning and end of log.  */
2551       if (record_full_list == &record_full_first)
2552 	break;
2553 
2554       record_full_exec_insn (regcache, gdbarch, record_full_list);
2555 
2556       if (record_full_list->prev)
2557 	record_full_list = record_full_list->prev;
2558     }
2559 
2560   /* Compute the size needed for the extra bfd section.  */
2561   save_size = 4;	/* magic cookie */
2562   for (record_full_list = record_full_first.next; record_full_list;
2563        record_full_list = record_full_list->next)
2564     switch (record_full_list->type)
2565       {
2566       case record_full_end:
2567 	save_size += 1 + 4 + 4;
2568 	break;
2569       case record_full_reg:
2570 	save_size += 1 + 4 + record_full_list->u.reg.len;
2571 	break;
2572       case record_full_mem:
2573 	save_size += 1 + 4 + 8 + record_full_list->u.mem.len;
2574 	break;
2575       }
2576 
2577   /* Make the new bfd section.  */
2578   osec = bfd_make_section_anyway_with_flags (obfd.get (), "precord",
2579 					     SEC_HAS_CONTENTS
2580 					     | SEC_READONLY);
2581   if (osec == NULL)
2582     error (_("Failed to create 'precord' section for corefile %s: %s"),
2583 	   recfilename,
2584 	   bfd_errmsg (bfd_get_error ()));
2585   bfd_set_section_size (osec, save_size);
2586   bfd_set_section_vma (osec, 0);
2587   bfd_set_section_alignment (osec, 0);
2588 
2589   /* Save corefile state.  */
2590   write_gcore_file (obfd.get ());
2591 
2592   /* Write out the record log.  */
2593   /* Write the magic code.  */
2594   magic = RECORD_FULL_FILE_MAGIC;
2595   if (record_debug)
2596     gdb_printf (gdb_stdlog,
2597 		"  Writing 4-byte magic cookie "
2598 		"RECORD_FULL_FILE_MAGIC (0x%s)\n",
2599 		phex_nz (magic, 4));
2600   bfdcore_write (obfd.get (), osec, &magic, sizeof (magic), &bfd_offset);
2601 
2602   /* Save the entries to recfd and forward execute to the end of
2603      record list.  */
2604   record_full_list = &record_full_first;
2605   while (1)
2606     {
2607       /* Save entry.  */
2608       if (record_full_list != &record_full_first)
2609 	{
2610 	  uint8_t type;
2611 	  uint32_t regnum, len, signal, count;
2612 	  uint64_t addr;
2613 
2614 	  type = record_full_list->type;
2615 	  bfdcore_write (obfd.get (), osec, &type, sizeof (type), &bfd_offset);
2616 
2617 	  switch (record_full_list->type)
2618 	    {
2619 	    case record_full_reg: /* reg */
2620 	      if (record_debug)
2621 		gdb_printf (gdb_stdlog,
2622 			    "  Writing register %d (1 "
2623 			    "plus %lu plus %d bytes)\n",
2624 			    record_full_list->u.reg.num,
2625 			    (unsigned long) sizeof (regnum),
2626 			    record_full_list->u.reg.len);
2627 
2628 	      /* Write regnum.  */
2629 	      regnum = netorder32 (record_full_list->u.reg.num);
2630 	      bfdcore_write (obfd.get (), osec, &regnum,
2631 			     sizeof (regnum), &bfd_offset);
2632 
2633 	      /* Write regval.  */
2634 	      bfdcore_write (obfd.get (), osec,
2635 			     record_full_get_loc (record_full_list),
2636 			     record_full_list->u.reg.len, &bfd_offset);
2637 	      break;
2638 
2639 	    case record_full_mem: /* mem */
2640 	      if (record_debug)
2641 		gdb_printf (gdb_stdlog,
2642 			    "  Writing memory %s (1 plus "
2643 			    "%lu plus %lu plus %d bytes)\n",
2644 			    paddress (gdbarch,
2645 				      record_full_list->u.mem.addr),
2646 			    (unsigned long) sizeof (addr),
2647 			    (unsigned long) sizeof (len),
2648 			    record_full_list->u.mem.len);
2649 
2650 	      /* Write memlen.  */
2651 	      len = netorder32 (record_full_list->u.mem.len);
2652 	      bfdcore_write (obfd.get (), osec, &len, sizeof (len),
2653 			     &bfd_offset);
2654 
2655 	      /* Write memaddr.  */
2656 	      addr = netorder64 (record_full_list->u.mem.addr);
2657 	      bfdcore_write (obfd.get (), osec, &addr,
2658 			     sizeof (addr), &bfd_offset);
2659 
2660 	      /* Write memval.  */
2661 	      bfdcore_write (obfd.get (), osec,
2662 			     record_full_get_loc (record_full_list),
2663 			     record_full_list->u.mem.len, &bfd_offset);
2664 	      break;
2665 
2666 	      case record_full_end:
2667 		if (record_debug)
2668 		  gdb_printf (gdb_stdlog,
2669 			      "  Writing record_full_end (1 + "
2670 			      "%lu + %lu bytes)\n",
2671 			      (unsigned long) sizeof (signal),
2672 			      (unsigned long) sizeof (count));
2673 		/* Write signal value.  */
2674 		signal = netorder32 (record_full_list->u.end.sigval);
2675 		bfdcore_write (obfd.get (), osec, &signal,
2676 			       sizeof (signal), &bfd_offset);
2677 
2678 		/* Write insn count.  */
2679 		count = netorder32 (record_full_list->u.end.insn_num);
2680 		bfdcore_write (obfd.get (), osec, &count,
2681 			       sizeof (count), &bfd_offset);
2682 		break;
2683 	    }
2684 	}
2685 
2686       /* Execute entry.  */
2687       record_full_exec_insn (regcache, gdbarch, record_full_list);
2688 
2689       if (record_full_list->next)
2690 	record_full_list = record_full_list->next;
2691       else
2692 	break;
2693     }
2694 
2695   /* Reverse execute to cur_record_full_list.  */
2696   while (1)
2697     {
2698       /* Check for beginning and end of log.  */
2699       if (record_full_list == cur_record_full_list)
2700 	break;
2701 
2702       record_full_exec_insn (regcache, gdbarch, record_full_list);
2703 
2704       if (record_full_list->prev)
2705 	record_full_list = record_full_list->prev;
2706     }
2707 
2708   unlink_file.keep ();
2709 
2710   /* Succeeded.  */
2711   gdb_printf (_("Saved core file %s with execution log.\n"),
2712 	      recfilename);
2713 }
2714 
2715 /* record_full_goto_insn -- rewind the record log (forward or backward,
2716    depending on DIR) to the given entry, changing the program state
2717    correspondingly.  */
2718 
2719 static void
2720 record_full_goto_insn (struct record_full_entry *entry,
2721 		       enum exec_direction_kind dir)
2722 {
2723   scoped_restore restore_operation_disable
2724     = record_full_gdb_operation_disable_set ();
2725   struct regcache *regcache = get_current_regcache ();
2726   struct gdbarch *gdbarch = regcache->arch ();
2727 
2728   /* Assume everything is valid: we will hit the entry,
2729      and we will not hit the end of the recording.  */
2730 
2731   if (dir == EXEC_FORWARD)
2732     record_full_list = record_full_list->next;
2733 
2734   do
2735     {
2736       record_full_exec_insn (regcache, gdbarch, record_full_list);
2737       if (dir == EXEC_REVERSE)
2738 	record_full_list = record_full_list->prev;
2739       else
2740 	record_full_list = record_full_list->next;
2741     } while (record_full_list != entry);
2742 }
2743 
2744 /* Alias for "target record-full".  */
2745 
2746 static void
2747 cmd_record_full_start (const char *args, int from_tty)
2748 {
2749   execute_command ("target record-full", from_tty);
2750 }
2751 
2752 static void
2753 set_record_full_insn_max_num (const char *args, int from_tty,
2754 			      struct cmd_list_element *c)
2755 {
2756   if (record_full_insn_num > record_full_insn_max_num)
2757     {
2758       /* Count down record_full_insn_num while releasing records from list.  */
2759       while (record_full_insn_num > record_full_insn_max_num)
2760        {
2761 	 record_full_list_release_first ();
2762 	 record_full_insn_num--;
2763        }
2764     }
2765 }
2766 
2767 void _initialize_record_full ();
2768 void
2769 _initialize_record_full ()
2770 {
2771   struct cmd_list_element *c;
2772 
2773   /* Init record_full_first.  */
2774   record_full_first.prev = NULL;
2775   record_full_first.next = NULL;
2776   record_full_first.type = record_full_end;
2777 
2778   add_target (record_full_target_info, record_full_open);
2779   add_deprecated_target_alias (record_full_target_info, "record");
2780   add_target (record_full_core_target_info, record_full_open);
2781 
2782   add_prefix_cmd ("full", class_obscure, cmd_record_full_start,
2783 		  _("Start full execution recording."), &record_full_cmdlist,
2784 		  0, &record_cmdlist);
2785 
2786   cmd_list_element *record_full_restore_cmd
2787     = add_cmd ("restore", class_obscure, cmd_record_full_restore,
2788 	       _("Restore the execution log from a file.\n\
2789 Argument is filename.  File must be created with 'record save'."),
2790 	       &record_full_cmdlist);
2791   set_cmd_completer (record_full_restore_cmd, filename_completer);
2792 
2793   /* Deprecate the old version without "full" prefix.  */
2794   c = add_alias_cmd ("restore", record_full_restore_cmd, class_obscure, 1,
2795 		     &record_cmdlist);
2796   set_cmd_completer (c, filename_completer);
2797   deprecate_cmd (c, "record full restore");
2798 
2799   add_setshow_prefix_cmd ("full", class_support,
2800 			  _("Set record options."),
2801 			  _("Show record options."),
2802 			  &set_record_full_cmdlist,
2803 			  &show_record_full_cmdlist,
2804 			  &set_record_cmdlist,
2805 			  &show_record_cmdlist);
2806 
2807   /* Record instructions number limit command.  */
2808   set_show_commands set_record_full_stop_at_limit_cmds
2809     = add_setshow_boolean_cmd ("stop-at-limit", no_class,
2810 			       &record_full_stop_at_limit, _("\
2811 Set whether record/replay stops when record/replay buffer becomes full."), _("\
2812 Show whether record/replay stops when record/replay buffer becomes full."),
2813 			   _("Default is ON.\n\
2814 When ON, if the record/replay buffer becomes full, ask user what to do.\n\
2815 When OFF, if the record/replay buffer becomes full,\n\
2816 delete the oldest recorded instruction to make room for each new one."),
2817 			       NULL, NULL,
2818 			       &set_record_full_cmdlist,
2819 			       &show_record_full_cmdlist);
2820 
2821   c = add_alias_cmd ("stop-at-limit",
2822 		     set_record_full_stop_at_limit_cmds.set, no_class, 1,
2823 		     &set_record_cmdlist);
2824   deprecate_cmd (c, "set record full stop-at-limit");
2825 
2826   c = add_alias_cmd ("stop-at-limit",
2827 		     set_record_full_stop_at_limit_cmds.show, no_class, 1,
2828 		     &show_record_cmdlist);
2829   deprecate_cmd (c, "show record full stop-at-limit");
2830 
2831   set_show_commands record_full_insn_number_max_cmds
2832     = add_setshow_uinteger_cmd ("insn-number-max", no_class,
2833 				&record_full_insn_max_num,
2834 				_("Set record/replay buffer limit."),
2835 				_("Show record/replay buffer limit."), _("\
2836 Set the maximum number of instructions to be stored in the\n\
2837 record/replay buffer.  A value of either \"unlimited\" or zero means no\n\
2838 limit.  Default is 200000."),
2839 				set_record_full_insn_max_num,
2840 				NULL, &set_record_full_cmdlist,
2841 				&show_record_full_cmdlist);
2842 
2843   c = add_alias_cmd ("insn-number-max", record_full_insn_number_max_cmds.set,
2844 		     no_class, 1, &set_record_cmdlist);
2845   deprecate_cmd (c, "set record full insn-number-max");
2846 
2847   c = add_alias_cmd ("insn-number-max", record_full_insn_number_max_cmds.show,
2848 		     no_class, 1, &show_record_cmdlist);
2849   deprecate_cmd (c, "show record full insn-number-max");
2850 
2851   set_show_commands record_full_memory_query_cmds
2852     = add_setshow_boolean_cmd ("memory-query", no_class,
2853 			       &record_full_memory_query, _("\
2854 Set whether query if PREC cannot record memory change of next instruction."),
2855 			       _("\
2856 Show whether query if PREC cannot record memory change of next instruction."),
2857 			       _("\
2858 Default is OFF.\n\
2859 When ON, query if PREC cannot record memory change of next instruction."),
2860 			       NULL, NULL,
2861 			       &set_record_full_cmdlist,
2862 			       &show_record_full_cmdlist);
2863 
2864   c = add_alias_cmd ("memory-query", record_full_memory_query_cmds.set,
2865 		     no_class, 1, &set_record_cmdlist);
2866   deprecate_cmd (c, "set record full memory-query");
2867 
2868   c = add_alias_cmd ("memory-query", record_full_memory_query_cmds.show,
2869 		     no_class, 1,&show_record_cmdlist);
2870   deprecate_cmd (c, "show record full memory-query");
2871 }
2872