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