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