* reloc.c: Add BFD_RELOC_RX_OP_NEG.
[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
61f75dd8 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)
0156b218
MS
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)
0156b218
MS
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)
868 error (_("Could not find 'to_store_registers' method on the target stack."));
869 if (!tmp_to_insert_breakpoint)
870 error (_("Could not find 'to_insert_breakpoint' method on the target stack."));
871 if (!tmp_to_remove_breakpoint)
872 error (_("Could not find 'to_remove_breakpoint' method on the target stack."));
7155de5a
HZ
873 if (!tmp_to_stopped_by_watchpoint)
874 error (_("Could not find 'to_stopped_by_watchpoint' method on the target stack."));
875 if (!tmp_to_stopped_data_address)
876 error (_("Could not find 'to_stopped_data_address' method on the target stack."));
27699eea
MS
877
878 push_target (&record_ops);
879}
880
881/* "to_open" target method. Open the process record target. */
882
883static void
884record_open (char *name, int from_tty)
885{
886 struct target_ops *t;
887
888 if (record_debug)
889 fprintf_unfiltered (gdb_stdlog, "Process record: record_open\n");
890
69d05d38
HZ
891 /* Check if record target is already running. */
892 if (current_target.to_stratum == record_stratum)
5d40bb85
HZ
893 error (_("Process record target already running. Use \"record stop\" to "
894 "stop record target first."));
69d05d38 895
27699eea
MS
896 /* Reset the tmp beneath pointers. */
897 tmp_to_resume_ops = NULL;
898 tmp_to_resume = NULL;
899 tmp_to_wait_ops = NULL;
900 tmp_to_wait = NULL;
901 tmp_to_store_registers_ops = NULL;
902 tmp_to_store_registers = NULL;
903 tmp_to_xfer_partial_ops = NULL;
904 tmp_to_xfer_partial = NULL;
905 tmp_to_insert_breakpoint = NULL;
906 tmp_to_remove_breakpoint = NULL;
7155de5a
HZ
907 tmp_to_stopped_by_watchpoint = NULL;
908 tmp_to_stopped_data_address = NULL;
69d05d38
HZ
909
910 /* Set the beneath function pointers. */
911 for (t = current_target.beneath; t != NULL; t = t->beneath)
912 {
27699eea 913 if (!tmp_to_resume)
69d05d38 914 {
27699eea
MS
915 tmp_to_resume = t->to_resume;
916 tmp_to_resume_ops = t;
69d05d38 917 }
27699eea 918 if (!tmp_to_wait)
69d05d38 919 {
27699eea
MS
920 tmp_to_wait = t->to_wait;
921 tmp_to_wait_ops = t;
69d05d38 922 }
27699eea 923 if (!tmp_to_store_registers)
69d05d38 924 {
27699eea
MS
925 tmp_to_store_registers = t->to_store_registers;
926 tmp_to_store_registers_ops = t;
69d05d38 927 }
27699eea 928 if (!tmp_to_xfer_partial)
69d05d38 929 {
27699eea
MS
930 tmp_to_xfer_partial = t->to_xfer_partial;
931 tmp_to_xfer_partial_ops = t;
69d05d38 932 }
27699eea
MS
933 if (!tmp_to_insert_breakpoint)
934 tmp_to_insert_breakpoint = t->to_insert_breakpoint;
935 if (!tmp_to_remove_breakpoint)
936 tmp_to_remove_breakpoint = t->to_remove_breakpoint;
9093389c
PA
937 if (!tmp_to_stopped_by_watchpoint)
938 tmp_to_stopped_by_watchpoint = t->to_stopped_by_watchpoint;
939 if (!tmp_to_stopped_data_address)
940 tmp_to_stopped_data_address = t->to_stopped_data_address;
69d05d38 941 }
27699eea
MS
942 if (!tmp_to_xfer_partial)
943 error (_("Could not find 'to_xfer_partial' method on the target stack."));
69d05d38
HZ
944
945 /* Reset */
946 record_insn_num = 0;
b54295a7 947 record_insn_count = 0;
69d05d38
HZ
948 record_list = &record_first;
949 record_list->next = NULL;
27699eea
MS
950
951 /* Set the tmp beneath pointers to beneath pointers. */
952 record_beneath_to_resume_ops = tmp_to_resume_ops;
953 record_beneath_to_resume = tmp_to_resume;
954 record_beneath_to_wait_ops = tmp_to_wait_ops;
955 record_beneath_to_wait = tmp_to_wait;
956 record_beneath_to_store_registers_ops = tmp_to_store_registers_ops;
957 record_beneath_to_store_registers = tmp_to_store_registers;
958 record_beneath_to_xfer_partial_ops = tmp_to_xfer_partial_ops;
959 record_beneath_to_xfer_partial = tmp_to_xfer_partial;
960 record_beneath_to_insert_breakpoint = tmp_to_insert_breakpoint;
961 record_beneath_to_remove_breakpoint = tmp_to_remove_breakpoint;
9093389c
PA
962 record_beneath_to_stopped_by_watchpoint = tmp_to_stopped_by_watchpoint;
963 record_beneath_to_stopped_data_address = tmp_to_stopped_data_address;
27699eea 964
c0edd9ed 965 if (core_bfd)
27699eea
MS
966 record_core_open_1 (name, from_tty);
967 else
968 record_open_1 (name, from_tty);
69d05d38
HZ
969}
970
6df67667
MS
971/* "to_close" target method. Close the process record target. */
972
69d05d38
HZ
973static void
974record_close (int quitting)
975{
27699eea
MS
976 struct record_core_buf_entry *entry;
977
69d05d38
HZ
978 if (record_debug)
979 fprintf_unfiltered (gdb_stdlog, "Process record: record_close\n");
980
981 record_list_release (record_list);
27699eea
MS
982
983 /* Release record_core_regbuf. */
984 if (record_core_regbuf)
985 {
986 xfree (record_core_regbuf);
987 record_core_regbuf = NULL;
988 }
989
990 /* Release record_core_buf_list. */
991 if (record_core_buf_list)
992 {
993 for (entry = record_core_buf_list->prev; entry; entry = entry->prev)
994 {
995 xfree (record_core_buf_list);
996 record_core_buf_list = entry;
997 }
998 record_core_buf_list = NULL;
999 }
69d05d38
HZ
1000}
1001
1002static int record_resume_step = 0;
69d05d38 1003
6df67667
MS
1004/* "to_resume" target method. Resume the process record target. */
1005
69d05d38
HZ
1006static void
1007record_resume (struct target_ops *ops, ptid_t ptid, int step,
8b739a96 1008 enum target_signal signal)
69d05d38
HZ
1009{
1010 record_resume_step = step;
69d05d38
HZ
1011
1012 if (!RECORD_IS_REPLAY)
1013 {
f02253f1
HZ
1014 struct gdbarch *gdbarch = target_thread_architecture (ptid);
1015
e6a386cd 1016 record_message (get_current_regcache (), signal);
f02253f1
HZ
1017
1018 if (!step)
1019 {
1020 /* This is not hard single step. */
1021 if (!gdbarch_software_single_step_p (gdbarch))
1022 {
1023 /* This is a normal continue. */
1024 step = 1;
1025 }
1026 else
1027 {
1028 /* This arch support soft sigle step. */
1029 if (single_step_breakpoints_inserted ())
1030 {
1031 /* This is a soft single step. */
1032 record_resume_step = 1;
1033 }
1034 else
1035 {
1036 /* This is a continue.
1037 Try to insert a soft single step breakpoint. */
1038 if (!gdbarch_software_single_step (gdbarch,
1039 get_current_frame ()))
1040 {
1041 /* This system don't want use soft single step.
1042 Use hard sigle step. */
1043 step = 1;
1044 }
1045 }
1046 }
1047 }
1048
1049 record_beneath_to_resume (record_beneath_to_resume_ops,
1050 ptid, step, signal);
69d05d38
HZ
1051 }
1052}
1053
1054static int record_get_sig = 0;
1055
6df67667
MS
1056/* SIGINT signal handler, registered by "to_wait" method. */
1057
69d05d38
HZ
1058static void
1059record_sig_handler (int signo)
1060{
1061 if (record_debug)
1062 fprintf_unfiltered (gdb_stdlog, "Process record: get a signal\n");
1063
1064 /* It will break the running inferior in replay mode. */
1065 record_resume_step = 1;
1066
1067 /* It will let record_wait set inferior status to get the signal
1068 SIGINT. */
1069 record_get_sig = 1;
1070}
1071
1072static void
1073record_wait_cleanups (void *ignore)
1074{
1075 if (execution_direction == EXEC_REVERSE)
1076 {
1077 if (record_list->next)
1078 record_list = record_list->next;
1079 }
1080 else
1081 record_list = record_list->prev;
1082}
1083
6df67667
MS
1084/* "to_wait" target method for process record target.
1085
1086 In record mode, the target is always run in singlestep mode
1087 (even when gdb says to continue). The to_wait method intercepts
1088 the stop events and determines which ones are to be passed on to
1089 gdb. Most stop events are just singlestep events that gdb is not
1090 to know about, so the to_wait method just records them and keeps
1091 singlestepping.
1092
1093 In replay mode, this function emulates the recorded execution log,
1094 one instruction at a time (forward or backward), and determines
1095 where to stop. */
69d05d38
HZ
1096
1097static ptid_t
1098record_wait (struct target_ops *ops,
47608cb1
PA
1099 ptid_t ptid, struct target_waitstatus *status,
1100 int options)
69d05d38
HZ
1101{
1102 struct cleanup *set_cleanups = record_gdb_operation_disable_set ();
1103
1104 if (record_debug)
1105 fprintf_unfiltered (gdb_stdlog,
1106 "Process record: record_wait "
1107 "record_resume_step = %d\n",
1108 record_resume_step);
1109
eaaffdf4
HZ
1110 record_get_sig = 0;
1111 signal (SIGINT, record_sig_handler);
1112
27699eea 1113 if (!RECORD_IS_REPLAY && ops != &record_core_ops)
69d05d38 1114 {
69d05d38
HZ
1115 if (record_resume_step)
1116 {
1117 /* This is a single step. */
1118 return record_beneath_to_wait (record_beneath_to_wait_ops,
90092760 1119 ptid, status, options);
69d05d38
HZ
1120 }
1121 else
1122 {
1123 /* This is not a single step. */
1124 ptid_t ret;
1125 CORE_ADDR tmp_pc;
f02253f1 1126 struct gdbarch *gdbarch = target_thread_architecture (inferior_ptid);
69d05d38
HZ
1127
1128 while (1)
1129 {
1130 ret = record_beneath_to_wait (record_beneath_to_wait_ops,
90092760 1131 ptid, status, options);
69d05d38 1132
f02253f1
HZ
1133 if (single_step_breakpoints_inserted ())
1134 remove_single_step_breakpoints ();
1135
eaaffdf4
HZ
1136 if (record_resume_step)
1137 return ret;
1138
8b739a96 1139 /* Is this a SIGTRAP? */
69d05d38
HZ
1140 if (status->kind == TARGET_WAITKIND_STOPPED
1141 && status->value.sig == TARGET_SIGNAL_TRAP)
1142 {
6c95b8df 1143 struct regcache *regcache;
a9840291 1144 struct address_space *aspace;
6c95b8df 1145
9093389c
PA
1146 /* Yes -- this is likely our single-step finishing,
1147 but check if there's any reason the core would be
1148 interested in the event. */
1149
69d05d38 1150 registers_changed ();
6c95b8df
PA
1151 regcache = get_current_regcache ();
1152 tmp_pc = regcache_read_pc (regcache);
a9840291 1153 aspace = get_regcache_aspace (regcache);
9093389c
PA
1154
1155 if (target_stopped_by_watchpoint ())
1156 {
1157 /* Always interested in watchpoints. */
1158 }
a9840291 1159 else if (breakpoint_inserted_here_p (aspace, tmp_pc))
69d05d38 1160 {
9093389c
PA
1161 /* There is a breakpoint here. Let the core
1162 handle it. */
a9840291
PA
1163 if (software_breakpoint_inserted_here_p (aspace, tmp_pc))
1164 {
1165 struct gdbarch *gdbarch = get_regcache_arch (regcache);
1166 CORE_ADDR decr_pc_after_break
1167 = gdbarch_decr_pc_after_break (gdbarch);
1168 if (decr_pc_after_break)
1169 regcache_write_pc (regcache,
1170 tmp_pc + decr_pc_after_break);
1171 }
69d05d38
HZ
1172 }
1173 else
1174 {
f02253f1
HZ
1175 /* This is a single-step trap. Record the
1176 insn and issue another step.
1177 FIXME: this part can be a random SIGTRAP too.
1178 But GDB cannot handle it. */
1179 int step = 1;
1180
e6a386cd
HZ
1181 if (!record_message_wrapper_safe (regcache,
1182 TARGET_SIGNAL_0))
1183 {
1184 status->kind = TARGET_WAITKIND_STOPPED;
1185 status->value.sig = TARGET_SIGNAL_0;
1186 break;
1187 }
6c95b8df 1188
f02253f1
HZ
1189 if (gdbarch_software_single_step_p (gdbarch))
1190 {
1191 /* Try to insert the software single step breakpoint.
1192 If insert success, set step to 0. */
1193 set_executing (inferior_ptid, 0);
1194 reinit_frame_cache ();
1195 if (gdbarch_software_single_step (gdbarch,
1196 get_current_frame ()))
1197 step = 0;
1198 set_executing (inferior_ptid, 1);
1199 }
1200
69d05d38 1201 record_beneath_to_resume (record_beneath_to_resume_ops,
f02253f1 1202 ptid, step,
88fef440 1203 TARGET_SIGNAL_0);
69d05d38
HZ
1204 continue;
1205 }
1206 }
1207
1208 /* The inferior is broken by a breakpoint or a signal. */
1209 break;
1210 }
1211
1212 return ret;
1213 }
1214 }
1215 else
1216 {
1217 struct regcache *regcache = get_current_regcache ();
5af949e3 1218 struct gdbarch *gdbarch = get_regcache_arch (regcache);
a9840291 1219 struct address_space *aspace = get_regcache_aspace (regcache);
69d05d38
HZ
1220 int continue_flag = 1;
1221 int first_record_end = 1;
1222 struct cleanup *old_cleanups = make_cleanup (record_wait_cleanups, 0);
1223 CORE_ADDR tmp_pc;
1224
9093389c 1225 record_hw_watchpoint = 0;
69d05d38
HZ
1226 status->kind = TARGET_WAITKIND_STOPPED;
1227
1228 /* Check breakpoint when forward execute. */
1229 if (execution_direction == EXEC_FORWARD)
1230 {
1231 tmp_pc = regcache_read_pc (regcache);
a9840291 1232 if (breakpoint_inserted_here_p (aspace, tmp_pc))
69d05d38 1233 {
a9840291
PA
1234 int decr_pc_after_break = gdbarch_decr_pc_after_break (gdbarch);
1235
69d05d38
HZ
1236 if (record_debug)
1237 fprintf_unfiltered (gdb_stdlog,
5af949e3
UW
1238 "Process record: break at %s.\n",
1239 paddress (gdbarch, tmp_pc));
a9840291
PA
1240
1241 if (decr_pc_after_break
1242 && !record_resume_step
1243 && software_breakpoint_inserted_here_p (aspace, tmp_pc))
69d05d38 1244 regcache_write_pc (regcache,
a9840291 1245 tmp_pc + decr_pc_after_break);
69d05d38
HZ
1246 goto replay_out;
1247 }
1248 }
1249
69d05d38
HZ
1250 /* If GDB is in terminal_inferior mode, it will not get the signal.
1251 And in GDB replay mode, GDB doesn't need to be in terminal_inferior
1252 mode, because inferior will not executed.
1253 Then set it to terminal_ours to make GDB get the signal. */
1254 target_terminal_ours ();
1255
1256 /* In EXEC_FORWARD mode, record_list points to the tail of prev
1257 instruction. */
1258 if (execution_direction == EXEC_FORWARD && record_list->next)
1259 record_list = record_list->next;
1260
1261 /* Loop over the record_list, looking for the next place to
1262 stop. */
1263 do
1264 {
1265 /* Check for beginning and end of log. */
1266 if (execution_direction == EXEC_REVERSE
1267 && record_list == &record_first)
1268 {
1269 /* Hit beginning of record log in reverse. */
1270 status->kind = TARGET_WAITKIND_NO_HISTORY;
1271 break;
1272 }
1273 if (execution_direction != EXEC_REVERSE && !record_list->next)
1274 {
1275 /* Hit end of record log going forward. */
1276 status->kind = TARGET_WAITKIND_NO_HISTORY;
1277 break;
1278 }
1279
90ca0479
MS
1280 record_exec_insn (regcache, gdbarch, record_list);
1281
1282 if (record_list->type == record_end)
69d05d38
HZ
1283 {
1284 if (record_debug > 1)
1285 fprintf_unfiltered (gdb_stdlog,
1286 "Process record: record_end %s to "
1287 "inferior.\n",
1288 host_address_to_string (record_list));
1289
1290 if (first_record_end && execution_direction == EXEC_REVERSE)
1291 {
1292 /* When reverse excute, the first record_end is the part of
1293 current instruction. */
1294 first_record_end = 0;
1295 }
1296 else
1297 {
1298 /* In EXEC_REVERSE mode, this is the record_end of prev
1299 instruction.
1300 In EXEC_FORWARD mode, this is the record_end of current
1301 instruction. */
1302 /* step */
1303 if (record_resume_step)
1304 {
1305 if (record_debug > 1)
1306 fprintf_unfiltered (gdb_stdlog,
1307 "Process record: step.\n");
1308 continue_flag = 0;
1309 }
1310
1311 /* check breakpoint */
1312 tmp_pc = regcache_read_pc (regcache);
a9840291 1313 if (breakpoint_inserted_here_p (aspace, tmp_pc))
69d05d38 1314 {
a9840291
PA
1315 int decr_pc_after_break
1316 = gdbarch_decr_pc_after_break (gdbarch);
1317
69d05d38
HZ
1318 if (record_debug)
1319 fprintf_unfiltered (gdb_stdlog,
1320 "Process record: break "
5af949e3
UW
1321 "at %s.\n",
1322 paddress (gdbarch, tmp_pc));
a9840291 1323 if (decr_pc_after_break
69d05d38 1324 && execution_direction == EXEC_FORWARD
a9840291
PA
1325 && !record_resume_step
1326 && software_breakpoint_inserted_here_p (aspace,
1327 tmp_pc))
69d05d38 1328 regcache_write_pc (regcache,
a9840291 1329 tmp_pc + decr_pc_after_break);
69d05d38
HZ
1330 continue_flag = 0;
1331 }
9093389c
PA
1332
1333 if (record_hw_watchpoint)
1334 {
1335 if (record_debug)
a9840291
PA
1336 fprintf_unfiltered (gdb_stdlog, "\
1337Process record: hit hw watchpoint.\n");
9093389c
PA
1338 continue_flag = 0;
1339 }
8b739a96
HZ
1340 /* Check target signal */
1341 if (record_list->u.end.sigval != TARGET_SIGNAL_0)
1342 /* FIXME: better way to check */
1343 continue_flag = 0;
69d05d38
HZ
1344 }
1345 }
1346
1347 if (continue_flag)
1348 {
1349 if (execution_direction == EXEC_REVERSE)
1350 {
1351 if (record_list->prev)
1352 record_list = record_list->prev;
1353 }
1354 else
1355 {
1356 if (record_list->next)
1357 record_list = record_list->next;
1358 }
1359 }
1360 }
1361 while (continue_flag);
1362
69d05d38
HZ
1363replay_out:
1364 if (record_get_sig)
1365 status->value.sig = TARGET_SIGNAL_INT;
8b739a96
HZ
1366 else if (record_list->u.end.sigval != TARGET_SIGNAL_0)
1367 /* FIXME: better way to check */
1368 status->value.sig = record_list->u.end.sigval;
69d05d38
HZ
1369 else
1370 status->value.sig = TARGET_SIGNAL_TRAP;
1371
1372 discard_cleanups (old_cleanups);
1373 }
1374
eaaffdf4
HZ
1375 signal (SIGINT, handle_sigint);
1376
69d05d38
HZ
1377 do_cleanups (set_cleanups);
1378 return inferior_ptid;
1379}
1380
9093389c
PA
1381static int
1382record_stopped_by_watchpoint (void)
1383{
1384 if (RECORD_IS_REPLAY)
1385 return record_hw_watchpoint;
1386 else
1387 return record_beneath_to_stopped_by_watchpoint ();
1388}
1389
1390static int
1391record_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
1392{
1393 if (RECORD_IS_REPLAY)
1394 return 0;
1395 else
1396 return record_beneath_to_stopped_data_address (ops, addr_p);
1397}
1398
6df67667
MS
1399/* "to_disconnect" method for process record target. */
1400
69d05d38
HZ
1401static void
1402record_disconnect (struct target_ops *target, char *args, int from_tty)
1403{
1404 if (record_debug)
1405 fprintf_unfiltered (gdb_stdlog, "Process record: record_disconnect\n");
1406
1407 unpush_target (&record_ops);
1408 target_disconnect (args, from_tty);
1409}
1410
6df67667
MS
1411/* "to_detach" method for process record target. */
1412
69d05d38
HZ
1413static void
1414record_detach (struct target_ops *ops, char *args, int from_tty)
1415{
1416 if (record_debug)
1417 fprintf_unfiltered (gdb_stdlog, "Process record: record_detach\n");
1418
1419 unpush_target (&record_ops);
1420 target_detach (args, from_tty);
1421}
1422
6df67667
MS
1423/* "to_mourn_inferior" method for process record target. */
1424
69d05d38
HZ
1425static void
1426record_mourn_inferior (struct target_ops *ops)
1427{
1428 if (record_debug)
1429 fprintf_unfiltered (gdb_stdlog, "Process record: "
1430 "record_mourn_inferior\n");
1431
1432 unpush_target (&record_ops);
1433 target_mourn_inferior ();
1434}
1435
1436/* Close process record target before killing the inferior process. */
1437
1438static void
1439record_kill (struct target_ops *ops)
1440{
1441 if (record_debug)
1442 fprintf_unfiltered (gdb_stdlog, "Process record: record_kill\n");
1443
1444 unpush_target (&record_ops);
1445 target_kill ();
1446}
1447
1448/* Record registers change (by user or by GDB) to list as an instruction. */
1449
1450static void
1451record_registers_change (struct regcache *regcache, int regnum)
1452{
1453 /* Check record_insn_num. */
1454 record_check_insn_num (0);
1455
1456 record_arch_list_head = NULL;
1457 record_arch_list_tail = NULL;
1458
1459 if (regnum < 0)
1460 {
1461 int i;
123f5f96 1462
69d05d38
HZ
1463 for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
1464 {
1465 if (record_arch_list_add_reg (regcache, i))
1466 {
1467 record_list_release (record_arch_list_tail);
1468 error (_("Process record: failed to record execution log."));
1469 }
1470 }
1471 }
1472 else
1473 {
1474 if (record_arch_list_add_reg (regcache, regnum))
1475 {
1476 record_list_release (record_arch_list_tail);
1477 error (_("Process record: failed to record execution log."));
1478 }
1479 }
1480 if (record_arch_list_add_end ())
1481 {
1482 record_list_release (record_arch_list_tail);
1483 error (_("Process record: failed to record execution log."));
1484 }
1485 record_list->next = record_arch_list_head;
1486 record_arch_list_head->prev = record_list;
1487 record_list = record_arch_list_tail;
1488
1489 if (record_insn_num == record_insn_max_num && record_insn_max_num)
1490 record_list_release_first ();
1491 else
1492 record_insn_num++;
1493}
1494
6df67667
MS
1495/* "to_store_registers" method for process record target. */
1496
69d05d38
HZ
1497static void
1498record_store_registers (struct target_ops *ops, struct regcache *regcache,
1499 int regno)
1500{
1501 if (!record_gdb_operation_disable)
1502 {
1503 if (RECORD_IS_REPLAY)
1504 {
1505 int n;
69d05d38
HZ
1506
1507 /* Let user choose if he wants to write register or not. */
1508 if (regno < 0)
1509 n =
604ad007
JB
1510 query (_("Because GDB is in replay mode, changing the "
1511 "value of a register will make the execution "
1512 "log unusable from this point onward. "
1513 "Change all registers?"));
69d05d38
HZ
1514 else
1515 n =
604ad007
JB
1516 query (_("Because GDB is in replay mode, changing the value "
1517 "of a register will make the execution log unusable "
1518 "from this point onward. Change register %s?"),
69d05d38
HZ
1519 gdbarch_register_name (get_regcache_arch (regcache),
1520 regno));
1521
1522 if (!n)
1523 {
1524 /* Invalidate the value of regcache that was set in function
1525 "regcache_raw_write". */
1526 if (regno < 0)
1527 {
1528 int i;
123f5f96 1529
69d05d38
HZ
1530 for (i = 0;
1531 i < gdbarch_num_regs (get_regcache_arch (regcache));
1532 i++)
1533 regcache_invalidate (regcache, i);
1534 }
1535 else
1536 regcache_invalidate (regcache, regno);
1537
1538 error (_("Process record canceled the operation."));
1539 }
1540
1541 /* Destroy the record from here forward. */
61f75dd8 1542 record_list_release_following (record_list);
69d05d38
HZ
1543 }
1544
1545 record_registers_change (regcache, regno);
1546 }
1547 record_beneath_to_store_registers (record_beneath_to_store_registers_ops,
1548 regcache, regno);
1549}
1550
27699eea 1551/* "to_xfer_partial" method. Behavior is conditional on RECORD_IS_REPLAY.
69d05d38
HZ
1552 In replay mode, we cannot write memory unles we are willing to
1553 invalidate the record/replay log from this point forward. */
1554
1555static LONGEST
1556record_xfer_partial (struct target_ops *ops, enum target_object object,
1557 const char *annex, gdb_byte *readbuf,
1558 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
1559{
1560 if (!record_gdb_operation_disable
1561 && (object == TARGET_OBJECT_MEMORY
1562 || object == TARGET_OBJECT_RAW_MEMORY) && writebuf)
1563 {
1564 if (RECORD_IS_REPLAY)
1565 {
1566 /* Let user choose if he wants to write memory or not. */
604ad007
JB
1567 if (!query (_("Because GDB is in replay mode, writing to memory "
1568 "will make the execution log unusable from this "
1569 "point onward. Write memory at address %s?"),
5af949e3 1570 paddress (target_gdbarch, offset)))
9a9dc473 1571 error (_("Process record canceled the operation."));
69d05d38
HZ
1572
1573 /* Destroy the record from here forward. */
61f75dd8 1574 record_list_release_following (record_list);
69d05d38
HZ
1575 }
1576
1577 /* Check record_insn_num */
1578 record_check_insn_num (0);
1579
1580 /* Record registers change to list as an instruction. */
1581 record_arch_list_head = NULL;
1582 record_arch_list_tail = NULL;
1583 if (record_arch_list_add_mem (offset, len))
1584 {
1585 record_list_release (record_arch_list_tail);
1586 if (record_debug)
1587 fprintf_unfiltered (gdb_stdlog,
0156b218
MS
1588 "Process record: failed to record "
1589 "execution log.");
69d05d38
HZ
1590 return -1;
1591 }
1592 if (record_arch_list_add_end ())
1593 {
1594 record_list_release (record_arch_list_tail);
1595 if (record_debug)
1596 fprintf_unfiltered (gdb_stdlog,
0156b218
MS
1597 "Process record: failed to record "
1598 "execution log.");
69d05d38
HZ
1599 return -1;
1600 }
1601 record_list->next = record_arch_list_head;
1602 record_arch_list_head->prev = record_list;
1603 record_list = record_arch_list_tail;
1604
1605 if (record_insn_num == record_insn_max_num && record_insn_max_num)
1606 record_list_release_first ();
1607 else
1608 record_insn_num++;
1609 }
1610
1611 return record_beneath_to_xfer_partial (record_beneath_to_xfer_partial_ops,
1612 object, annex, readbuf, writebuf,
1613 offset, len);
1614}
1615
1616/* Behavior is conditional on RECORD_IS_REPLAY.
1617 We will not actually insert or remove breakpoints when replaying,
1618 nor when recording. */
1619
1620static int
a6d9a66e
UW
1621record_insert_breakpoint (struct gdbarch *gdbarch,
1622 struct bp_target_info *bp_tgt)
69d05d38
HZ
1623{
1624 if (!RECORD_IS_REPLAY)
1625 {
1626 struct cleanup *old_cleanups = record_gdb_operation_disable_set ();
a6d9a66e 1627 int ret = record_beneath_to_insert_breakpoint (gdbarch, bp_tgt);
69d05d38
HZ
1628
1629 do_cleanups (old_cleanups);
1630
1631 return ret;
1632 }
1633
1634 return 0;
1635}
1636
6df67667
MS
1637/* "to_remove_breakpoint" method for process record target. */
1638
69d05d38 1639static int
a6d9a66e
UW
1640record_remove_breakpoint (struct gdbarch *gdbarch,
1641 struct bp_target_info *bp_tgt)
69d05d38
HZ
1642{
1643 if (!RECORD_IS_REPLAY)
1644 {
1645 struct cleanup *old_cleanups = record_gdb_operation_disable_set ();
a6d9a66e 1646 int ret = record_beneath_to_remove_breakpoint (gdbarch, bp_tgt);
69d05d38
HZ
1647
1648 do_cleanups (old_cleanups);
1649
1650 return ret;
1651 }
1652
1653 return 0;
1654}
1655
6df67667 1656/* "to_can_execute_reverse" method for process record target. */
27699eea 1657
69d05d38
HZ
1658static int
1659record_can_execute_reverse (void)
1660{
1661 return 1;
1662}
1663
6b04bdb7
MS
1664/* "to_get_bookmark" method for process record and prec over core. */
1665
1666static gdb_byte *
1667record_get_bookmark (char *args, int from_tty)
1668{
1669 gdb_byte *ret = NULL;
1670
1671 /* Return stringified form of instruction count. */
1672 if (record_list && record_list->type == record_end)
1673 ret = xstrdup (pulongest (record_list->u.end.insn_num));
1674
1675 if (record_debug)
1676 {
1677 if (ret)
1678 fprintf_unfiltered (gdb_stdlog,
1679 "record_get_bookmark returns %s\n", ret);
1680 else
1681 fprintf_unfiltered (gdb_stdlog,
1682 "record_get_bookmark returns NULL\n");
1683 }
1684 return ret;
1685}
1686
1687/* The implementation of the command "record goto". */
1688static void cmd_record_goto (char *, int);
1689
1690/* "to_goto_bookmark" method for process record and prec over core. */
1691
1692static void
1693record_goto_bookmark (gdb_byte *bookmark, int from_tty)
1694{
1695 if (record_debug)
1696 fprintf_unfiltered (gdb_stdlog,
1697 "record_goto_bookmark receives %s\n", bookmark);
1698
1699 if (bookmark[0] == '\'' || bookmark[0] == '\"')
1700 {
1701 if (bookmark[strlen (bookmark) - 1] != bookmark[0])
1702 error (_("Unbalanced quotes: %s"), bookmark);
1703
1704 /* Strip trailing quote. */
1705 bookmark[strlen (bookmark) - 1] = '\0';
1706 /* Strip leading quote. */
1707 bookmark++;
1708 /* Pass along to cmd_record_goto. */
1709 }
1710
1711 cmd_record_goto ((char *) bookmark, from_tty);
1712 return;
1713}
1714
69d05d38
HZ
1715static void
1716init_record_ops (void)
1717{
1718 record_ops.to_shortname = "record";
1719 record_ops.to_longname = "Process record and replay target";
1720 record_ops.to_doc =
1721 "Log program while executing and replay execution from log.";
1722 record_ops.to_open = record_open;
1723 record_ops.to_close = record_close;
1724 record_ops.to_resume = record_resume;
1725 record_ops.to_wait = record_wait;
1726 record_ops.to_disconnect = record_disconnect;
1727 record_ops.to_detach = record_detach;
1728 record_ops.to_mourn_inferior = record_mourn_inferior;
1729 record_ops.to_kill = record_kill;
1730 record_ops.to_create_inferior = find_default_create_inferior;
1731 record_ops.to_store_registers = record_store_registers;
1732 record_ops.to_xfer_partial = record_xfer_partial;
1733 record_ops.to_insert_breakpoint = record_insert_breakpoint;
1734 record_ops.to_remove_breakpoint = record_remove_breakpoint;
9093389c 1735 record_ops.to_stopped_by_watchpoint = record_stopped_by_watchpoint;
58ed7dcd 1736 record_ops.to_stopped_data_address = record_stopped_data_address;
69d05d38
HZ
1737 record_ops.to_can_execute_reverse = record_can_execute_reverse;
1738 record_ops.to_stratum = record_stratum;
6b04bdb7
MS
1739 /* Add bookmark target methods. */
1740 record_ops.to_get_bookmark = record_get_bookmark;
1741 record_ops.to_goto_bookmark = record_goto_bookmark;
69d05d38
HZ
1742 record_ops.to_magic = OPS_MAGIC;
1743}
1744
27699eea
MS
1745/* "to_resume" method for prec over corefile. */
1746
1747static void
1748record_core_resume (struct target_ops *ops, ptid_t ptid, int step,
1749 enum target_signal signal)
1750{
1751 record_resume_step = step;
1752}
1753
1754/* "to_kill" method for prec over corefile. */
1755
1756static void
1757record_core_kill (struct target_ops *ops)
1758{
1759 if (record_debug)
1760 fprintf_unfiltered (gdb_stdlog, "Process record: record_core_kill\n");
1761
1762 unpush_target (&record_core_ops);
1763}
1764
1765/* "to_fetch_registers" method for prec over corefile. */
1766
1767static void
1768record_core_fetch_registers (struct target_ops *ops,
1769 struct regcache *regcache,
1770 int regno)
1771{
1772 if (regno < 0)
1773 {
1774 int num = gdbarch_num_regs (get_regcache_arch (regcache));
1775 int i;
1776
1777 for (i = 0; i < num; i ++)
1778 regcache_raw_supply (regcache, i,
1779 record_core_regbuf + MAX_REGISTER_SIZE * i);
1780 }
1781 else
1782 regcache_raw_supply (regcache, regno,
1783 record_core_regbuf + MAX_REGISTER_SIZE * regno);
1784}
1785
1786/* "to_prepare_to_store" method for prec over corefile. */
1787
1788static void
1789record_core_prepare_to_store (struct regcache *regcache)
1790{
1791}
1792
1793/* "to_store_registers" method for prec over corefile. */
1794
1795static void
1796record_core_store_registers (struct target_ops *ops,
1797 struct regcache *regcache,
1798 int regno)
1799{
1800 if (record_gdb_operation_disable)
1801 regcache_raw_collect (regcache, regno,
1802 record_core_regbuf + MAX_REGISTER_SIZE * regno);
1803 else
1804 error (_("You can't do that without a process to debug."));
1805}
1806
1807/* "to_xfer_partial" method for prec over corefile. */
1808
1809static LONGEST
1810record_core_xfer_partial (struct target_ops *ops, enum target_object object,
1811 const char *annex, gdb_byte *readbuf,
1812 const gdb_byte *writebuf, ULONGEST offset,
1813 LONGEST len)
1814{
123f5f96
MS
1815 if (object == TARGET_OBJECT_MEMORY)
1816 {
1817 if (record_gdb_operation_disable || !writebuf)
1818 {
1819 struct target_section *p;
1820
1821 for (p = record_core_start; p < record_core_end; p++)
1822 {
1823 if (offset >= p->addr)
1824 {
1825 struct record_core_buf_entry *entry;
1826 ULONGEST sec_offset;
1827
1828 if (offset >= p->endaddr)
1829 continue;
1830
1831 if (offset + len > p->endaddr)
1832 len = p->endaddr - offset;
1833
1834 sec_offset = offset - p->addr;
1835
1836 /* Read readbuf or write writebuf p, offset, len. */
1837 /* Check flags. */
1838 if (p->the_bfd_section->flags & SEC_CONSTRUCTOR
1839 || (p->the_bfd_section->flags & SEC_HAS_CONTENTS) == 0)
1840 {
1841 if (readbuf)
1842 memset (readbuf, 0, len);
1843 return len;
1844 }
1845 /* Get record_core_buf_entry. */
1846 for (entry = record_core_buf_list; entry;
1847 entry = entry->prev)
1848 if (entry->p == p)
1849 break;
1850 if (writebuf)
1851 {
1852 if (!entry)
1853 {
1854 /* Add a new entry. */
1855 entry = (struct record_core_buf_entry *)
1856 xmalloc (sizeof (struct record_core_buf_entry));
1857 entry->p = p;
1858 if (!bfd_malloc_and_get_section (p->bfd,
1859 p->the_bfd_section,
1860 &entry->buf))
1861 {
1862 xfree (entry);
1863 return 0;
1864 }
1865 entry->prev = record_core_buf_list;
1866 record_core_buf_list = entry;
1867 }
1868
1869 memcpy (entry->buf + sec_offset, writebuf,
1870 (size_t) len);
1871 }
1872 else
1873 {
1874 if (!entry)
1875 return record_beneath_to_xfer_partial
1876 (record_beneath_to_xfer_partial_ops,
1877 object, annex, readbuf, writebuf,
1878 offset, len);
1879
1880 memcpy (readbuf, entry->buf + sec_offset,
1881 (size_t) len);
1882 }
1883
1884 return len;
1885 }
1886 }
1887
1888 return -1;
1889 }
1890 else
1891 error (_("You can't do that without a process to debug."));
1892 }
27699eea
MS
1893
1894 return record_beneath_to_xfer_partial (record_beneath_to_xfer_partial_ops,
1895 object, annex, readbuf, writebuf,
1896 offset, len);
1897}
1898
1899/* "to_insert_breakpoint" method for prec over corefile. */
1900
1901static int
1902record_core_insert_breakpoint (struct gdbarch *gdbarch,
1903 struct bp_target_info *bp_tgt)
1904{
1905 return 0;
1906}
1907
1908/* "to_remove_breakpoint" method for prec over corefile. */
1909
1910static int
1911record_core_remove_breakpoint (struct gdbarch *gdbarch,
1912 struct bp_target_info *bp_tgt)
1913{
1914 return 0;
1915}
1916
1917/* "to_has_execution" method for prec over corefile. */
1918
1919int
1920record_core_has_execution (struct target_ops *ops)
1921{
1922 return 1;
1923}
1924
1925static void
1926init_record_core_ops (void)
1927{
06280d23 1928 record_core_ops.to_shortname = "record-core";
27699eea
MS
1929 record_core_ops.to_longname = "Process record and replay target";
1930 record_core_ops.to_doc =
1931 "Log program while executing and replay execution from log.";
1932 record_core_ops.to_open = record_open;
1933 record_core_ops.to_close = record_close;
1934 record_core_ops.to_resume = record_core_resume;
1935 record_core_ops.to_wait = record_wait;
1936 record_core_ops.to_kill = record_core_kill;
1937 record_core_ops.to_fetch_registers = record_core_fetch_registers;
1938 record_core_ops.to_prepare_to_store = record_core_prepare_to_store;
1939 record_core_ops.to_store_registers = record_core_store_registers;
1940 record_core_ops.to_xfer_partial = record_core_xfer_partial;
1941 record_core_ops.to_insert_breakpoint = record_core_insert_breakpoint;
1942 record_core_ops.to_remove_breakpoint = record_core_remove_breakpoint;
9093389c 1943 record_core_ops.to_stopped_by_watchpoint = record_stopped_by_watchpoint;
58ed7dcd 1944 record_core_ops.to_stopped_data_address = record_stopped_data_address;
27699eea
MS
1945 record_core_ops.to_can_execute_reverse = record_can_execute_reverse;
1946 record_core_ops.to_has_execution = record_core_has_execution;
1947 record_core_ops.to_stratum = record_stratum;
6b04bdb7
MS
1948 /* Add bookmark target methods. */
1949 record_core_ops.to_get_bookmark = record_get_bookmark;
1950 record_core_ops.to_goto_bookmark = record_goto_bookmark;
27699eea
MS
1951 record_core_ops.to_magic = OPS_MAGIC;
1952}
1953
6df67667
MS
1954/* Implement "show record debug" command. */
1955
69d05d38
HZ
1956static void
1957show_record_debug (struct ui_file *file, int from_tty,
1958 struct cmd_list_element *c, const char *value)
1959{
1960 fprintf_filtered (file, _("Debugging of process record target is %s.\n"),
1961 value);
1962}
1963
1964/* Alias for "target record". */
1965
1966static void
1967cmd_record_start (char *args, int from_tty)
1968{
1969 execute_command ("target record", from_tty);
1970}
1971
1972/* Truncate the record log from the present point
1973 of replay until the end. */
1974
1975static void
1976cmd_record_delete (char *args, int from_tty)
1977{
1978 if (current_target.to_stratum == record_stratum)
1979 {
1980 if (RECORD_IS_REPLAY)
1981 {
1982 if (!from_tty || query (_("Delete the log from this point forward "
1983 "and begin to record the running message "
1984 "at current PC?")))
61f75dd8 1985 record_list_release_following (record_list);
69d05d38
HZ
1986 }
1987 else
1988 printf_unfiltered (_("Already at end of record list.\n"));
1989
1990 }
1991 else
1992 printf_unfiltered (_("Process record is not started.\n"));
1993}
1994
6df67667 1995/* Implement the "stoprecord" or "record stop" command. */
69d05d38
HZ
1996
1997static void
1998cmd_record_stop (char *args, int from_tty)
1999{
2000 if (current_target.to_stratum == record_stratum)
2001 {
5d40bb85 2002 unpush_target (&record_ops);
b54295a7
MS
2003 printf_unfiltered (_("Process record is stopped and all execution "
2004 "logs are deleted.\n"));
69d05d38
HZ
2005 }
2006 else
2007 printf_unfiltered (_("Process record is not started.\n"));
2008}
2009
2010/* Set upper limit of record log size. */
2011
2012static void
2013set_record_insn_max_num (char *args, int from_tty, struct cmd_list_element *c)
2014{
2015 if (record_insn_num > record_insn_max_num && record_insn_max_num)
2016 {
265aad34 2017 /* Count down record_insn_num while releasing records from list. */
69d05d38 2018 while (record_insn_num > record_insn_max_num)
265aad34
MS
2019 {
2020 record_list_release_first ();
2021 record_insn_num--;
2022 }
69d05d38
HZ
2023 }
2024}
2025
69d05d38
HZ
2026static struct cmd_list_element *record_cmdlist, *set_record_cmdlist,
2027 *show_record_cmdlist, *info_record_cmdlist;
2028
2029static void
2030set_record_command (char *args, int from_tty)
2031{
2032 printf_unfiltered (_("\
2033\"set record\" must be followed by an apporpriate subcommand.\n"));
2034 help_list (set_record_cmdlist, "set record ", all_commands, gdb_stdout);
2035}
2036
2037static void
2038show_record_command (char *args, int from_tty)
2039{
2040 cmd_show_list (show_record_cmdlist, from_tty, "");
2041}
2042
b54295a7
MS
2043/* Display some statistics about the execution log. */
2044
69d05d38
HZ
2045static void
2046info_record_command (char *args, int from_tty)
2047{
b54295a7
MS
2048 struct record_entry *p;
2049
2050 if (current_target.to_stratum == record_stratum)
2051 {
2052 if (RECORD_IS_REPLAY)
2053 printf_filtered (_("Replay mode:\n"));
2054 else
2055 printf_filtered (_("Record mode:\n"));
2056
2057 /* Find entry for first actual instruction in the log. */
2058 for (p = record_first.next;
2059 p != NULL && p->type != record_end;
2060 p = p->next)
2061 ;
2062
2063 /* Do we have a log at all? */
2064 if (p != NULL && p->type == record_end)
2065 {
2066 /* Display instruction number for first instruction in the log. */
2067 printf_filtered (_("Lowest recorded instruction number is %s.\n"),
2068 pulongest (p->u.end.insn_num));
2069
2070 /* If in replay mode, display where we are in the log. */
2071 if (RECORD_IS_REPLAY)
2072 printf_filtered (_("Current instruction number is %s.\n"),
2073 pulongest (record_list->u.end.insn_num));
2074
2075 /* Display instruction number for last instruction in the log. */
2076 printf_filtered (_("Highest recorded instruction number is %s.\n"),
2077 pulongest (record_insn_count));
2078
2079 /* Display log count. */
2080 printf_filtered (_("Log contains %d instructions.\n"),
2081 record_insn_num);
2082 }
2083 else
2084 {
2085 printf_filtered (_("No instructions have been logged.\n"));
2086 }
2087 }
2088 else
2089 {
2090 printf_filtered (_("target record is not active.\n"));
2091 }
2092
2093 /* Display max log size. */
2094 printf_filtered (_("Max logged instructions is %d.\n"),
2095 record_insn_max_num);
69d05d38
HZ
2096}
2097
0156b218
MS
2098/* Record log save-file format
2099 Version 1 (never released)
2100
2101 Header:
2102 4 bytes: magic number htonl(0x20090829).
2103 NOTE: be sure to change whenever this file format changes!
2104
2105 Records:
2106 record_end:
2107 1 byte: record type (record_end, see enum record_type).
2108 record_reg:
2109 1 byte: record type (record_reg, see enum record_type).
2110 8 bytes: register id (network byte order).
2111 MAX_REGISTER_SIZE bytes: register value.
2112 record_mem:
2113 1 byte: record type (record_mem, see enum record_type).
2114 8 bytes: memory length (network byte order).
2115 8 bytes: memory address (network byte order).
2116 n bytes: memory value (n == memory length).
2117
2118 Version 2
2119 4 bytes: magic number netorder32(0x20091016).
2120 NOTE: be sure to change whenever this file format changes!
2121
2122 Records:
2123 record_end:
2124 1 byte: record type (record_end, see enum record_type).
2125 4 bytes: signal
2126 4 bytes: instruction count
2127 record_reg:
2128 1 byte: record type (record_reg, see enum record_type).
2129 4 bytes: register id (network byte order).
2130 n bytes: register value (n == actual register size).
2131 (eg. 4 bytes for x86 general registers).
2132 record_mem:
2133 1 byte: record type (record_mem, see enum record_type).
2134 4 bytes: memory length (network byte order).
2135 8 bytes: memory address (network byte order).
2136 n bytes: memory value (n == memory length).
2137
2138*/
2139
2140/* bfdcore_read -- read bytes from a core file section. */
2141
2142static inline void
2143bfdcore_read (bfd *obfd, asection *osec, void *buf, int len, int *offset)
2144{
2145 int ret = bfd_get_section_contents (obfd, osec, buf, *offset, len);
2146
2147 if (ret)
2148 *offset += len;
2149 else
2150 error (_("Failed to read %d bytes from core file %s ('%s').\n"),
2151 len, bfd_get_filename (obfd),
2152 bfd_errmsg (bfd_get_error ()));
2153}
2154
2155static inline uint64_t
6aa96d03 2156netorder64 (uint64_t input)
0156b218 2157{
6aa96d03
MS
2158 uint64_t ret;
2159
2160 store_unsigned_integer ((gdb_byte *) &ret, sizeof (ret),
2161 BFD_ENDIAN_BIG, input);
2162 return ret;
0156b218
MS
2163}
2164
2165static inline uint32_t
6aa96d03 2166netorder32 (uint32_t input)
0156b218 2167{
6aa96d03
MS
2168 uint32_t ret;
2169
2170 store_unsigned_integer ((gdb_byte *) &ret, sizeof (ret),
2171 BFD_ENDIAN_BIG, input);
2172 return ret;
0156b218
MS
2173}
2174
2175static inline uint16_t
6aa96d03 2176netorder16 (uint16_t input)
0156b218 2177{
6aa96d03
MS
2178 uint16_t ret;
2179
2180 store_unsigned_integer ((gdb_byte *) &ret, sizeof (ret),
2181 BFD_ENDIAN_BIG, input);
2182 return ret;
0156b218
MS
2183}
2184
2185/* Restore the execution log from a core_bfd file. */
2186static void
2187record_restore (void)
2188{
2189 uint32_t magic;
2190 struct cleanup *old_cleanups;
2191 struct record_entry *rec;
2192 asection *osec;
2193 uint32_t osec_size;
2194 int bfd_offset = 0;
2195 struct regcache *regcache;
2196
2197 /* We restore the execution log from the open core bfd,
2198 if there is one. */
2199 if (core_bfd == NULL)
2200 return;
2201
2202 /* "record_restore" can only be called when record list is empty. */
2203 gdb_assert (record_first.next == NULL);
2204
2205 if (record_debug)
07b7cff3 2206 fprintf_unfiltered (gdb_stdlog, "Restoring recording from core file.\n");
0156b218
MS
2207
2208 /* Now need to find our special note section. */
2209 osec = bfd_get_section_by_name (core_bfd, "null0");
2210 osec_size = bfd_section_size (core_bfd, osec);
2211 if (record_debug)
07b7cff3
PA
2212 fprintf_unfiltered (gdb_stdlog, "Find precord section %s.\n",
2213 osec ? "succeeded" : "failed");
2214 if (osec == NULL)
0156b218
MS
2215 return;
2216 if (record_debug)
07b7cff3 2217 fprintf_unfiltered (gdb_stdlog, "%s", bfd_section_name (core_bfd, osec));
0156b218
MS
2218
2219 /* Check the magic code. */
2220 bfdcore_read (core_bfd, osec, &magic, sizeof (magic), &bfd_offset);
2221 if (magic != RECORD_FILE_MAGIC)
2222 error (_("Version mis-match or file format error in core file %s."),
2223 bfd_get_filename (core_bfd));
2224 if (record_debug)
07b7cff3 2225 fprintf_unfiltered (gdb_stdlog, "\
1de1372d 2226 Reading 4-byte magic cookie RECORD_FILE_MAGIC (0x%s)\n",
07b7cff3 2227 phex_nz (netorder32 (magic), 4));
0156b218
MS
2228
2229 /* Restore the entries in recfd into record_arch_list_head and
2230 record_arch_list_tail. */
2231 record_arch_list_head = NULL;
2232 record_arch_list_tail = NULL;
2233 record_insn_num = 0;
2234 old_cleanups = make_cleanup (record_arch_list_cleanups, 0);
2235 regcache = get_current_regcache ();
2236
2237 while (1)
2238 {
ec6dbf37 2239 uint8_t rectype;
0156b218
MS
2240 uint32_t regnum, len, signal, count;
2241 uint64_t addr;
2242
2243 /* We are finished when offset reaches osec_size. */
2244 if (bfd_offset >= osec_size)
2245 break;
ec6dbf37 2246 bfdcore_read (core_bfd, osec, &rectype, sizeof (rectype), &bfd_offset);
0156b218 2247
ec6dbf37 2248 switch (rectype)
0156b218
MS
2249 {
2250 case record_reg: /* reg */
2251 /* Get register number to regnum. */
2252 bfdcore_read (core_bfd, osec, &regnum,
2253 sizeof (regnum), &bfd_offset);
2254 regnum = netorder32 (regnum);
2255
2256 rec = record_reg_alloc (regcache, regnum);
2257
2258 /* Get val. */
2259 bfdcore_read (core_bfd, osec, record_get_loc (rec),
2260 rec->u.reg.len, &bfd_offset);
2261
07b7cff3
PA
2262 if (record_debug)
2263 fprintf_unfiltered (gdb_stdlog, "\
99ff666f 2264 Reading register %d (1 plus %lu plus %d bytes)\n",
07b7cff3
PA
2265 rec->u.reg.num,
2266 (unsigned long) sizeof (regnum),
2267 rec->u.reg.len);
0156b218
MS
2268 break;
2269
2270 case record_mem: /* mem */
2271 /* Get len. */
2272 bfdcore_read (core_bfd, osec, &len,
2273 sizeof (len), &bfd_offset);
2274 len = netorder32 (len);
2275
2276 /* Get addr. */
2277 bfdcore_read (core_bfd, osec, &addr,
2278 sizeof (addr), &bfd_offset);
2279 addr = netorder64 (addr);
2280
2281 rec = record_mem_alloc (addr, len);
2282
2283 /* Get val. */
2284 bfdcore_read (core_bfd, osec, record_get_loc (rec),
2285 rec->u.mem.len, &bfd_offset);
2286
07b7cff3
PA
2287 if (record_debug)
2288 fprintf_unfiltered (gdb_stdlog, "\
99ff666f 2289 Reading memory %s (1 plus %lu plus %lu plus %d bytes)\n",
07b7cff3
PA
2290 paddress (get_current_arch (),
2291 rec->u.mem.addr),
2292 (unsigned long) sizeof (addr),
2293 (unsigned long) sizeof (len),
2294 rec->u.mem.len);
0156b218
MS
2295 break;
2296
2297 case record_end: /* end */
2298 rec = record_end_alloc ();
2299 record_insn_num ++;
2300
2301 /* Get signal value. */
2302 bfdcore_read (core_bfd, osec, &signal,
2303 sizeof (signal), &bfd_offset);
2304 signal = netorder32 (signal);
2305 rec->u.end.sigval = signal;
2306
2307 /* Get insn count. */
2308 bfdcore_read (core_bfd, osec, &count,
2309 sizeof (count), &bfd_offset);
2310 count = netorder32 (count);
2311 rec->u.end.insn_num = count;
2312 record_insn_count = count + 1;
07b7cff3
PA
2313 if (record_debug)
2314 fprintf_unfiltered (gdb_stdlog, "\
99ff666f 2315 Reading record_end (1 + %lu + %lu bytes), offset == %s\n",
07b7cff3
PA
2316 (unsigned long) sizeof (signal),
2317 (unsigned long) sizeof (count),
2318 paddress (get_current_arch (),
2319 bfd_offset));
0156b218
MS
2320 break;
2321
2322 default:
2323 error (_("Bad entry type in core file %s."),
2324 bfd_get_filename (core_bfd));
2325 break;
2326 }
2327
2328 /* Add rec to record arch list. */
2329 record_arch_list_add (rec);
2330 }
2331
2332 discard_cleanups (old_cleanups);
2333
2334 /* Add record_arch_list_head to the end of record list. */
2335 record_first.next = record_arch_list_head;
2336 record_arch_list_head->prev = &record_first;
2337 record_arch_list_tail->next = NULL;
2338 record_list = &record_first;
2339
2340 /* Update record_insn_max_num. */
2341 if (record_insn_num > record_insn_max_num)
2342 {
2343 record_insn_max_num = record_insn_num;
2344 warning (_("Auto increase record/replay buffer limit to %d."),
2345 record_insn_max_num);
2346 }
2347
2348 /* Succeeded. */
2349 printf_filtered (_("Restored records from core file %s.\n"),
2350 bfd_get_filename (core_bfd));
2351
2352 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
2353}
2354
2355/* bfdcore_write -- write bytes into a core file section. */
2356
2357static inline void
2358bfdcore_write (bfd *obfd, asection *osec, void *buf, int len, int *offset)
2359{
2360 int ret = bfd_set_section_contents (obfd, osec, buf, *offset, len);
2361
2362 if (ret)
2363 *offset += len;
2364 else
2365 error (_("Failed to write %d bytes to core file %s ('%s').\n"),
2366 len, bfd_get_filename (obfd),
2367 bfd_errmsg (bfd_get_error ()));
2368}
2369
2370/* Restore the execution log from a file. We use a modified elf
2371 corefile format, with an extra section for our data. */
2372
2373static void
2374cmd_record_restore (char *args, int from_tty)
2375{
2376 core_file_command (args, from_tty);
2377 record_open (args, from_tty);
2378}
2379
2380static void
2381record_save_cleanups (void *data)
2382{
2383 bfd *obfd = data;
2384 char *pathname = xstrdup (bfd_get_filename (obfd));
123f5f96 2385
0156b218
MS
2386 bfd_close (obfd);
2387 unlink (pathname);
2388 xfree (pathname);
2389}
2390
2391/* Save the execution log to a file. We use a modified elf corefile
2392 format, with an extra section for our data. */
2393
2394static void
2395cmd_record_save (char *args, int from_tty)
2396{
2397 char *recfilename, recfilename_buffer[40];
0156b218
MS
2398 struct record_entry *cur_record_list;
2399 uint32_t magic;
2400 struct regcache *regcache;
2401 struct gdbarch *gdbarch;
2402 struct cleanup *old_cleanups;
2403 struct cleanup *set_cleanups;
2404 bfd *obfd;
2405 int save_size = 0;
2406 asection *osec = NULL;
2407 int bfd_offset = 0;
2408
2409 if (strcmp (current_target.to_shortname, "record") != 0)
2410 error (_("This command can only be used with target 'record'.\n"
2411 "Use 'target record' first.\n"));
2412
2413 if (args && *args)
2414 recfilename = args;
2415 else
2416 {
2417 /* Default recfile name is "gdb_record.PID". */
2418 snprintf (recfilename_buffer, sizeof (recfilename_buffer),
2419 "gdb_record.%d", PIDGET (inferior_ptid));
2420 recfilename = recfilename_buffer;
2421 }
2422
2423 /* Open the save file. */
2424 if (record_debug)
07b7cff3
PA
2425 fprintf_unfiltered (gdb_stdlog, "Saving execution log to core file '%s'\n",
2426 recfilename);
0156b218
MS
2427
2428 /* Open the output file. */
2429 obfd = create_gcore_bfd (recfilename);
2430 old_cleanups = make_cleanup (record_save_cleanups, obfd);
2431
2432 /* Save the current record entry to "cur_record_list". */
2433 cur_record_list = record_list;
2434
2435 /* Get the values of regcache and gdbarch. */
2436 regcache = get_current_regcache ();
2437 gdbarch = get_regcache_arch (regcache);
2438
2439 /* Disable the GDB operation record. */
2440 set_cleanups = record_gdb_operation_disable_set ();
2441
2442 /* Reverse execute to the begin of record list. */
2443 while (1)
2444 {
2445 /* Check for beginning and end of log. */
2446 if (record_list == &record_first)
2447 break;
2448
2449 record_exec_insn (regcache, gdbarch, record_list);
2450
2451 if (record_list->prev)
2452 record_list = record_list->prev;
2453 }
2454
2455 /* Compute the size needed for the extra bfd section. */
2456 save_size = 4; /* magic cookie */
2457 for (record_list = record_first.next; record_list;
2458 record_list = record_list->next)
2459 switch (record_list->type)
2460 {
2461 case record_end:
2462 save_size += 1 + 4 + 4;
2463 break;
2464 case record_reg:
2465 save_size += 1 + 4 + record_list->u.reg.len;
2466 break;
2467 case record_mem:
2468 save_size += 1 + 4 + 8 + record_list->u.mem.len;
2469 break;
2470 }
2471
2472 /* Make the new bfd section. */
2473 osec = bfd_make_section_anyway_with_flags (obfd, "precord",
2474 SEC_HAS_CONTENTS
2475 | SEC_READONLY);
2476 if (osec == NULL)
2477 error (_("Failed to create 'precord' section for corefile %s: %s"),
2478 recfilename,
2479 bfd_errmsg (bfd_get_error ()));
2480 bfd_set_section_size (obfd, osec, save_size);
2481 bfd_set_section_vma (obfd, osec, 0);
2482 bfd_set_section_alignment (obfd, osec, 0);
2483 bfd_section_lma (obfd, osec) = 0;
2484
2485 /* Save corefile state. */
2486 write_gcore_file (obfd);
2487
2488 /* Write out the record log. */
2489 /* Write the magic code. */
2490 magic = RECORD_FILE_MAGIC;
2491 if (record_debug)
07b7cff3 2492 fprintf_unfiltered (gdb_stdlog, "\
1de1372d 2493 Writing 4-byte magic cookie RECORD_FILE_MAGIC (0x%s)\n",
07b7cff3 2494 phex_nz (magic, 4));
0156b218
MS
2495 bfdcore_write (obfd, osec, &magic, sizeof (magic), &bfd_offset);
2496
2497 /* Save the entries to recfd and forward execute to the end of
2498 record list. */
2499 record_list = &record_first;
2500 while (1)
2501 {
2502 /* Save entry. */
2503 if (record_list != &record_first)
2504 {
2505 uint8_t type;
2506 uint32_t regnum, len, signal, count;
2507 uint64_t addr;
2508
2509 type = record_list->type;
2510 bfdcore_write (obfd, osec, &type, sizeof (type), &bfd_offset);
2511
2512 switch (record_list->type)
2513 {
2514 case record_reg: /* reg */
07b7cff3
PA
2515 if (record_debug)
2516 fprintf_unfiltered (gdb_stdlog, "\
99ff666f 2517 Writing register %d (1 plus %lu plus %d bytes)\n",
07b7cff3
PA
2518 record_list->u.reg.num,
2519 (unsigned long) sizeof (regnum),
2520 record_list->u.reg.len);
0156b218
MS
2521
2522 /* Write regnum. */
2523 regnum = netorder32 (record_list->u.reg.num);
2524 bfdcore_write (obfd, osec, &regnum,
2525 sizeof (regnum), &bfd_offset);
2526
2527 /* Write regval. */
2528 bfdcore_write (obfd, osec, record_get_loc (record_list),
2529 record_list->u.reg.len, &bfd_offset);
2530 break;
2531
2532 case record_mem: /* mem */
2533 if (record_debug)
07b7cff3 2534 fprintf_unfiltered (gdb_stdlog, "\
99ff666f 2535 Writing memory %s (1 plus %lu plus %lu plus %d bytes)\n",
07b7cff3
PA
2536 paddress (gdbarch,
2537 record_list->u.mem.addr),
2538 (unsigned long) sizeof (addr),
2539 (unsigned long) sizeof (len),
2540 record_list->u.mem.len);
0156b218
MS
2541
2542 /* Write memlen. */
2543 len = netorder32 (record_list->u.mem.len);
2544 bfdcore_write (obfd, osec, &len, sizeof (len), &bfd_offset);
2545
2546 /* Write memaddr. */
2547 addr = netorder64 (record_list->u.mem.addr);
2548 bfdcore_write (obfd, osec, &addr,
2549 sizeof (addr), &bfd_offset);
2550
2551 /* Write memval. */
2552 bfdcore_write (obfd, osec, record_get_loc (record_list),
2553 record_list->u.mem.len, &bfd_offset);
2554 break;
2555
2556 case record_end:
07b7cff3
PA
2557 if (record_debug)
2558 fprintf_unfiltered (gdb_stdlog, "\
99ff666f 2559 Writing record_end (1 + %lu + %lu bytes)\n",
07b7cff3
PA
2560 (unsigned long) sizeof (signal),
2561 (unsigned long) sizeof (count));
0156b218
MS
2562 /* Write signal value. */
2563 signal = netorder32 (record_list->u.end.sigval);
2564 bfdcore_write (obfd, osec, &signal,
2565 sizeof (signal), &bfd_offset);
2566
2567 /* Write insn count. */
2568 count = netorder32 (record_list->u.end.insn_num);
2569 bfdcore_write (obfd, osec, &count,
2570 sizeof (count), &bfd_offset);
2571 break;
2572 }
2573 }
2574
2575 /* Execute entry. */
2576 record_exec_insn (regcache, gdbarch, record_list);
2577
2578 if (record_list->next)
2579 record_list = record_list->next;
2580 else
2581 break;
2582 }
2583
2584 /* Reverse execute to cur_record_list. */
2585 while (1)
2586 {
2587 /* Check for beginning and end of log. */
2588 if (record_list == cur_record_list)
2589 break;
2590
2591 record_exec_insn (regcache, gdbarch, record_list);
2592
2593 if (record_list->prev)
2594 record_list = record_list->prev;
2595 }
2596
2597 do_cleanups (set_cleanups);
2598 bfd_close (obfd);
2599 discard_cleanups (old_cleanups);
2600
2601 /* Succeeded. */
2602 printf_filtered (_("Saved core file %s with execution log.\n"),
2603 recfilename);
2604}
2605
6b04bdb7
MS
2606/* record_goto_insn -- rewind the record log (forward or backward,
2607 depending on DIR) to the given entry, changing the program state
2608 correspondingly. */
2609
2610static void
2611record_goto_insn (struct record_entry *entry,
2612 enum exec_direction_kind dir)
2613{
2614 struct cleanup *set_cleanups = record_gdb_operation_disable_set ();
2615 struct regcache *regcache = get_current_regcache ();
2616 struct gdbarch *gdbarch = get_regcache_arch (regcache);
2617
2618 /* Assume everything is valid: we will hit the entry,
2619 and we will not hit the end of the recording. */
2620
2621 if (dir == EXEC_FORWARD)
2622 record_list = record_list->next;
2623
2624 do
2625 {
2626 record_exec_insn (regcache, gdbarch, record_list);
2627 if (dir == EXEC_REVERSE)
2628 record_list = record_list->prev;
2629 else
2630 record_list = record_list->next;
2631 } while (record_list != entry);
2632 do_cleanups (set_cleanups);
2633}
2634
2635/* "record goto" command. Argument is an instruction number,
2636 as given by "info record".
2637
2638 Rewinds the recording (forward or backward) to the given instruction. */
2639
2640static void
2641cmd_record_goto (char *arg, int from_tty)
2642{
2643 struct record_entry *p = NULL;
2644 ULONGEST target_insn = 0;
2645
2646 if (arg == NULL || *arg == '\0')
2647 error (_("Command requires an argument (insn number to go to)."));
2648
2649 if (strncmp (arg, "start", strlen ("start")) == 0
2650 || strncmp (arg, "begin", strlen ("begin")) == 0)
2651 {
2652 /* Special case. Find first insn. */
2653 for (p = &record_first; p != NULL; p = p->next)
2654 if (p->type == record_end)
2655 break;
2656 if (p)
2657 target_insn = p->u.end.insn_num;
2658 }
2659 else if (strncmp (arg, "end", strlen ("end")) == 0)
2660 {
2661 /* Special case. Find last insn. */
2662 for (p = record_list; p->next != NULL; p = p->next)
2663 ;
2664 for (; p!= NULL; p = p->prev)
2665 if (p->type == record_end)
2666 break;
2667 if (p)
2668 target_insn = p->u.end.insn_num;
2669 }
2670 else
2671 {
2672 /* General case. Find designated insn. */
2673 target_insn = parse_and_eval_long (arg);
2674
2675 for (p = &record_first; p != NULL; p = p->next)
2676 if (p->type == record_end && p->u.end.insn_num == target_insn)
2677 break;
2678 }
2679
2680 if (p == NULL)
2681 error (_("Target insn '%s' not found."), arg);
2682 else if (p == record_list)
2683 error (_("Already at insn '%s'."), arg);
2684 else if (p->u.end.insn_num > record_list->u.end.insn_num)
2685 {
2686 printf_filtered (_("Go forward to insn number %s\n"),
2687 pulongest (target_insn));
2688 record_goto_insn (p, EXEC_FORWARD);
2689 }
2690 else
2691 {
2692 printf_filtered (_("Go backward to insn number %s\n"),
2693 pulongest (target_insn));
2694 record_goto_insn (p, EXEC_REVERSE);
2695 }
2696 registers_changed ();
2697 reinit_frame_cache ();
2698 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
2699}
2700
69d05d38
HZ
2701void
2702_initialize_record (void)
2703{
0156b218
MS
2704 struct cmd_list_element *c;
2705
69d05d38
HZ
2706 /* Init record_first. */
2707 record_first.prev = NULL;
2708 record_first.next = NULL;
2709 record_first.type = record_end;
2710
2711 init_record_ops ();
2712 add_target (&record_ops);
27699eea
MS
2713 init_record_core_ops ();
2714 add_target (&record_core_ops);
69d05d38
HZ
2715
2716 add_setshow_zinteger_cmd ("record", no_class, &record_debug,
2717 _("Set debugging of record/replay feature."),
2718 _("Show debugging of record/replay feature."),
2719 _("When enabled, debugging output for "
2720 "record/replay feature is displayed."),
2721 NULL, show_record_debug, &setdebuglist,
2722 &showdebuglist);
2723
0156b218
MS
2724 c = add_prefix_cmd ("record", class_obscure, cmd_record_start,
2725 _("Abbreviated form of \"target record\" command."),
2726 &record_cmdlist, "record ", 0, &cmdlist);
2727 set_cmd_completer (c, filename_completer);
2728
69d05d38
HZ
2729 add_com_alias ("rec", "record", class_obscure, 1);
2730 add_prefix_cmd ("record", class_support, set_record_command,
2731 _("Set record options"), &set_record_cmdlist,
2732 "set record ", 0, &setlist);
2733 add_alias_cmd ("rec", "record", class_obscure, 1, &setlist);
2734 add_prefix_cmd ("record", class_support, show_record_command,
2735 _("Show record options"), &show_record_cmdlist,
2736 "show record ", 0, &showlist);
2737 add_alias_cmd ("rec", "record", class_obscure, 1, &showlist);
2738 add_prefix_cmd ("record", class_support, info_record_command,
2739 _("Info record options"), &info_record_cmdlist,
2740 "info record ", 0, &infolist);
2741 add_alias_cmd ("rec", "record", class_obscure, 1, &infolist);
2742
0156b218
MS
2743 c = add_cmd ("save", class_obscure, cmd_record_save,
2744 _("Save the execution log to a file.\n\
2745Argument is optional filename.\n\
2746Default filename is 'gdb_record.<process_id>'."),
2747 &record_cmdlist);
2748 set_cmd_completer (c, filename_completer);
2749
2750 c = add_cmd ("restore", class_obscure, cmd_record_restore,
2751 _("Restore the execution log from a file.\n\
2752Argument is filename. File must be created with 'record save'."),
2753 &record_cmdlist);
2754 set_cmd_completer (c, filename_completer);
69d05d38
HZ
2755
2756 add_cmd ("delete", class_obscure, cmd_record_delete,
2757 _("Delete the rest of execution log and start recording it anew."),
2758 &record_cmdlist);
2759 add_alias_cmd ("d", "delete", class_obscure, 1, &record_cmdlist);
2760 add_alias_cmd ("del", "delete", class_obscure, 1, &record_cmdlist);
2761
2762 add_cmd ("stop", class_obscure, cmd_record_stop,
2763 _("Stop the record/replay target."),
2764 &record_cmdlist);
2765 add_alias_cmd ("s", "stop", class_obscure, 1, &record_cmdlist);
2766
2767 /* Record instructions number limit command. */
2768 add_setshow_boolean_cmd ("stop-at-limit", no_class,
fda458ee 2769 &record_stop_at_limit, _("\
299a410e
EZ
2770Set whether record/replay stops when record/replay buffer becomes full."), _("\
2771Show whether record/replay stops when record/replay buffer becomes full."), _("\
2772Default is ON.\n\
2773When ON, if the record/replay buffer becomes full, ask user what to do.\n\
2774When OFF, if the record/replay buffer becomes full,\n\
2775delete the oldest recorded instruction to make room for each new one."),
fda458ee
MS
2776 NULL, NULL,
2777 &set_record_cmdlist, &show_record_cmdlist);
191e1813 2778 add_setshow_uinteger_cmd ("insn-number-max", no_class,
69d05d38
HZ
2779 &record_insn_max_num,
2780 _("Set record/replay buffer limit."),
299a410e
EZ
2781 _("Show record/replay buffer limit."), _("\
2782Set the maximum number of instructions to be stored in the\n\
2783record/replay buffer. Zero means unlimited. Default is 200000."),
69d05d38
HZ
2784 set_record_insn_max_num,
2785 NULL, &set_record_cmdlist, &show_record_cmdlist);
6b04bdb7
MS
2786
2787 add_cmd ("goto", class_obscure, cmd_record_goto, _("\
2788Restore the program to its state at instruction number N.\n\
2789Argument is instruction number, as shown by 'info record'."),
2790 &record_cmdlist);
bb08c432
HZ
2791
2792 add_setshow_boolean_cmd ("memory-query", no_class,
2793 &record_memory_query, _("\
2794Set whether query if PREC cannot record memory change of next instruction."),
2795 _("\
2796Show whether query if PREC cannot record memory change of next instruction."),
2797 _("\
2798Default is OFF.\n\
2799When ON, query if PREC cannot record memory change of next instruction."),
2800 NULL, NULL,
2801 &set_record_cmdlist, &show_record_cmdlist);
a480d2f6 2802
69d05d38 2803}
This page took 0.320377 seconds and 4 git commands to generate.