]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/record-btrace.c
record-btrace: add (reverse-)stepping support
[thirdparty/binutils-gdb.git] / gdb / record-btrace.c
1 /* Branch trace support for GDB, the GNU debugger.
2
3 Copyright (C) 2013-2014 Free Software Foundation, Inc.
4
5 Contributed by Intel Corp. <markus.t.metzger@intel.com>
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22 #include "defs.h"
23 #include "record.h"
24 #include "gdbthread.h"
25 #include "target.h"
26 #include "gdbcmd.h"
27 #include "disasm.h"
28 #include "observer.h"
29 #include "exceptions.h"
30 #include "cli/cli-utils.h"
31 #include "source.h"
32 #include "ui-out.h"
33 #include "symtab.h"
34 #include "filenames.h"
35 #include "regcache.h"
36 #include "frame-unwind.h"
37 #include "hashtab.h"
38
39 /* The target_ops of record-btrace. */
40 static struct target_ops record_btrace_ops;
41
42 /* A new thread observer enabling branch tracing for the new thread. */
43 static struct observer *record_btrace_thread_observer;
44
45 /* Temporarily allow memory accesses. */
46 static int record_btrace_allow_memory_access;
47
48 /* Print a record-btrace debug message. Use do ... while (0) to avoid
49 ambiguities when used in if statements. */
50
51 #define DEBUG(msg, args...) \
52 do \
53 { \
54 if (record_debug != 0) \
55 fprintf_unfiltered (gdb_stdlog, \
56 "[record-btrace] " msg "\n", ##args); \
57 } \
58 while (0)
59
60
61 /* Update the branch trace for the current thread and return a pointer to its
62 thread_info.
63
64 Throws an error if there is no thread or no trace. This function never
65 returns NULL. */
66
67 static struct thread_info *
68 require_btrace_thread (void)
69 {
70 struct thread_info *tp;
71
72 DEBUG ("require");
73
74 tp = find_thread_ptid (inferior_ptid);
75 if (tp == NULL)
76 error (_("No thread."));
77
78 btrace_fetch (tp);
79
80 if (btrace_is_empty (tp))
81 error (_("No trace."));
82
83 return tp;
84 }
85
86 /* Update the branch trace for the current thread and return a pointer to its
87 branch trace information struct.
88
89 Throws an error if there is no thread or no trace. This function never
90 returns NULL. */
91
92 static struct btrace_thread_info *
93 require_btrace (void)
94 {
95 struct thread_info *tp;
96
97 tp = require_btrace_thread ();
98
99 return &tp->btrace;
100 }
101
102 /* Enable branch tracing for one thread. Warn on errors. */
103
104 static void
105 record_btrace_enable_warn (struct thread_info *tp)
106 {
107 volatile struct gdb_exception error;
108
109 TRY_CATCH (error, RETURN_MASK_ERROR)
110 btrace_enable (tp);
111
112 if (error.message != NULL)
113 warning ("%s", error.message);
114 }
115
116 /* Callback function to disable branch tracing for one thread. */
117
118 static void
119 record_btrace_disable_callback (void *arg)
120 {
121 struct thread_info *tp;
122
123 tp = arg;
124
125 btrace_disable (tp);
126 }
127
128 /* Enable automatic tracing of new threads. */
129
130 static void
131 record_btrace_auto_enable (void)
132 {
133 DEBUG ("attach thread observer");
134
135 record_btrace_thread_observer
136 = observer_attach_new_thread (record_btrace_enable_warn);
137 }
138
139 /* Disable automatic tracing of new threads. */
140
141 static void
142 record_btrace_auto_disable (void)
143 {
144 /* The observer may have been detached, already. */
145 if (record_btrace_thread_observer == NULL)
146 return;
147
148 DEBUG ("detach thread observer");
149
150 observer_detach_new_thread (record_btrace_thread_observer);
151 record_btrace_thread_observer = NULL;
152 }
153
154 /* The to_open method of target record-btrace. */
155
156 static void
157 record_btrace_open (char *args, int from_tty)
158 {
159 struct cleanup *disable_chain;
160 struct thread_info *tp;
161
162 DEBUG ("open");
163
164 record_preopen ();
165
166 if (!target_has_execution)
167 error (_("The program is not being run."));
168
169 if (!target_supports_btrace ())
170 error (_("Target does not support branch tracing."));
171
172 if (non_stop)
173 error (_("Record btrace can't debug inferior in non-stop mode."));
174
175 gdb_assert (record_btrace_thread_observer == NULL);
176
177 disable_chain = make_cleanup (null_cleanup, NULL);
178 ALL_THREADS (tp)
179 if (args == NULL || *args == 0 || number_is_in_list (args, tp->num))
180 {
181 btrace_enable (tp);
182
183 make_cleanup (record_btrace_disable_callback, tp);
184 }
185
186 record_btrace_auto_enable ();
187
188 push_target (&record_btrace_ops);
189
190 observer_notify_record_changed (current_inferior (), 1);
191
192 discard_cleanups (disable_chain);
193 }
194
195 /* The to_stop_recording method of target record-btrace. */
196
197 static void
198 record_btrace_stop_recording (void)
199 {
200 struct thread_info *tp;
201
202 DEBUG ("stop recording");
203
204 record_btrace_auto_disable ();
205
206 ALL_THREADS (tp)
207 if (tp->btrace.target != NULL)
208 btrace_disable (tp);
209 }
210
211 /* The to_close method of target record-btrace. */
212
213 static void
214 record_btrace_close (void)
215 {
216 /* Make sure automatic recording gets disabled even if we did not stop
217 recording before closing the record-btrace target. */
218 record_btrace_auto_disable ();
219
220 /* We already stopped recording. */
221 }
222
223 /* The to_info_record method of target record-btrace. */
224
225 static void
226 record_btrace_info (void)
227 {
228 struct btrace_thread_info *btinfo;
229 struct thread_info *tp;
230 unsigned int insns, calls;
231
232 DEBUG ("info");
233
234 tp = find_thread_ptid (inferior_ptid);
235 if (tp == NULL)
236 error (_("No thread."));
237
238 btrace_fetch (tp);
239
240 insns = 0;
241 calls = 0;
242
243 btinfo = &tp->btrace;
244
245 if (!btrace_is_empty (tp))
246 {
247 struct btrace_call_iterator call;
248 struct btrace_insn_iterator insn;
249
250 btrace_call_end (&call, btinfo);
251 btrace_call_prev (&call, 1);
252 calls = btrace_call_number (&call);
253
254 btrace_insn_end (&insn, btinfo);
255 btrace_insn_prev (&insn, 1);
256 insns = btrace_insn_number (&insn);
257 }
258
259 printf_unfiltered (_("Recorded %u instructions in %u functions for thread "
260 "%d (%s).\n"), insns, calls, tp->num,
261 target_pid_to_str (tp->ptid));
262
263 if (btrace_is_replaying (tp))
264 printf_unfiltered (_("Replay in progress. At instruction %u.\n"),
265 btrace_insn_number (btinfo->replay));
266 }
267
268 /* Print an unsigned int. */
269
270 static void
271 ui_out_field_uint (struct ui_out *uiout, const char *fld, unsigned int val)
272 {
273 ui_out_field_fmt (uiout, fld, "%u", val);
274 }
275
276 /* Disassemble a section of the recorded instruction trace. */
277
278 static void
279 btrace_insn_history (struct ui_out *uiout,
280 const struct btrace_insn_iterator *begin,
281 const struct btrace_insn_iterator *end, int flags)
282 {
283 struct gdbarch *gdbarch;
284 struct btrace_insn_iterator it;
285
286 DEBUG ("itrace (0x%x): [%u; %u)", flags, btrace_insn_number (begin),
287 btrace_insn_number (end));
288
289 gdbarch = target_gdbarch ();
290
291 for (it = *begin; btrace_insn_cmp (&it, end) != 0; btrace_insn_next (&it, 1))
292 {
293 const struct btrace_insn *insn;
294
295 insn = btrace_insn_get (&it);
296
297 /* Print the instruction index. */
298 ui_out_field_uint (uiout, "index", btrace_insn_number (&it));
299 ui_out_text (uiout, "\t");
300
301 /* Disassembly with '/m' flag may not produce the expected result.
302 See PR gdb/11833. */
303 gdb_disassembly (gdbarch, uiout, NULL, flags, 1, insn->pc, insn->pc + 1);
304 }
305 }
306
307 /* The to_insn_history method of target record-btrace. */
308
309 static void
310 record_btrace_insn_history (int size, int flags)
311 {
312 struct btrace_thread_info *btinfo;
313 struct btrace_insn_history *history;
314 struct btrace_insn_iterator begin, end;
315 struct cleanup *uiout_cleanup;
316 struct ui_out *uiout;
317 unsigned int context, covered;
318
319 uiout = current_uiout;
320 uiout_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout,
321 "insn history");
322 context = abs (size);
323 if (context == 0)
324 error (_("Bad record instruction-history-size."));
325
326 btinfo = require_btrace ();
327 history = btinfo->insn_history;
328 if (history == NULL)
329 {
330 struct btrace_insn_iterator *replay;
331
332 DEBUG ("insn-history (0x%x): %d", flags, size);
333
334 /* If we're replaying, we start at the replay position. Otherwise, we
335 start at the tail of the trace. */
336 replay = btinfo->replay;
337 if (replay != NULL)
338 begin = *replay;
339 else
340 btrace_insn_end (&begin, btinfo);
341
342 /* We start from here and expand in the requested direction. Then we
343 expand in the other direction, as well, to fill up any remaining
344 context. */
345 end = begin;
346 if (size < 0)
347 {
348 /* We want the current position covered, as well. */
349 covered = btrace_insn_next (&end, 1);
350 covered += btrace_insn_prev (&begin, context - covered);
351 covered += btrace_insn_next (&end, context - covered);
352 }
353 else
354 {
355 covered = btrace_insn_next (&end, context);
356 covered += btrace_insn_prev (&begin, context - covered);
357 }
358 }
359 else
360 {
361 begin = history->begin;
362 end = history->end;
363
364 DEBUG ("insn-history (0x%x): %d, prev: [%u; %u)", flags, size,
365 btrace_insn_number (&begin), btrace_insn_number (&end));
366
367 if (size < 0)
368 {
369 end = begin;
370 covered = btrace_insn_prev (&begin, context);
371 }
372 else
373 {
374 begin = end;
375 covered = btrace_insn_next (&end, context);
376 }
377 }
378
379 if (covered > 0)
380 btrace_insn_history (uiout, &begin, &end, flags);
381 else
382 {
383 if (size < 0)
384 printf_unfiltered (_("At the start of the branch trace record.\n"));
385 else
386 printf_unfiltered (_("At the end of the branch trace record.\n"));
387 }
388
389 btrace_set_insn_history (btinfo, &begin, &end);
390 do_cleanups (uiout_cleanup);
391 }
392
393 /* The to_insn_history_range method of target record-btrace. */
394
395 static void
396 record_btrace_insn_history_range (ULONGEST from, ULONGEST to, int flags)
397 {
398 struct btrace_thread_info *btinfo;
399 struct btrace_insn_history *history;
400 struct btrace_insn_iterator begin, end;
401 struct cleanup *uiout_cleanup;
402 struct ui_out *uiout;
403 unsigned int low, high;
404 int found;
405
406 uiout = current_uiout;
407 uiout_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout,
408 "insn history");
409 low = from;
410 high = to;
411
412 DEBUG ("insn-history (0x%x): [%u; %u)", flags, low, high);
413
414 /* Check for wrap-arounds. */
415 if (low != from || high != to)
416 error (_("Bad range."));
417
418 if (high < low)
419 error (_("Bad range."));
420
421 btinfo = require_btrace ();
422
423 found = btrace_find_insn_by_number (&begin, btinfo, low);
424 if (found == 0)
425 error (_("Range out of bounds."));
426
427 found = btrace_find_insn_by_number (&end, btinfo, high);
428 if (found == 0)
429 {
430 /* Silently truncate the range. */
431 btrace_insn_end (&end, btinfo);
432 }
433 else
434 {
435 /* We want both begin and end to be inclusive. */
436 btrace_insn_next (&end, 1);
437 }
438
439 btrace_insn_history (uiout, &begin, &end, flags);
440 btrace_set_insn_history (btinfo, &begin, &end);
441
442 do_cleanups (uiout_cleanup);
443 }
444
445 /* The to_insn_history_from method of target record-btrace. */
446
447 static void
448 record_btrace_insn_history_from (ULONGEST from, int size, int flags)
449 {
450 ULONGEST begin, end, context;
451
452 context = abs (size);
453 if (context == 0)
454 error (_("Bad record instruction-history-size."));
455
456 if (size < 0)
457 {
458 end = from;
459
460 if (from < context)
461 begin = 0;
462 else
463 begin = from - context + 1;
464 }
465 else
466 {
467 begin = from;
468 end = from + context - 1;
469
470 /* Check for wrap-around. */
471 if (end < begin)
472 end = ULONGEST_MAX;
473 }
474
475 record_btrace_insn_history_range (begin, end, flags);
476 }
477
478 /* Print the instruction number range for a function call history line. */
479
480 static void
481 btrace_call_history_insn_range (struct ui_out *uiout,
482 const struct btrace_function *bfun)
483 {
484 unsigned int begin, end, size;
485
486 size = VEC_length (btrace_insn_s, bfun->insn);
487 gdb_assert (size > 0);
488
489 begin = bfun->insn_offset;
490 end = begin + size - 1;
491
492 ui_out_field_uint (uiout, "insn begin", begin);
493 ui_out_text (uiout, ",");
494 ui_out_field_uint (uiout, "insn end", end);
495 }
496
497 /* Print the source line information for a function call history line. */
498
499 static void
500 btrace_call_history_src_line (struct ui_out *uiout,
501 const struct btrace_function *bfun)
502 {
503 struct symbol *sym;
504 int begin, end;
505
506 sym = bfun->sym;
507 if (sym == NULL)
508 return;
509
510 ui_out_field_string (uiout, "file",
511 symtab_to_filename_for_display (sym->symtab));
512
513 begin = bfun->lbegin;
514 end = bfun->lend;
515
516 if (end < begin)
517 return;
518
519 ui_out_text (uiout, ":");
520 ui_out_field_int (uiout, "min line", begin);
521
522 if (end == begin)
523 return;
524
525 ui_out_text (uiout, ",");
526 ui_out_field_int (uiout, "max line", end);
527 }
528
529 /* Get the name of a branch trace function. */
530
531 static const char *
532 btrace_get_bfun_name (const struct btrace_function *bfun)
533 {
534 struct minimal_symbol *msym;
535 struct symbol *sym;
536
537 if (bfun == NULL)
538 return "??";
539
540 msym = bfun->msym;
541 sym = bfun->sym;
542
543 if (sym != NULL)
544 return SYMBOL_PRINT_NAME (sym);
545 else if (msym != NULL)
546 return SYMBOL_PRINT_NAME (msym);
547 else
548 return "??";
549 }
550
551 /* Disassemble a section of the recorded function trace. */
552
553 static void
554 btrace_call_history (struct ui_out *uiout,
555 const struct btrace_thread_info *btinfo,
556 const struct btrace_call_iterator *begin,
557 const struct btrace_call_iterator *end,
558 enum record_print_flag flags)
559 {
560 struct btrace_call_iterator it;
561
562 DEBUG ("ftrace (0x%x): [%u; %u)", flags, btrace_call_number (begin),
563 btrace_call_number (end));
564
565 for (it = *begin; btrace_call_cmp (&it, end) < 0; btrace_call_next (&it, 1))
566 {
567 const struct btrace_function *bfun;
568 struct minimal_symbol *msym;
569 struct symbol *sym;
570
571 bfun = btrace_call_get (&it);
572 sym = bfun->sym;
573 msym = bfun->msym;
574
575 /* Print the function index. */
576 ui_out_field_uint (uiout, "index", bfun->number);
577 ui_out_text (uiout, "\t");
578
579 if ((flags & RECORD_PRINT_INDENT_CALLS) != 0)
580 {
581 int level = bfun->level + btinfo->level, i;
582
583 for (i = 0; i < level; ++i)
584 ui_out_text (uiout, " ");
585 }
586
587 if (sym != NULL)
588 ui_out_field_string (uiout, "function", SYMBOL_PRINT_NAME (sym));
589 else if (msym != NULL)
590 ui_out_field_string (uiout, "function", SYMBOL_PRINT_NAME (msym));
591 else if (!ui_out_is_mi_like_p (uiout))
592 ui_out_field_string (uiout, "function", "??");
593
594 if ((flags & RECORD_PRINT_INSN_RANGE) != 0)
595 {
596 ui_out_text (uiout, _("\tinst "));
597 btrace_call_history_insn_range (uiout, bfun);
598 }
599
600 if ((flags & RECORD_PRINT_SRC_LINE) != 0)
601 {
602 ui_out_text (uiout, _("\tat "));
603 btrace_call_history_src_line (uiout, bfun);
604 }
605
606 ui_out_text (uiout, "\n");
607 }
608 }
609
610 /* The to_call_history method of target record-btrace. */
611
612 static void
613 record_btrace_call_history (int size, int flags)
614 {
615 struct btrace_thread_info *btinfo;
616 struct btrace_call_history *history;
617 struct btrace_call_iterator begin, end;
618 struct cleanup *uiout_cleanup;
619 struct ui_out *uiout;
620 unsigned int context, covered;
621
622 uiout = current_uiout;
623 uiout_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout,
624 "insn history");
625 context = abs (size);
626 if (context == 0)
627 error (_("Bad record function-call-history-size."));
628
629 btinfo = require_btrace ();
630 history = btinfo->call_history;
631 if (history == NULL)
632 {
633 struct btrace_insn_iterator *replay;
634
635 DEBUG ("call-history (0x%x): %d", flags, size);
636
637 /* If we're replaying, we start at the replay position. Otherwise, we
638 start at the tail of the trace. */
639 replay = btinfo->replay;
640 if (replay != NULL)
641 {
642 begin.function = replay->function;
643 begin.btinfo = btinfo;
644 }
645 else
646 btrace_call_end (&begin, btinfo);
647
648 /* We start from here and expand in the requested direction. Then we
649 expand in the other direction, as well, to fill up any remaining
650 context. */
651 end = begin;
652 if (size < 0)
653 {
654 /* We want the current position covered, as well. */
655 covered = btrace_call_next (&end, 1);
656 covered += btrace_call_prev (&begin, context - covered);
657 covered += btrace_call_next (&end, context - covered);
658 }
659 else
660 {
661 covered = btrace_call_next (&end, context);
662 covered += btrace_call_prev (&begin, context- covered);
663 }
664 }
665 else
666 {
667 begin = history->begin;
668 end = history->end;
669
670 DEBUG ("call-history (0x%x): %d, prev: [%u; %u)", flags, size,
671 btrace_call_number (&begin), btrace_call_number (&end));
672
673 if (size < 0)
674 {
675 end = begin;
676 covered = btrace_call_prev (&begin, context);
677 }
678 else
679 {
680 begin = end;
681 covered = btrace_call_next (&end, context);
682 }
683 }
684
685 if (covered > 0)
686 btrace_call_history (uiout, btinfo, &begin, &end, flags);
687 else
688 {
689 if (size < 0)
690 printf_unfiltered (_("At the start of the branch trace record.\n"));
691 else
692 printf_unfiltered (_("At the end of the branch trace record.\n"));
693 }
694
695 btrace_set_call_history (btinfo, &begin, &end);
696 do_cleanups (uiout_cleanup);
697 }
698
699 /* The to_call_history_range method of target record-btrace. */
700
701 static void
702 record_btrace_call_history_range (ULONGEST from, ULONGEST to, int flags)
703 {
704 struct btrace_thread_info *btinfo;
705 struct btrace_call_history *history;
706 struct btrace_call_iterator begin, end;
707 struct cleanup *uiout_cleanup;
708 struct ui_out *uiout;
709 unsigned int low, high;
710 int found;
711
712 uiout = current_uiout;
713 uiout_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout,
714 "func history");
715 low = from;
716 high = to;
717
718 DEBUG ("call-history (0x%x): [%u; %u)", flags, low, high);
719
720 /* Check for wrap-arounds. */
721 if (low != from || high != to)
722 error (_("Bad range."));
723
724 if (high < low)
725 error (_("Bad range."));
726
727 btinfo = require_btrace ();
728
729 found = btrace_find_call_by_number (&begin, btinfo, low);
730 if (found == 0)
731 error (_("Range out of bounds."));
732
733 found = btrace_find_call_by_number (&end, btinfo, high);
734 if (found == 0)
735 {
736 /* Silently truncate the range. */
737 btrace_call_end (&end, btinfo);
738 }
739 else
740 {
741 /* We want both begin and end to be inclusive. */
742 btrace_call_next (&end, 1);
743 }
744
745 btrace_call_history (uiout, btinfo, &begin, &end, flags);
746 btrace_set_call_history (btinfo, &begin, &end);
747
748 do_cleanups (uiout_cleanup);
749 }
750
751 /* The to_call_history_from method of target record-btrace. */
752
753 static void
754 record_btrace_call_history_from (ULONGEST from, int size, int flags)
755 {
756 ULONGEST begin, end, context;
757
758 context = abs (size);
759 if (context == 0)
760 error (_("Bad record function-call-history-size."));
761
762 if (size < 0)
763 {
764 end = from;
765
766 if (from < context)
767 begin = 0;
768 else
769 begin = from - context + 1;
770 }
771 else
772 {
773 begin = from;
774 end = from + context - 1;
775
776 /* Check for wrap-around. */
777 if (end < begin)
778 end = ULONGEST_MAX;
779 }
780
781 record_btrace_call_history_range (begin, end, flags);
782 }
783
784 /* The to_record_is_replaying method of target record-btrace. */
785
786 static int
787 record_btrace_is_replaying (void)
788 {
789 struct thread_info *tp;
790
791 ALL_THREADS (tp)
792 if (btrace_is_replaying (tp))
793 return 1;
794
795 return 0;
796 }
797
798 /* The to_xfer_partial method of target record-btrace. */
799
800 static LONGEST
801 record_btrace_xfer_partial (struct target_ops *ops, enum target_object object,
802 const char *annex, gdb_byte *readbuf,
803 const gdb_byte *writebuf, ULONGEST offset,
804 ULONGEST len)
805 {
806 struct target_ops *t;
807
808 /* Filter out requests that don't make sense during replay. */
809 if (!record_btrace_allow_memory_access && record_btrace_is_replaying ())
810 {
811 switch (object)
812 {
813 case TARGET_OBJECT_MEMORY:
814 {
815 struct target_section *section;
816
817 /* We do not allow writing memory in general. */
818 if (writebuf != NULL)
819 return TARGET_XFER_E_UNAVAILABLE;
820
821 /* We allow reading readonly memory. */
822 section = target_section_by_addr (ops, offset);
823 if (section != NULL)
824 {
825 /* Check if the section we found is readonly. */
826 if ((bfd_get_section_flags (section->the_bfd_section->owner,
827 section->the_bfd_section)
828 & SEC_READONLY) != 0)
829 {
830 /* Truncate the request to fit into this section. */
831 len = min (len, section->endaddr - offset);
832 break;
833 }
834 }
835
836 return TARGET_XFER_E_UNAVAILABLE;
837 }
838 }
839 }
840
841 /* Forward the request. */
842 for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
843 if (ops->to_xfer_partial != NULL)
844 return ops->to_xfer_partial (ops, object, annex, readbuf, writebuf,
845 offset, len);
846
847 return TARGET_XFER_E_UNAVAILABLE;
848 }
849
850 /* The to_insert_breakpoint method of target record-btrace. */
851
852 static int
853 record_btrace_insert_breakpoint (struct target_ops *ops,
854 struct gdbarch *gdbarch,
855 struct bp_target_info *bp_tgt)
856 {
857 volatile struct gdb_exception except;
858 int old, ret;
859
860 /* Inserting breakpoints requires accessing memory. Allow it for the
861 duration of this function. */
862 old = record_btrace_allow_memory_access;
863 record_btrace_allow_memory_access = 1;
864
865 ret = 0;
866 TRY_CATCH (except, RETURN_MASK_ALL)
867 ret = forward_target_insert_breakpoint (ops->beneath, gdbarch, bp_tgt);
868
869 record_btrace_allow_memory_access = old;
870
871 if (except.reason < 0)
872 throw_exception (except);
873
874 return ret;
875 }
876
877 /* The to_remove_breakpoint method of target record-btrace. */
878
879 static int
880 record_btrace_remove_breakpoint (struct target_ops *ops,
881 struct gdbarch *gdbarch,
882 struct bp_target_info *bp_tgt)
883 {
884 volatile struct gdb_exception except;
885 int old, ret;
886
887 /* Removing breakpoints requires accessing memory. Allow it for the
888 duration of this function. */
889 old = record_btrace_allow_memory_access;
890 record_btrace_allow_memory_access = 1;
891
892 ret = 0;
893 TRY_CATCH (except, RETURN_MASK_ALL)
894 ret = forward_target_remove_breakpoint (ops->beneath, gdbarch, bp_tgt);
895
896 record_btrace_allow_memory_access = old;
897
898 if (except.reason < 0)
899 throw_exception (except);
900
901 return ret;
902 }
903
904 /* The to_fetch_registers method of target record-btrace. */
905
906 static void
907 record_btrace_fetch_registers (struct target_ops *ops,
908 struct regcache *regcache, int regno)
909 {
910 struct btrace_insn_iterator *replay;
911 struct thread_info *tp;
912
913 tp = find_thread_ptid (inferior_ptid);
914 gdb_assert (tp != NULL);
915
916 replay = tp->btrace.replay;
917 if (replay != NULL)
918 {
919 const struct btrace_insn *insn;
920 struct gdbarch *gdbarch;
921 int pcreg;
922
923 gdbarch = get_regcache_arch (regcache);
924 pcreg = gdbarch_pc_regnum (gdbarch);
925 if (pcreg < 0)
926 return;
927
928 /* We can only provide the PC register. */
929 if (regno >= 0 && regno != pcreg)
930 return;
931
932 insn = btrace_insn_get (replay);
933 gdb_assert (insn != NULL);
934
935 regcache_raw_supply (regcache, regno, &insn->pc);
936 }
937 else
938 {
939 struct target_ops *t;
940
941 for (t = ops->beneath; t != NULL; t = t->beneath)
942 if (t->to_fetch_registers != NULL)
943 {
944 t->to_fetch_registers (t, regcache, regno);
945 break;
946 }
947 }
948 }
949
950 /* The to_store_registers method of target record-btrace. */
951
952 static void
953 record_btrace_store_registers (struct target_ops *ops,
954 struct regcache *regcache, int regno)
955 {
956 struct target_ops *t;
957
958 if (record_btrace_is_replaying ())
959 error (_("This record target does not allow writing registers."));
960
961 gdb_assert (may_write_registers != 0);
962
963 for (t = ops->beneath; t != NULL; t = t->beneath)
964 if (t->to_store_registers != NULL)
965 {
966 t->to_store_registers (t, regcache, regno);
967 return;
968 }
969
970 noprocess ();
971 }
972
973 /* The to_prepare_to_store method of target record-btrace. */
974
975 static void
976 record_btrace_prepare_to_store (struct target_ops *ops,
977 struct regcache *regcache)
978 {
979 struct target_ops *t;
980
981 if (record_btrace_is_replaying ())
982 return;
983
984 for (t = ops->beneath; t != NULL; t = t->beneath)
985 if (t->to_prepare_to_store != NULL)
986 {
987 t->to_prepare_to_store (t, regcache);
988 return;
989 }
990 }
991
992 /* The branch trace frame cache. */
993
994 struct btrace_frame_cache
995 {
996 /* The thread. */
997 struct thread_info *tp;
998
999 /* The frame info. */
1000 struct frame_info *frame;
1001
1002 /* The branch trace function segment. */
1003 const struct btrace_function *bfun;
1004 };
1005
1006 /* A struct btrace_frame_cache hash table indexed by NEXT. */
1007
1008 static htab_t bfcache;
1009
1010 /* hash_f for htab_create_alloc of bfcache. */
1011
1012 static hashval_t
1013 bfcache_hash (const void *arg)
1014 {
1015 const struct btrace_frame_cache *cache = arg;
1016
1017 return htab_hash_pointer (cache->frame);
1018 }
1019
1020 /* eq_f for htab_create_alloc of bfcache. */
1021
1022 static int
1023 bfcache_eq (const void *arg1, const void *arg2)
1024 {
1025 const struct btrace_frame_cache *cache1 = arg1;
1026 const struct btrace_frame_cache *cache2 = arg2;
1027
1028 return cache1->frame == cache2->frame;
1029 }
1030
1031 /* Create a new btrace frame cache. */
1032
1033 static struct btrace_frame_cache *
1034 bfcache_new (struct frame_info *frame)
1035 {
1036 struct btrace_frame_cache *cache;
1037 void **slot;
1038
1039 cache = FRAME_OBSTACK_ZALLOC (struct btrace_frame_cache);
1040 cache->frame = frame;
1041
1042 slot = htab_find_slot (bfcache, cache, INSERT);
1043 gdb_assert (*slot == NULL);
1044 *slot = cache;
1045
1046 return cache;
1047 }
1048
1049 /* Extract the branch trace function from a branch trace frame. */
1050
1051 static const struct btrace_function *
1052 btrace_get_frame_function (struct frame_info *frame)
1053 {
1054 const struct btrace_frame_cache *cache;
1055 const struct btrace_function *bfun;
1056 struct btrace_frame_cache pattern;
1057 void **slot;
1058
1059 pattern.frame = frame;
1060
1061 slot = htab_find_slot (bfcache, &pattern, NO_INSERT);
1062 if (slot == NULL)
1063 return NULL;
1064
1065 cache = *slot;
1066 return cache->bfun;
1067 }
1068
1069 /* Implement stop_reason method for record_btrace_frame_unwind. */
1070
1071 static enum unwind_stop_reason
1072 record_btrace_frame_unwind_stop_reason (struct frame_info *this_frame,
1073 void **this_cache)
1074 {
1075 const struct btrace_frame_cache *cache;
1076 const struct btrace_function *bfun;
1077
1078 cache = *this_cache;
1079 bfun = cache->bfun;
1080 gdb_assert (bfun != NULL);
1081
1082 if (bfun->up == NULL)
1083 return UNWIND_UNAVAILABLE;
1084
1085 return UNWIND_NO_REASON;
1086 }
1087
1088 /* Implement this_id method for record_btrace_frame_unwind. */
1089
1090 static void
1091 record_btrace_frame_this_id (struct frame_info *this_frame, void **this_cache,
1092 struct frame_id *this_id)
1093 {
1094 const struct btrace_frame_cache *cache;
1095 const struct btrace_function *bfun;
1096 CORE_ADDR code, special;
1097
1098 cache = *this_cache;
1099
1100 bfun = cache->bfun;
1101 gdb_assert (bfun != NULL);
1102
1103 while (bfun->segment.prev != NULL)
1104 bfun = bfun->segment.prev;
1105
1106 code = get_frame_func (this_frame);
1107 special = bfun->number;
1108
1109 *this_id = frame_id_build_unavailable_stack_special (code, special);
1110
1111 DEBUG ("[frame] %s id: (!stack, pc=%s, special=%s)",
1112 btrace_get_bfun_name (cache->bfun),
1113 core_addr_to_string_nz (this_id->code_addr),
1114 core_addr_to_string_nz (this_id->special_addr));
1115 }
1116
1117 /* Implement prev_register method for record_btrace_frame_unwind. */
1118
1119 static struct value *
1120 record_btrace_frame_prev_register (struct frame_info *this_frame,
1121 void **this_cache,
1122 int regnum)
1123 {
1124 const struct btrace_frame_cache *cache;
1125 const struct btrace_function *bfun, *caller;
1126 const struct btrace_insn *insn;
1127 struct gdbarch *gdbarch;
1128 CORE_ADDR pc;
1129 int pcreg;
1130
1131 gdbarch = get_frame_arch (this_frame);
1132 pcreg = gdbarch_pc_regnum (gdbarch);
1133 if (pcreg < 0 || regnum != pcreg)
1134 throw_error (NOT_AVAILABLE_ERROR,
1135 _("Registers are not available in btrace record history"));
1136
1137 cache = *this_cache;
1138 bfun = cache->bfun;
1139 gdb_assert (bfun != NULL);
1140
1141 caller = bfun->up;
1142 if (caller == NULL)
1143 throw_error (NOT_AVAILABLE_ERROR,
1144 _("No caller in btrace record history"));
1145
1146 if ((bfun->flags & BFUN_UP_LINKS_TO_RET) != 0)
1147 {
1148 insn = VEC_index (btrace_insn_s, caller->insn, 0);
1149 pc = insn->pc;
1150 }
1151 else
1152 {
1153 insn = VEC_last (btrace_insn_s, caller->insn);
1154 pc = insn->pc;
1155
1156 pc += gdb_insn_length (gdbarch, pc);
1157 }
1158
1159 DEBUG ("[frame] unwound PC in %s on level %d: %s",
1160 btrace_get_bfun_name (bfun), bfun->level,
1161 core_addr_to_string_nz (pc));
1162
1163 return frame_unwind_got_address (this_frame, regnum, pc);
1164 }
1165
1166 /* Implement sniffer method for record_btrace_frame_unwind. */
1167
1168 static int
1169 record_btrace_frame_sniffer (const struct frame_unwind *self,
1170 struct frame_info *this_frame,
1171 void **this_cache)
1172 {
1173 const struct btrace_function *bfun;
1174 struct btrace_frame_cache *cache;
1175 struct thread_info *tp;
1176 struct frame_info *next;
1177
1178 /* THIS_FRAME does not contain a reference to its thread. */
1179 tp = find_thread_ptid (inferior_ptid);
1180 gdb_assert (tp != NULL);
1181
1182 bfun = NULL;
1183 next = get_next_frame (this_frame);
1184 if (next == NULL)
1185 {
1186 const struct btrace_insn_iterator *replay;
1187
1188 replay = tp->btrace.replay;
1189 if (replay != NULL)
1190 bfun = replay->function;
1191 }
1192 else
1193 {
1194 const struct btrace_function *callee;
1195
1196 callee = btrace_get_frame_function (next);
1197 if (callee != NULL && (callee->flags & BFUN_UP_LINKS_TO_TAILCALL) == 0)
1198 bfun = callee->up;
1199 }
1200
1201 if (bfun == NULL)
1202 return 0;
1203
1204 DEBUG ("[frame] sniffed frame for %s on level %d",
1205 btrace_get_bfun_name (bfun), bfun->level);
1206
1207 /* This is our frame. Initialize the frame cache. */
1208 cache = bfcache_new (this_frame);
1209 cache->tp = tp;
1210 cache->bfun = bfun;
1211
1212 *this_cache = cache;
1213 return 1;
1214 }
1215
1216 /* Implement sniffer method for record_btrace_tailcall_frame_unwind. */
1217
1218 static int
1219 record_btrace_tailcall_frame_sniffer (const struct frame_unwind *self,
1220 struct frame_info *this_frame,
1221 void **this_cache)
1222 {
1223 const struct btrace_function *bfun, *callee;
1224 struct btrace_frame_cache *cache;
1225 struct frame_info *next;
1226
1227 next = get_next_frame (this_frame);
1228 if (next == NULL)
1229 return 0;
1230
1231 callee = btrace_get_frame_function (next);
1232 if (callee == NULL)
1233 return 0;
1234
1235 if ((callee->flags & BFUN_UP_LINKS_TO_TAILCALL) == 0)
1236 return 0;
1237
1238 bfun = callee->up;
1239 if (bfun == NULL)
1240 return 0;
1241
1242 DEBUG ("[frame] sniffed tailcall frame for %s on level %d",
1243 btrace_get_bfun_name (bfun), bfun->level);
1244
1245 /* This is our frame. Initialize the frame cache. */
1246 cache = bfcache_new (this_frame);
1247 cache->tp = find_thread_ptid (inferior_ptid);
1248 cache->bfun = bfun;
1249
1250 *this_cache = cache;
1251 return 1;
1252 }
1253
1254 static void
1255 record_btrace_frame_dealloc_cache (struct frame_info *self, void *this_cache)
1256 {
1257 struct btrace_frame_cache *cache;
1258 void **slot;
1259
1260 cache = this_cache;
1261
1262 slot = htab_find_slot (bfcache, cache, NO_INSERT);
1263 gdb_assert (slot != NULL);
1264
1265 htab_remove_elt (bfcache, cache);
1266 }
1267
1268 /* btrace recording does not store previous memory content, neither the stack
1269 frames content. Any unwinding would return errorneous results as the stack
1270 contents no longer matches the changed PC value restored from history.
1271 Therefore this unwinder reports any possibly unwound registers as
1272 <unavailable>. */
1273
1274 const struct frame_unwind record_btrace_frame_unwind =
1275 {
1276 NORMAL_FRAME,
1277 record_btrace_frame_unwind_stop_reason,
1278 record_btrace_frame_this_id,
1279 record_btrace_frame_prev_register,
1280 NULL,
1281 record_btrace_frame_sniffer,
1282 record_btrace_frame_dealloc_cache
1283 };
1284
1285 const struct frame_unwind record_btrace_tailcall_frame_unwind =
1286 {
1287 TAILCALL_FRAME,
1288 record_btrace_frame_unwind_stop_reason,
1289 record_btrace_frame_this_id,
1290 record_btrace_frame_prev_register,
1291 NULL,
1292 record_btrace_tailcall_frame_sniffer,
1293 record_btrace_frame_dealloc_cache
1294 };
1295
1296 /* Indicate that TP should be resumed according to FLAG. */
1297
1298 static void
1299 record_btrace_resume_thread (struct thread_info *tp,
1300 enum btrace_thread_flag flag)
1301 {
1302 struct btrace_thread_info *btinfo;
1303
1304 DEBUG ("resuming %d (%s): %u", tp->num, target_pid_to_str (tp->ptid), flag);
1305
1306 btinfo = &tp->btrace;
1307
1308 if ((btinfo->flags & BTHR_MOVE) != 0)
1309 error (_("Thread already moving."));
1310
1311 /* Fetch the latest branch trace. */
1312 btrace_fetch (tp);
1313
1314 btinfo->flags |= flag;
1315 }
1316
1317 /* Find the thread to resume given a PTID. */
1318
1319 static struct thread_info *
1320 record_btrace_find_resume_thread (ptid_t ptid)
1321 {
1322 struct thread_info *tp;
1323
1324 /* When asked to resume everything, we pick the current thread. */
1325 if (ptid_equal (minus_one_ptid, ptid) || ptid_is_pid (ptid))
1326 ptid = inferior_ptid;
1327
1328 return find_thread_ptid (ptid);
1329 }
1330
1331 /* Start replaying a thread. */
1332
1333 static struct btrace_insn_iterator *
1334 record_btrace_start_replaying (struct thread_info *tp)
1335 {
1336 volatile struct gdb_exception except;
1337 struct btrace_insn_iterator *replay;
1338 struct btrace_thread_info *btinfo;
1339 int executing;
1340
1341 btinfo = &tp->btrace;
1342 replay = NULL;
1343
1344 /* We can't start replaying without trace. */
1345 if (btinfo->begin == NULL)
1346 return NULL;
1347
1348 /* Clear the executing flag to allow changes to the current frame.
1349 We are not actually running, yet. We just started a reverse execution
1350 command or a record goto command.
1351 For the latter, EXECUTING is false and this has no effect.
1352 For the former, EXECUTING is true and we're in to_wait, about to
1353 move the thread. Since we need to recompute the stack, we temporarily
1354 set EXECUTING to flase. */
1355 executing = is_executing (tp->ptid);
1356 set_executing (tp->ptid, 0);
1357
1358 /* GDB stores the current frame_id when stepping in order to detects steps
1359 into subroutines.
1360 Since frames are computed differently when we're replaying, we need to
1361 recompute those stored frames and fix them up so we can still detect
1362 subroutines after we started replaying. */
1363 TRY_CATCH (except, RETURN_MASK_ALL)
1364 {
1365 struct frame_info *frame;
1366 struct frame_id frame_id;
1367 int upd_step_frame_id, upd_step_stack_frame_id;
1368
1369 /* The current frame without replaying - computed via normal unwind. */
1370 frame = get_current_frame ();
1371 frame_id = get_frame_id (frame);
1372
1373 /* Check if we need to update any stepping-related frame id's. */
1374 upd_step_frame_id = frame_id_eq (frame_id,
1375 tp->control.step_frame_id);
1376 upd_step_stack_frame_id = frame_id_eq (frame_id,
1377 tp->control.step_stack_frame_id);
1378
1379 /* We start replaying at the end of the branch trace. This corresponds
1380 to the current instruction. */
1381 replay = xmalloc (sizeof (*replay));
1382 btrace_insn_end (replay, btinfo);
1383
1384 /* We're not replaying, yet. */
1385 gdb_assert (btinfo->replay == NULL);
1386 btinfo->replay = replay;
1387
1388 /* Make sure we're not using any stale registers. */
1389 registers_changed_ptid (tp->ptid);
1390
1391 /* The current frame with replaying - computed via btrace unwind. */
1392 frame = get_current_frame ();
1393 frame_id = get_frame_id (frame);
1394
1395 /* Replace stepping related frames where necessary. */
1396 if (upd_step_frame_id)
1397 tp->control.step_frame_id = frame_id;
1398 if (upd_step_stack_frame_id)
1399 tp->control.step_stack_frame_id = frame_id;
1400 }
1401
1402 /* Restore the previous execution state. */
1403 set_executing (tp->ptid, executing);
1404
1405 if (except.reason < 0)
1406 {
1407 xfree (btinfo->replay);
1408 btinfo->replay = NULL;
1409
1410 registers_changed_ptid (tp->ptid);
1411
1412 throw_exception (except);
1413 }
1414
1415 return replay;
1416 }
1417
1418 /* Stop replaying a thread. */
1419
1420 static void
1421 record_btrace_stop_replaying (struct thread_info *tp)
1422 {
1423 struct btrace_thread_info *btinfo;
1424
1425 btinfo = &tp->btrace;
1426
1427 xfree (btinfo->replay);
1428 btinfo->replay = NULL;
1429
1430 /* Make sure we're not leaving any stale registers. */
1431 registers_changed_ptid (tp->ptid);
1432 }
1433
1434 /* The to_resume method of target record-btrace. */
1435
1436 static void
1437 record_btrace_resume (struct target_ops *ops, ptid_t ptid, int step,
1438 enum gdb_signal signal)
1439 {
1440 struct thread_info *tp, *other;
1441 enum btrace_thread_flag flag;
1442
1443 DEBUG ("resume %s: %s", target_pid_to_str (ptid), step ? "step" : "cont");
1444
1445 tp = record_btrace_find_resume_thread (ptid);
1446 if (tp == NULL)
1447 error (_("Cannot find thread to resume."));
1448
1449 /* Stop replaying other threads if the thread to resume is not replaying. */
1450 if (!btrace_is_replaying (tp) && execution_direction != EXEC_REVERSE)
1451 ALL_THREADS (other)
1452 record_btrace_stop_replaying (other);
1453
1454 /* As long as we're not replaying, just forward the request. */
1455 if (!record_btrace_is_replaying () && execution_direction != EXEC_REVERSE)
1456 {
1457 for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
1458 if (ops->to_resume != NULL)
1459 return ops->to_resume (ops, ptid, step, signal);
1460
1461 error (_("Cannot find target for stepping."));
1462 }
1463
1464 /* Compute the btrace thread flag for the requested move. */
1465 if (step == 0)
1466 flag = execution_direction == EXEC_REVERSE ? BTHR_RCONT : BTHR_CONT;
1467 else
1468 flag = execution_direction == EXEC_REVERSE ? BTHR_RSTEP : BTHR_STEP;
1469
1470 /* At the moment, we only move a single thread. We could also move
1471 all threads in parallel by single-stepping each resumed thread
1472 until the first runs into an event.
1473 When we do that, we would want to continue all other threads.
1474 For now, just resume one thread to not confuse to_wait. */
1475 record_btrace_resume_thread (tp, flag);
1476
1477 /* We just indicate the resume intent here. The actual stepping happens in
1478 record_btrace_wait below. */
1479 }
1480
1481 /* Find a thread to move. */
1482
1483 static struct thread_info *
1484 record_btrace_find_thread_to_move (ptid_t ptid)
1485 {
1486 struct thread_info *tp;
1487
1488 /* First check the parameter thread. */
1489 tp = find_thread_ptid (ptid);
1490 if (tp != NULL && (tp->btrace.flags & BTHR_MOVE) != 0)
1491 return tp;
1492
1493 /* Otherwise, find one other thread that has been resumed. */
1494 ALL_THREADS (tp)
1495 if ((tp->btrace.flags & BTHR_MOVE) != 0)
1496 return tp;
1497
1498 return NULL;
1499 }
1500
1501 /* Return a target_waitstatus indicating that we ran out of history. */
1502
1503 static struct target_waitstatus
1504 btrace_step_no_history (void)
1505 {
1506 struct target_waitstatus status;
1507
1508 status.kind = TARGET_WAITKIND_NO_HISTORY;
1509
1510 return status;
1511 }
1512
1513 /* Return a target_waitstatus indicating that a step finished. */
1514
1515 static struct target_waitstatus
1516 btrace_step_stopped (void)
1517 {
1518 struct target_waitstatus status;
1519
1520 status.kind = TARGET_WAITKIND_STOPPED;
1521 status.value.sig = GDB_SIGNAL_TRAP;
1522
1523 return status;
1524 }
1525
1526 /* Clear the record histories. */
1527
1528 static void
1529 record_btrace_clear_histories (struct btrace_thread_info *btinfo)
1530 {
1531 xfree (btinfo->insn_history);
1532 xfree (btinfo->call_history);
1533
1534 btinfo->insn_history = NULL;
1535 btinfo->call_history = NULL;
1536 }
1537
1538 /* Step a single thread. */
1539
1540 static struct target_waitstatus
1541 record_btrace_step_thread (struct thread_info *tp)
1542 {
1543 struct btrace_insn_iterator *replay, end;
1544 struct btrace_thread_info *btinfo;
1545 struct address_space *aspace;
1546 struct inferior *inf;
1547 enum btrace_thread_flag flags;
1548 unsigned int steps;
1549
1550 btinfo = &tp->btrace;
1551 replay = btinfo->replay;
1552
1553 flags = btinfo->flags & BTHR_MOVE;
1554 btinfo->flags &= ~BTHR_MOVE;
1555
1556 DEBUG ("stepping %d (%s): %u", tp->num, target_pid_to_str (tp->ptid), flags);
1557
1558 switch (flags)
1559 {
1560 default:
1561 internal_error (__FILE__, __LINE__, _("invalid stepping type."));
1562
1563 case BTHR_STEP:
1564 /* We're done if we're not replaying. */
1565 if (replay == NULL)
1566 return btrace_step_no_history ();
1567
1568 /* We are always able to step at least once. */
1569 steps = btrace_insn_next (replay, 1);
1570 gdb_assert (steps == 1);
1571
1572 /* Determine the end of the instruction trace. */
1573 btrace_insn_end (&end, btinfo);
1574
1575 /* We stop replaying if we reached the end of the trace. */
1576 if (btrace_insn_cmp (replay, &end) == 0)
1577 record_btrace_stop_replaying (tp);
1578
1579 return btrace_step_stopped ();
1580
1581 case BTHR_RSTEP:
1582 /* Start replaying if we're not already doing so. */
1583 if (replay == NULL)
1584 replay = record_btrace_start_replaying (tp);
1585
1586 /* If we can't step any further, we reached the end of the history. */
1587 steps = btrace_insn_prev (replay, 1);
1588 if (steps == 0)
1589 return btrace_step_no_history ();
1590
1591 return btrace_step_stopped ();
1592
1593 case BTHR_CONT:
1594 /* We're done if we're not replaying. */
1595 if (replay == NULL)
1596 return btrace_step_no_history ();
1597
1598 inf = find_inferior_pid (ptid_get_pid (tp->ptid));
1599 aspace = inf->aspace;
1600
1601 /* Determine the end of the instruction trace. */
1602 btrace_insn_end (&end, btinfo);
1603
1604 for (;;)
1605 {
1606 const struct btrace_insn *insn;
1607
1608 /* We are always able to step at least once. */
1609 steps = btrace_insn_next (replay, 1);
1610 gdb_assert (steps == 1);
1611
1612 /* We stop replaying if we reached the end of the trace. */
1613 if (btrace_insn_cmp (replay, &end) == 0)
1614 {
1615 record_btrace_stop_replaying (tp);
1616 return btrace_step_no_history ();
1617 }
1618
1619 insn = btrace_insn_get (replay);
1620 gdb_assert (insn);
1621
1622 DEBUG ("stepping %d (%s) ... %s", tp->num,
1623 target_pid_to_str (tp->ptid),
1624 core_addr_to_string_nz (insn->pc));
1625
1626 if (breakpoint_here_p (aspace, insn->pc))
1627 return btrace_step_stopped ();
1628 }
1629
1630 case BTHR_RCONT:
1631 /* Start replaying if we're not already doing so. */
1632 if (replay == NULL)
1633 replay = record_btrace_start_replaying (tp);
1634
1635 inf = find_inferior_pid (ptid_get_pid (tp->ptid));
1636 aspace = inf->aspace;
1637
1638 for (;;)
1639 {
1640 const struct btrace_insn *insn;
1641
1642 /* If we can't step any further, we're done. */
1643 steps = btrace_insn_prev (replay, 1);
1644 if (steps == 0)
1645 return btrace_step_no_history ();
1646
1647 insn = btrace_insn_get (replay);
1648 gdb_assert (insn);
1649
1650 DEBUG ("reverse-stepping %d (%s) ... %s", tp->num,
1651 target_pid_to_str (tp->ptid),
1652 core_addr_to_string_nz (insn->pc));
1653
1654 if (breakpoint_here_p (aspace, insn->pc))
1655 return btrace_step_stopped ();
1656 }
1657 }
1658 }
1659
1660 /* The to_wait method of target record-btrace. */
1661
1662 static ptid_t
1663 record_btrace_wait (struct target_ops *ops, ptid_t ptid,
1664 struct target_waitstatus *status, int options)
1665 {
1666 struct thread_info *tp, *other;
1667
1668 DEBUG ("wait %s (0x%x)", target_pid_to_str (ptid), options);
1669
1670 /* As long as we're not replaying, just forward the request. */
1671 if (!record_btrace_is_replaying () && execution_direction != EXEC_REVERSE)
1672 {
1673 for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
1674 if (ops->to_wait != NULL)
1675 return ops->to_wait (ops, ptid, status, options);
1676
1677 error (_("Cannot find target for waiting."));
1678 }
1679
1680 /* Let's find a thread to move. */
1681 tp = record_btrace_find_thread_to_move (ptid);
1682 if (tp == NULL)
1683 {
1684 DEBUG ("wait %s: no thread", target_pid_to_str (ptid));
1685
1686 status->kind = TARGET_WAITKIND_IGNORE;
1687 return minus_one_ptid;
1688 }
1689
1690 /* We only move a single thread. We're not able to correlate threads. */
1691 *status = record_btrace_step_thread (tp);
1692
1693 /* Stop all other threads. */
1694 if (!non_stop)
1695 ALL_THREADS (other)
1696 other->btrace.flags &= ~BTHR_MOVE;
1697
1698 /* Start record histories anew from the current position. */
1699 record_btrace_clear_histories (&tp->btrace);
1700
1701 /* We moved the replay position but did not update registers. */
1702 registers_changed_ptid (tp->ptid);
1703
1704 return tp->ptid;
1705 }
1706
1707 /* The to_can_execute_reverse method of target record-btrace. */
1708
1709 static int
1710 record_btrace_can_execute_reverse (void)
1711 {
1712 return 1;
1713 }
1714
1715 /* The to_decr_pc_after_break method of target record-btrace. */
1716
1717 static CORE_ADDR
1718 record_btrace_decr_pc_after_break (struct target_ops *ops,
1719 struct gdbarch *gdbarch)
1720 {
1721 /* When replaying, we do not actually execute the breakpoint instruction
1722 so there is no need to adjust the PC after hitting a breakpoint. */
1723 if (record_btrace_is_replaying ())
1724 return 0;
1725
1726 return forward_target_decr_pc_after_break (ops->beneath, gdbarch);
1727 }
1728
1729 /* The to_find_new_threads method of target record-btrace. */
1730
1731 static void
1732 record_btrace_find_new_threads (struct target_ops *ops)
1733 {
1734 /* Don't expect new threads if we're replaying. */
1735 if (record_btrace_is_replaying ())
1736 return;
1737
1738 /* Forward the request. */
1739 for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
1740 if (ops->to_find_new_threads != NULL)
1741 {
1742 ops->to_find_new_threads (ops);
1743 break;
1744 }
1745 }
1746
1747 /* The to_thread_alive method of target record-btrace. */
1748
1749 static int
1750 record_btrace_thread_alive (struct target_ops *ops, ptid_t ptid)
1751 {
1752 /* We don't add or remove threads during replay. */
1753 if (record_btrace_is_replaying ())
1754 return find_thread_ptid (ptid) != NULL;
1755
1756 /* Forward the request. */
1757 for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
1758 if (ops->to_thread_alive != NULL)
1759 return ops->to_thread_alive (ops, ptid);
1760
1761 return 0;
1762 }
1763
1764 /* Set the replay branch trace instruction iterator. If IT is NULL, replay
1765 is stopped. */
1766
1767 static void
1768 record_btrace_set_replay (struct thread_info *tp,
1769 const struct btrace_insn_iterator *it)
1770 {
1771 struct btrace_thread_info *btinfo;
1772
1773 btinfo = &tp->btrace;
1774
1775 if (it == NULL || it->function == NULL)
1776 record_btrace_stop_replaying (tp);
1777 else
1778 {
1779 if (btinfo->replay == NULL)
1780 record_btrace_start_replaying (tp);
1781 else if (btrace_insn_cmp (btinfo->replay, it) == 0)
1782 return;
1783
1784 *btinfo->replay = *it;
1785 registers_changed_ptid (tp->ptid);
1786 }
1787
1788 /* Start anew from the new replay position. */
1789 record_btrace_clear_histories (btinfo);
1790 }
1791
1792 /* The to_goto_record_begin method of target record-btrace. */
1793
1794 static void
1795 record_btrace_goto_begin (void)
1796 {
1797 struct thread_info *tp;
1798 struct btrace_insn_iterator begin;
1799
1800 tp = require_btrace_thread ();
1801
1802 btrace_insn_begin (&begin, &tp->btrace);
1803 record_btrace_set_replay (tp, &begin);
1804
1805 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
1806 }
1807
1808 /* The to_goto_record_end method of target record-btrace. */
1809
1810 static void
1811 record_btrace_goto_end (void)
1812 {
1813 struct thread_info *tp;
1814
1815 tp = require_btrace_thread ();
1816
1817 record_btrace_set_replay (tp, NULL);
1818
1819 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
1820 }
1821
1822 /* The to_goto_record method of target record-btrace. */
1823
1824 static void
1825 record_btrace_goto (ULONGEST insn)
1826 {
1827 struct thread_info *tp;
1828 struct btrace_insn_iterator it;
1829 unsigned int number;
1830 int found;
1831
1832 number = insn;
1833
1834 /* Check for wrap-arounds. */
1835 if (number != insn)
1836 error (_("Instruction number out of range."));
1837
1838 tp = require_btrace_thread ();
1839
1840 found = btrace_find_insn_by_number (&it, &tp->btrace, number);
1841 if (found == 0)
1842 error (_("No such instruction."));
1843
1844 record_btrace_set_replay (tp, &it);
1845
1846 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
1847 }
1848
1849 /* Initialize the record-btrace target ops. */
1850
1851 static void
1852 init_record_btrace_ops (void)
1853 {
1854 struct target_ops *ops;
1855
1856 ops = &record_btrace_ops;
1857 ops->to_shortname = "record-btrace";
1858 ops->to_longname = "Branch tracing target";
1859 ops->to_doc = "Collect control-flow trace and provide the execution history.";
1860 ops->to_open = record_btrace_open;
1861 ops->to_close = record_btrace_close;
1862 ops->to_detach = record_detach;
1863 ops->to_disconnect = record_disconnect;
1864 ops->to_mourn_inferior = record_mourn_inferior;
1865 ops->to_kill = record_kill;
1866 ops->to_create_inferior = find_default_create_inferior;
1867 ops->to_stop_recording = record_btrace_stop_recording;
1868 ops->to_info_record = record_btrace_info;
1869 ops->to_insn_history = record_btrace_insn_history;
1870 ops->to_insn_history_from = record_btrace_insn_history_from;
1871 ops->to_insn_history_range = record_btrace_insn_history_range;
1872 ops->to_call_history = record_btrace_call_history;
1873 ops->to_call_history_from = record_btrace_call_history_from;
1874 ops->to_call_history_range = record_btrace_call_history_range;
1875 ops->to_record_is_replaying = record_btrace_is_replaying;
1876 ops->to_xfer_partial = record_btrace_xfer_partial;
1877 ops->to_remove_breakpoint = record_btrace_remove_breakpoint;
1878 ops->to_insert_breakpoint = record_btrace_insert_breakpoint;
1879 ops->to_fetch_registers = record_btrace_fetch_registers;
1880 ops->to_store_registers = record_btrace_store_registers;
1881 ops->to_prepare_to_store = record_btrace_prepare_to_store;
1882 ops->to_get_unwinder = &record_btrace_frame_unwind;
1883 ops->to_get_tailcall_unwinder = &record_btrace_tailcall_frame_unwind;
1884 ops->to_resume = record_btrace_resume;
1885 ops->to_wait = record_btrace_wait;
1886 ops->to_find_new_threads = record_btrace_find_new_threads;
1887 ops->to_thread_alive = record_btrace_thread_alive;
1888 ops->to_goto_record_begin = record_btrace_goto_begin;
1889 ops->to_goto_record_end = record_btrace_goto_end;
1890 ops->to_goto_record = record_btrace_goto;
1891 ops->to_can_execute_reverse = record_btrace_can_execute_reverse;
1892 ops->to_decr_pc_after_break = record_btrace_decr_pc_after_break;
1893 ops->to_stratum = record_stratum;
1894 ops->to_magic = OPS_MAGIC;
1895 }
1896
1897 /* Alias for "target record". */
1898
1899 static void
1900 cmd_record_btrace_start (char *args, int from_tty)
1901 {
1902 if (args != NULL && *args != 0)
1903 error (_("Invalid argument."));
1904
1905 execute_command ("target record-btrace", from_tty);
1906 }
1907
1908 void _initialize_record_btrace (void);
1909
1910 /* Initialize btrace commands. */
1911
1912 void
1913 _initialize_record_btrace (void)
1914 {
1915 add_cmd ("btrace", class_obscure, cmd_record_btrace_start,
1916 _("Start branch trace recording."),
1917 &record_cmdlist);
1918 add_alias_cmd ("b", "btrace", class_obscure, 1, &record_cmdlist);
1919
1920 init_record_btrace_ops ();
1921 add_target (&record_btrace_ops);
1922
1923 bfcache = htab_create_alloc (50, bfcache_hash, bfcache_eq, NULL,
1924 xcalloc, xfree);
1925 }