1 /* Branch trace support for GDB, the GNU debugger.
3 Copyright (C) 2013-2019 Free Software Foundation, Inc.
5 Contributed by Intel Corp. <markus.t.metzger@intel.com>
7 This file is part of GDB.
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.
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.
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/>. */
24 #include "record-btrace.h"
25 #include "gdbthread.h"
29 #include "observable.h"
30 #include "cli/cli-utils.h"
34 #include "filenames.h"
36 #include "frame-unwind.h"
39 #include "event-loop.h"
41 #include "common/vec.h"
45 static const target_info record_btrace_target_info = {
47 N_("Branch tracing target"),
48 N_("Collect control-flow trace and provide the execution history.")
51 /* The target_ops of record-btrace. */
53 class record_btrace_target final : public target_ops
56 const target_info &info () const override
57 { return record_btrace_target_info; }
59 strata stratum () const override { return record_stratum; }
61 void close () override;
62 void async (int) override;
64 void detach (inferior *inf, int from_tty) override
65 { record_detach (this, inf, from_tty); }
67 void disconnect (const char *, int) override;
69 void mourn_inferior () override
70 { record_mourn_inferior (this); }
73 { record_kill (this); }
75 enum record_method record_method (ptid_t ptid) override;
77 void stop_recording () override;
78 void info_record () override;
80 void insn_history (int size, gdb_disassembly_flags flags) override;
81 void insn_history_from (ULONGEST from, int size,
82 gdb_disassembly_flags flags) override;
83 void insn_history_range (ULONGEST begin, ULONGEST end,
84 gdb_disassembly_flags flags) override;
85 void call_history (int size, record_print_flags flags) override;
86 void call_history_from (ULONGEST begin, int size, record_print_flags flags)
88 void call_history_range (ULONGEST begin, ULONGEST end, record_print_flags flags)
91 bool record_is_replaying (ptid_t ptid) override;
92 bool record_will_replay (ptid_t ptid, int dir) override;
93 void record_stop_replaying () override;
95 enum target_xfer_status xfer_partial (enum target_object object,
98 const gdb_byte *writebuf,
99 ULONGEST offset, ULONGEST len,
100 ULONGEST *xfered_len) override;
102 int insert_breakpoint (struct gdbarch *,
103 struct bp_target_info *) override;
104 int remove_breakpoint (struct gdbarch *, struct bp_target_info *,
105 enum remove_bp_reason) override;
107 void fetch_registers (struct regcache *, int) override;
109 void store_registers (struct regcache *, int) override;
110 void prepare_to_store (struct regcache *) override;
112 const struct frame_unwind *get_unwinder () override;
114 const struct frame_unwind *get_tailcall_unwinder () override;
116 void commit_resume () override;
117 void resume (ptid_t, int, enum gdb_signal) override;
118 ptid_t wait (ptid_t, struct target_waitstatus *, int) override;
120 void stop (ptid_t) override;
121 void update_thread_list () override;
122 bool thread_alive (ptid_t ptid) override;
123 void goto_record_begin () override;
124 void goto_record_end () override;
125 void goto_record (ULONGEST insn) override;
127 bool can_execute_reverse () override;
129 bool stopped_by_sw_breakpoint () override;
130 bool supports_stopped_by_sw_breakpoint () override;
132 bool stopped_by_hw_breakpoint () override;
133 bool supports_stopped_by_hw_breakpoint () override;
135 enum exec_direction_kind execution_direction () override;
136 void prepare_to_generate_core () override;
137 void done_generating_core () override;
140 static record_btrace_target record_btrace_ops;
142 /* Initialize the record-btrace target ops. */
144 /* Token associated with a new-thread observer enabling branch tracing
145 for the new thread. */
146 static const gdb::observers::token record_btrace_thread_observer_token {};
148 /* Memory access types used in set/show record btrace replay-memory-access. */
149 static const char replay_memory_access_read_only[] = "read-only";
150 static const char replay_memory_access_read_write[] = "read-write";
151 static const char *const replay_memory_access_types[] =
153 replay_memory_access_read_only,
154 replay_memory_access_read_write,
158 /* The currently allowed replay memory access type. */
159 static const char *replay_memory_access = replay_memory_access_read_only;
161 /* The cpu state kinds. */
162 enum record_btrace_cpu_state_kind
169 /* The current cpu state. */
170 static enum record_btrace_cpu_state_kind record_btrace_cpu_state = CS_AUTO;
172 /* The current cpu for trace decode. */
173 static struct btrace_cpu record_btrace_cpu;
175 /* Command lists for "set/show record btrace". */
176 static struct cmd_list_element *set_record_btrace_cmdlist;
177 static struct cmd_list_element *show_record_btrace_cmdlist;
179 /* The execution direction of the last resume we got. See record-full.c. */
180 static enum exec_direction_kind record_btrace_resume_exec_dir = EXEC_FORWARD;
182 /* The async event handler for reverse/replay execution. */
183 static struct async_event_handler *record_btrace_async_inferior_event_handler;
185 /* A flag indicating that we are currently generating a core file. */
186 static int record_btrace_generating_corefile;
188 /* The current branch trace configuration. */
189 static struct btrace_config record_btrace_conf;
191 /* Command list for "record btrace". */
192 static struct cmd_list_element *record_btrace_cmdlist;
194 /* Command lists for "set/show record btrace bts". */
195 static struct cmd_list_element *set_record_btrace_bts_cmdlist;
196 static struct cmd_list_element *show_record_btrace_bts_cmdlist;
198 /* Command lists for "set/show record btrace pt". */
199 static struct cmd_list_element *set_record_btrace_pt_cmdlist;
200 static struct cmd_list_element *show_record_btrace_pt_cmdlist;
202 /* Command list for "set record btrace cpu". */
203 static struct cmd_list_element *set_record_btrace_cpu_cmdlist;
205 /* Print a record-btrace debug message. Use do ... while (0) to avoid
206 ambiguities when used in if statements. */
208 #define DEBUG(msg, args...) \
211 if (record_debug != 0) \
212 fprintf_unfiltered (gdb_stdlog, \
213 "[record-btrace] " msg "\n", ##args); \
218 /* Return the cpu configured by the user. Returns NULL if the cpu was
219 configured as auto. */
220 const struct btrace_cpu *
221 record_btrace_get_cpu (void)
223 switch (record_btrace_cpu_state)
229 record_btrace_cpu.vendor = CV_UNKNOWN;
232 return &record_btrace_cpu;
235 error (_("Internal error: bad record btrace cpu state."));
238 /* Update the branch trace for the current thread and return a pointer to its
241 Throws an error if there is no thread or no trace. This function never
244 static struct thread_info *
245 require_btrace_thread (void)
249 if (inferior_ptid == null_ptid)
250 error (_("No thread."));
252 thread_info *tp = inferior_thread ();
254 validate_registers_access ();
256 btrace_fetch (tp, record_btrace_get_cpu ());
258 if (btrace_is_empty (tp))
259 error (_("No trace."));
264 /* Update the branch trace for the current thread and return a pointer to its
265 branch trace information struct.
267 Throws an error if there is no thread or no trace. This function never
270 static struct btrace_thread_info *
271 require_btrace (void)
273 struct thread_info *tp;
275 tp = require_btrace_thread ();
280 /* Enable branch tracing for one thread. Warn on errors. */
283 record_btrace_enable_warn (struct thread_info *tp)
287 btrace_enable (tp, &record_btrace_conf);
289 catch (const gdb_exception_error &error)
291 warning ("%s", error.what ());
295 /* Enable automatic tracing of new threads. */
298 record_btrace_auto_enable (void)
300 DEBUG ("attach thread observer");
302 gdb::observers::new_thread.attach (record_btrace_enable_warn,
303 record_btrace_thread_observer_token);
306 /* Disable automatic tracing of new threads. */
309 record_btrace_auto_disable (void)
311 DEBUG ("detach thread observer");
313 gdb::observers::new_thread.detach (record_btrace_thread_observer_token);
316 /* The record-btrace async event handler function. */
319 record_btrace_handle_async_inferior_event (gdb_client_data data)
321 inferior_event_handler (INF_REG_EVENT, NULL);
324 /* See record-btrace.h. */
327 record_btrace_push_target (void)
331 record_btrace_auto_enable ();
333 push_target (&record_btrace_ops);
335 record_btrace_async_inferior_event_handler
336 = create_async_event_handler (record_btrace_handle_async_inferior_event,
338 record_btrace_generating_corefile = 0;
340 format = btrace_format_short_string (record_btrace_conf.format);
341 gdb::observers::record_changed.notify (current_inferior (), 1, "btrace", format);
344 /* Disable btrace on a set of threads on scope exit. */
346 struct scoped_btrace_disable
348 scoped_btrace_disable () = default;
350 DISABLE_COPY_AND_ASSIGN (scoped_btrace_disable);
352 ~scoped_btrace_disable ()
354 for (thread_info *tp : m_threads)
358 void add_thread (thread_info *thread)
360 m_threads.push_front (thread);
369 std::forward_list<thread_info *> m_threads;
372 /* Open target record-btrace. */
375 record_btrace_target_open (const char *args, int from_tty)
377 /* If we fail to enable btrace for one thread, disable it for the threads for
378 which it was successfully enabled. */
379 scoped_btrace_disable btrace_disable;
385 if (!target_has_execution)
386 error (_("The program is not being run."));
388 for (thread_info *tp : all_non_exited_threads ())
389 if (args == NULL || *args == 0 || number_is_in_list (args, tp->global_num))
391 btrace_enable (tp, &record_btrace_conf);
393 btrace_disable.add_thread (tp);
396 record_btrace_push_target ();
398 btrace_disable.discard ();
401 /* The stop_recording method of target record-btrace. */
404 record_btrace_target::stop_recording ()
406 DEBUG ("stop recording");
408 record_btrace_auto_disable ();
410 for (thread_info *tp : all_non_exited_threads ())
411 if (tp->btrace.target != NULL)
415 /* The disconnect method of target record-btrace. */
418 record_btrace_target::disconnect (const char *args,
421 struct target_ops *beneath = this->beneath ();
423 /* Do not stop recording, just clean up GDB side. */
424 unpush_target (this);
426 /* Forward disconnect. */
427 beneath->disconnect (args, from_tty);
430 /* The close method of target record-btrace. */
433 record_btrace_target::close ()
435 if (record_btrace_async_inferior_event_handler != NULL)
436 delete_async_event_handler (&record_btrace_async_inferior_event_handler);
438 /* Make sure automatic recording gets disabled even if we did not stop
439 recording before closing the record-btrace target. */
440 record_btrace_auto_disable ();
442 /* We should have already stopped recording.
443 Tear down btrace in case we have not. */
444 for (thread_info *tp : all_non_exited_threads ())
445 btrace_teardown (tp);
448 /* The async method of target record-btrace. */
451 record_btrace_target::async (int enable)
454 mark_async_event_handler (record_btrace_async_inferior_event_handler);
456 clear_async_event_handler (record_btrace_async_inferior_event_handler);
458 this->beneath ()->async (enable);
461 /* Adjusts the size and returns a human readable size suffix. */
464 record_btrace_adjust_size (unsigned int *size)
470 if ((sz & ((1u << 30) - 1)) == 0)
475 else if ((sz & ((1u << 20) - 1)) == 0)
480 else if ((sz & ((1u << 10) - 1)) == 0)
489 /* Print a BTS configuration. */
492 record_btrace_print_bts_conf (const struct btrace_config_bts *conf)
500 suffix = record_btrace_adjust_size (&size);
501 printf_unfiltered (_("Buffer size: %u%s.\n"), size, suffix);
505 /* Print an Intel Processor Trace configuration. */
508 record_btrace_print_pt_conf (const struct btrace_config_pt *conf)
516 suffix = record_btrace_adjust_size (&size);
517 printf_unfiltered (_("Buffer size: %u%s.\n"), size, suffix);
521 /* Print a branch tracing configuration. */
524 record_btrace_print_conf (const struct btrace_config *conf)
526 printf_unfiltered (_("Recording format: %s.\n"),
527 btrace_format_string (conf->format));
529 switch (conf->format)
531 case BTRACE_FORMAT_NONE:
534 case BTRACE_FORMAT_BTS:
535 record_btrace_print_bts_conf (&conf->bts);
538 case BTRACE_FORMAT_PT:
539 record_btrace_print_pt_conf (&conf->pt);
543 internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
546 /* The info_record method of target record-btrace. */
549 record_btrace_target::info_record ()
551 struct btrace_thread_info *btinfo;
552 const struct btrace_config *conf;
553 struct thread_info *tp;
554 unsigned int insns, calls, gaps;
558 tp = find_thread_ptid (inferior_ptid);
560 error (_("No thread."));
562 validate_registers_access ();
564 btinfo = &tp->btrace;
566 conf = ::btrace_conf (btinfo);
568 record_btrace_print_conf (conf);
570 btrace_fetch (tp, record_btrace_get_cpu ());
576 if (!btrace_is_empty (tp))
578 struct btrace_call_iterator call;
579 struct btrace_insn_iterator insn;
581 btrace_call_end (&call, btinfo);
582 btrace_call_prev (&call, 1);
583 calls = btrace_call_number (&call);
585 btrace_insn_end (&insn, btinfo);
586 insns = btrace_insn_number (&insn);
588 /* If the last instruction is not a gap, it is the current instruction
589 that is not actually part of the record. */
590 if (btrace_insn_get (&insn) != NULL)
593 gaps = btinfo->ngaps;
596 printf_unfiltered (_("Recorded %u instructions in %u functions (%u gaps) "
597 "for thread %s (%s).\n"), insns, calls, gaps,
598 print_thread_id (tp),
599 target_pid_to_str (tp->ptid).c_str ());
601 if (btrace_is_replaying (tp))
602 printf_unfiltered (_("Replay in progress. At instruction %u.\n"),
603 btrace_insn_number (btinfo->replay));
606 /* Print a decode error. */
609 btrace_ui_out_decode_error (struct ui_out *uiout, int errcode,
610 enum btrace_format format)
612 const char *errstr = btrace_decode_error (format, errcode);
614 uiout->text (_("["));
615 /* ERRCODE > 0 indicates notifications on BTRACE_FORMAT_PT. */
616 if (!(format == BTRACE_FORMAT_PT && errcode > 0))
618 uiout->text (_("decode error ("));
619 uiout->field_int ("errcode", errcode);
620 uiout->text (_("): "));
622 uiout->text (errstr);
623 uiout->text (_("]\n"));
626 /* Print an unsigned int. */
629 ui_out_field_uint (struct ui_out *uiout, const char *fld, unsigned int val)
631 uiout->field_fmt (fld, "%u", val);
634 /* A range of source lines. */
636 struct btrace_line_range
638 /* The symtab this line is from. */
639 struct symtab *symtab;
641 /* The first line (inclusive). */
644 /* The last line (exclusive). */
648 /* Construct a line range. */
650 static struct btrace_line_range
651 btrace_mk_line_range (struct symtab *symtab, int begin, int end)
653 struct btrace_line_range range;
655 range.symtab = symtab;
662 /* Add a line to a line range. */
664 static struct btrace_line_range
665 btrace_line_range_add (struct btrace_line_range range, int line)
667 if (range.end <= range.begin)
669 /* This is the first entry. */
671 range.end = line + 1;
673 else if (line < range.begin)
675 else if (range.end < line)
681 /* Return non-zero if RANGE is empty, zero otherwise. */
684 btrace_line_range_is_empty (struct btrace_line_range range)
686 return range.end <= range.begin;
689 /* Return non-zero if LHS contains RHS, zero otherwise. */
692 btrace_line_range_contains_range (struct btrace_line_range lhs,
693 struct btrace_line_range rhs)
695 return ((lhs.symtab == rhs.symtab)
696 && (lhs.begin <= rhs.begin)
697 && (rhs.end <= lhs.end));
700 /* Find the line range associated with PC. */
702 static struct btrace_line_range
703 btrace_find_line_range (CORE_ADDR pc)
705 struct btrace_line_range range;
706 struct linetable_entry *lines;
707 struct linetable *ltable;
708 struct symtab *symtab;
711 symtab = find_pc_line_symtab (pc);
713 return btrace_mk_line_range (NULL, 0, 0);
715 ltable = SYMTAB_LINETABLE (symtab);
717 return btrace_mk_line_range (symtab, 0, 0);
719 nlines = ltable->nitems;
720 lines = ltable->item;
722 return btrace_mk_line_range (symtab, 0, 0);
724 range = btrace_mk_line_range (symtab, 0, 0);
725 for (i = 0; i < nlines - 1; i++)
727 if ((lines[i].pc == pc) && (lines[i].line != 0))
728 range = btrace_line_range_add (range, lines[i].line);
734 /* Print source lines in LINES to UIOUT.
736 UI_ITEM_CHAIN is a cleanup chain for the last source line and the
737 instructions corresponding to that source line. When printing a new source
738 line, we do the cleanups for the open chain and open a new cleanup chain for
739 the new source line. If the source line range in LINES is not empty, this
740 function will leave the cleanup chain for the last printed source line open
741 so instructions can be added to it. */
744 btrace_print_lines (struct btrace_line_range lines, struct ui_out *uiout,
745 gdb::optional<ui_out_emit_tuple> *src_and_asm_tuple,
746 gdb::optional<ui_out_emit_list> *asm_list,
747 gdb_disassembly_flags flags)
749 print_source_lines_flags psl_flags;
751 if (flags & DISASSEMBLY_FILENAME)
752 psl_flags |= PRINT_SOURCE_LINES_FILENAME;
754 for (int line = lines.begin; line < lines.end; ++line)
758 src_and_asm_tuple->emplace (uiout, "src_and_asm_line");
760 print_source_lines (lines.symtab, line, line + 1, psl_flags);
762 asm_list->emplace (uiout, "line_asm_insn");
766 /* Disassemble a section of the recorded instruction trace. */
769 btrace_insn_history (struct ui_out *uiout,
770 const struct btrace_thread_info *btinfo,
771 const struct btrace_insn_iterator *begin,
772 const struct btrace_insn_iterator *end,
773 gdb_disassembly_flags flags)
775 DEBUG ("itrace (0x%x): [%u; %u)", (unsigned) flags,
776 btrace_insn_number (begin), btrace_insn_number (end));
778 flags |= DISASSEMBLY_SPECULATIVE;
780 struct gdbarch *gdbarch = target_gdbarch ();
781 btrace_line_range last_lines = btrace_mk_line_range (NULL, 0, 0);
783 ui_out_emit_list list_emitter (uiout, "asm_insns");
785 gdb::optional<ui_out_emit_tuple> src_and_asm_tuple;
786 gdb::optional<ui_out_emit_list> asm_list;
788 gdb_pretty_print_disassembler disasm (gdbarch);
790 for (btrace_insn_iterator it = *begin; btrace_insn_cmp (&it, end) != 0;
791 btrace_insn_next (&it, 1))
793 const struct btrace_insn *insn;
795 insn = btrace_insn_get (&it);
797 /* A NULL instruction indicates a gap in the trace. */
800 const struct btrace_config *conf;
802 conf = btrace_conf (btinfo);
804 /* We have trace so we must have a configuration. */
805 gdb_assert (conf != NULL);
807 uiout->field_fmt ("insn-number", "%u",
808 btrace_insn_number (&it));
811 btrace_ui_out_decode_error (uiout, btrace_insn_get_error (&it),
816 struct disasm_insn dinsn;
818 if ((flags & DISASSEMBLY_SOURCE) != 0)
820 struct btrace_line_range lines;
822 lines = btrace_find_line_range (insn->pc);
823 if (!btrace_line_range_is_empty (lines)
824 && !btrace_line_range_contains_range (last_lines, lines))
826 btrace_print_lines (lines, uiout, &src_and_asm_tuple, &asm_list,
830 else if (!src_and_asm_tuple.has_value ())
832 gdb_assert (!asm_list.has_value ());
834 src_and_asm_tuple.emplace (uiout, "src_and_asm_line");
836 /* No source information. */
837 asm_list.emplace (uiout, "line_asm_insn");
840 gdb_assert (src_and_asm_tuple.has_value ());
841 gdb_assert (asm_list.has_value ());
844 memset (&dinsn, 0, sizeof (dinsn));
845 dinsn.number = btrace_insn_number (&it);
846 dinsn.addr = insn->pc;
848 if ((insn->flags & BTRACE_INSN_FLAG_SPECULATIVE) != 0)
849 dinsn.is_speculative = 1;
851 disasm.pretty_print_insn (uiout, &dinsn, flags);
856 /* The insn_history method of target record-btrace. */
859 record_btrace_target::insn_history (int size, gdb_disassembly_flags flags)
861 struct btrace_thread_info *btinfo;
862 struct btrace_insn_history *history;
863 struct btrace_insn_iterator begin, end;
864 struct ui_out *uiout;
865 unsigned int context, covered;
867 uiout = current_uiout;
868 ui_out_emit_tuple tuple_emitter (uiout, "insn history");
869 context = abs (size);
871 error (_("Bad record instruction-history-size."));
873 btinfo = require_btrace ();
874 history = btinfo->insn_history;
877 struct btrace_insn_iterator *replay;
879 DEBUG ("insn-history (0x%x): %d", (unsigned) flags, size);
881 /* If we're replaying, we start at the replay position. Otherwise, we
882 start at the tail of the trace. */
883 replay = btinfo->replay;
887 btrace_insn_end (&begin, btinfo);
889 /* We start from here and expand in the requested direction. Then we
890 expand in the other direction, as well, to fill up any remaining
895 /* We want the current position covered, as well. */
896 covered = btrace_insn_next (&end, 1);
897 covered += btrace_insn_prev (&begin, context - covered);
898 covered += btrace_insn_next (&end, context - covered);
902 covered = btrace_insn_next (&end, context);
903 covered += btrace_insn_prev (&begin, context - covered);
908 begin = history->begin;
911 DEBUG ("insn-history (0x%x): %d, prev: [%u; %u)", (unsigned) flags, size,
912 btrace_insn_number (&begin), btrace_insn_number (&end));
917 covered = btrace_insn_prev (&begin, context);
922 covered = btrace_insn_next (&end, context);
927 btrace_insn_history (uiout, btinfo, &begin, &end, flags);
931 printf_unfiltered (_("At the start of the branch trace record.\n"));
933 printf_unfiltered (_("At the end of the branch trace record.\n"));
936 btrace_set_insn_history (btinfo, &begin, &end);
939 /* The insn_history_range method of target record-btrace. */
942 record_btrace_target::insn_history_range (ULONGEST from, ULONGEST to,
943 gdb_disassembly_flags flags)
945 struct btrace_thread_info *btinfo;
946 struct btrace_insn_iterator begin, end;
947 struct ui_out *uiout;
948 unsigned int low, high;
951 uiout = current_uiout;
952 ui_out_emit_tuple tuple_emitter (uiout, "insn history");
956 DEBUG ("insn-history (0x%x): [%u; %u)", (unsigned) flags, low, high);
958 /* Check for wrap-arounds. */
959 if (low != from || high != to)
960 error (_("Bad range."));
963 error (_("Bad range."));
965 btinfo = require_btrace ();
967 found = btrace_find_insn_by_number (&begin, btinfo, low);
969 error (_("Range out of bounds."));
971 found = btrace_find_insn_by_number (&end, btinfo, high);
974 /* Silently truncate the range. */
975 btrace_insn_end (&end, btinfo);
979 /* We want both begin and end to be inclusive. */
980 btrace_insn_next (&end, 1);
983 btrace_insn_history (uiout, btinfo, &begin, &end, flags);
984 btrace_set_insn_history (btinfo, &begin, &end);
987 /* The insn_history_from method of target record-btrace. */
990 record_btrace_target::insn_history_from (ULONGEST from, int size,
991 gdb_disassembly_flags flags)
993 ULONGEST begin, end, context;
995 context = abs (size);
997 error (_("Bad record instruction-history-size."));
1006 begin = from - context + 1;
1011 end = from + context - 1;
1013 /* Check for wrap-around. */
1018 insn_history_range (begin, end, flags);
1021 /* Print the instruction number range for a function call history line. */
1024 btrace_call_history_insn_range (struct ui_out *uiout,
1025 const struct btrace_function *bfun)
1027 unsigned int begin, end, size;
1029 size = bfun->insn.size ();
1030 gdb_assert (size > 0);
1032 begin = bfun->insn_offset;
1033 end = begin + size - 1;
1035 ui_out_field_uint (uiout, "insn begin", begin);
1037 ui_out_field_uint (uiout, "insn end", end);
1040 /* Compute the lowest and highest source line for the instructions in BFUN
1041 and return them in PBEGIN and PEND.
1042 Ignore instructions that can't be mapped to BFUN, e.g. instructions that
1043 result from inlining or macro expansion. */
1046 btrace_compute_src_line_range (const struct btrace_function *bfun,
1047 int *pbegin, int *pend)
1049 struct symtab *symtab;
1060 symtab = symbol_symtab (sym);
1062 for (const btrace_insn &insn : bfun->insn)
1064 struct symtab_and_line sal;
1066 sal = find_pc_line (insn.pc, 0);
1067 if (sal.symtab != symtab || sal.line == 0)
1070 begin = std::min (begin, sal.line);
1071 end = std::max (end, sal.line);
1079 /* Print the source line information for a function call history line. */
1082 btrace_call_history_src_line (struct ui_out *uiout,
1083 const struct btrace_function *bfun)
1092 uiout->field_string ("file",
1093 symtab_to_filename_for_display (symbol_symtab (sym)),
1094 ui_out_style_kind::FILE);
1096 btrace_compute_src_line_range (bfun, &begin, &end);
1101 uiout->field_int ("min line", begin);
1107 uiout->field_int ("max line", end);
1110 /* Get the name of a branch trace function. */
1113 btrace_get_bfun_name (const struct btrace_function *bfun)
1115 struct minimal_symbol *msym;
1125 return SYMBOL_PRINT_NAME (sym);
1126 else if (msym != NULL)
1127 return MSYMBOL_PRINT_NAME (msym);
1132 /* Disassemble a section of the recorded function trace. */
1135 btrace_call_history (struct ui_out *uiout,
1136 const struct btrace_thread_info *btinfo,
1137 const struct btrace_call_iterator *begin,
1138 const struct btrace_call_iterator *end,
1141 struct btrace_call_iterator it;
1142 record_print_flags flags = (enum record_print_flag) int_flags;
1144 DEBUG ("ftrace (0x%x): [%u; %u)", int_flags, btrace_call_number (begin),
1145 btrace_call_number (end));
1147 for (it = *begin; btrace_call_cmp (&it, end) < 0; btrace_call_next (&it, 1))
1149 const struct btrace_function *bfun;
1150 struct minimal_symbol *msym;
1153 bfun = btrace_call_get (&it);
1157 /* Print the function index. */
1158 ui_out_field_uint (uiout, "index", bfun->number);
1161 /* Indicate gaps in the trace. */
1162 if (bfun->errcode != 0)
1164 const struct btrace_config *conf;
1166 conf = btrace_conf (btinfo);
1168 /* We have trace so we must have a configuration. */
1169 gdb_assert (conf != NULL);
1171 btrace_ui_out_decode_error (uiout, bfun->errcode, conf->format);
1176 if ((flags & RECORD_PRINT_INDENT_CALLS) != 0)
1178 int level = bfun->level + btinfo->level, i;
1180 for (i = 0; i < level; ++i)
1185 uiout->field_string ("function", SYMBOL_PRINT_NAME (sym),
1186 ui_out_style_kind::FUNCTION);
1187 else if (msym != NULL)
1188 uiout->field_string ("function", MSYMBOL_PRINT_NAME (msym),
1189 ui_out_style_kind::FUNCTION);
1190 else if (!uiout->is_mi_like_p ())
1191 uiout->field_string ("function", "??",
1192 ui_out_style_kind::FUNCTION);
1194 if ((flags & RECORD_PRINT_INSN_RANGE) != 0)
1196 uiout->text (_("\tinst "));
1197 btrace_call_history_insn_range (uiout, bfun);
1200 if ((flags & RECORD_PRINT_SRC_LINE) != 0)
1202 uiout->text (_("\tat "));
1203 btrace_call_history_src_line (uiout, bfun);
1210 /* The call_history method of target record-btrace. */
1213 record_btrace_target::call_history (int size, record_print_flags flags)
1215 struct btrace_thread_info *btinfo;
1216 struct btrace_call_history *history;
1217 struct btrace_call_iterator begin, end;
1218 struct ui_out *uiout;
1219 unsigned int context, covered;
1221 uiout = current_uiout;
1222 ui_out_emit_tuple tuple_emitter (uiout, "insn history");
1223 context = abs (size);
1225 error (_("Bad record function-call-history-size."));
1227 btinfo = require_btrace ();
1228 history = btinfo->call_history;
1229 if (history == NULL)
1231 struct btrace_insn_iterator *replay;
1233 DEBUG ("call-history (0x%x): %d", (int) flags, size);
1235 /* If we're replaying, we start at the replay position. Otherwise, we
1236 start at the tail of the trace. */
1237 replay = btinfo->replay;
1240 begin.btinfo = btinfo;
1241 begin.index = replay->call_index;
1244 btrace_call_end (&begin, btinfo);
1246 /* We start from here and expand in the requested direction. Then we
1247 expand in the other direction, as well, to fill up any remaining
1252 /* We want the current position covered, as well. */
1253 covered = btrace_call_next (&end, 1);
1254 covered += btrace_call_prev (&begin, context - covered);
1255 covered += btrace_call_next (&end, context - covered);
1259 covered = btrace_call_next (&end, context);
1260 covered += btrace_call_prev (&begin, context- covered);
1265 begin = history->begin;
1268 DEBUG ("call-history (0x%x): %d, prev: [%u; %u)", (int) flags, size,
1269 btrace_call_number (&begin), btrace_call_number (&end));
1274 covered = btrace_call_prev (&begin, context);
1279 covered = btrace_call_next (&end, context);
1284 btrace_call_history (uiout, btinfo, &begin, &end, flags);
1288 printf_unfiltered (_("At the start of the branch trace record.\n"));
1290 printf_unfiltered (_("At the end of the branch trace record.\n"));
1293 btrace_set_call_history (btinfo, &begin, &end);
1296 /* The call_history_range method of target record-btrace. */
1299 record_btrace_target::call_history_range (ULONGEST from, ULONGEST to,
1300 record_print_flags flags)
1302 struct btrace_thread_info *btinfo;
1303 struct btrace_call_iterator begin, end;
1304 struct ui_out *uiout;
1305 unsigned int low, high;
1308 uiout = current_uiout;
1309 ui_out_emit_tuple tuple_emitter (uiout, "func history");
1313 DEBUG ("call-history (0x%x): [%u; %u)", (int) flags, low, high);
1315 /* Check for wrap-arounds. */
1316 if (low != from || high != to)
1317 error (_("Bad range."));
1320 error (_("Bad range."));
1322 btinfo = require_btrace ();
1324 found = btrace_find_call_by_number (&begin, btinfo, low);
1326 error (_("Range out of bounds."));
1328 found = btrace_find_call_by_number (&end, btinfo, high);
1331 /* Silently truncate the range. */
1332 btrace_call_end (&end, btinfo);
1336 /* We want both begin and end to be inclusive. */
1337 btrace_call_next (&end, 1);
1340 btrace_call_history (uiout, btinfo, &begin, &end, flags);
1341 btrace_set_call_history (btinfo, &begin, &end);
1344 /* The call_history_from method of target record-btrace. */
1347 record_btrace_target::call_history_from (ULONGEST from, int size,
1348 record_print_flags flags)
1350 ULONGEST begin, end, context;
1352 context = abs (size);
1354 error (_("Bad record function-call-history-size."));
1363 begin = from - context + 1;
1368 end = from + context - 1;
1370 /* Check for wrap-around. */
1375 call_history_range ( begin, end, flags);
1378 /* The record_method method of target record-btrace. */
1381 record_btrace_target::record_method (ptid_t ptid)
1383 struct thread_info * const tp = find_thread_ptid (ptid);
1386 error (_("No thread."));
1388 if (tp->btrace.target == NULL)
1389 return RECORD_METHOD_NONE;
1391 return RECORD_METHOD_BTRACE;
1394 /* The record_is_replaying method of target record-btrace. */
1397 record_btrace_target::record_is_replaying (ptid_t ptid)
1399 for (thread_info *tp : all_non_exited_threads (ptid))
1400 if (btrace_is_replaying (tp))
1406 /* The record_will_replay method of target record-btrace. */
1409 record_btrace_target::record_will_replay (ptid_t ptid, int dir)
1411 return dir == EXEC_REVERSE || record_is_replaying (ptid);
1414 /* The xfer_partial method of target record-btrace. */
1416 enum target_xfer_status
1417 record_btrace_target::xfer_partial (enum target_object object,
1418 const char *annex, gdb_byte *readbuf,
1419 const gdb_byte *writebuf, ULONGEST offset,
1420 ULONGEST len, ULONGEST *xfered_len)
1422 /* Filter out requests that don't make sense during replay. */
1423 if (replay_memory_access == replay_memory_access_read_only
1424 && !record_btrace_generating_corefile
1425 && record_is_replaying (inferior_ptid))
1429 case TARGET_OBJECT_MEMORY:
1431 struct target_section *section;
1433 /* We do not allow writing memory in general. */
1434 if (writebuf != NULL)
1437 return TARGET_XFER_UNAVAILABLE;
1440 /* We allow reading readonly memory. */
1441 section = target_section_by_addr (this, offset);
1442 if (section != NULL)
1444 /* Check if the section we found is readonly. */
1445 if ((bfd_get_section_flags (section->the_bfd_section->owner,
1446 section->the_bfd_section)
1447 & SEC_READONLY) != 0)
1449 /* Truncate the request to fit into this section. */
1450 len = std::min (len, section->endaddr - offset);
1456 return TARGET_XFER_UNAVAILABLE;
1461 /* Forward the request. */
1462 return this->beneath ()->xfer_partial (object, annex, readbuf, writebuf,
1463 offset, len, xfered_len);
1466 /* The insert_breakpoint method of target record-btrace. */
1469 record_btrace_target::insert_breakpoint (struct gdbarch *gdbarch,
1470 struct bp_target_info *bp_tgt)
1475 /* Inserting breakpoints requires accessing memory. Allow it for the
1476 duration of this function. */
1477 old = replay_memory_access;
1478 replay_memory_access = replay_memory_access_read_write;
1483 ret = this->beneath ()->insert_breakpoint (gdbarch, bp_tgt);
1485 catch (const gdb_exception &except)
1487 replay_memory_access = old;
1490 replay_memory_access = old;
1495 /* The remove_breakpoint method of target record-btrace. */
1498 record_btrace_target::remove_breakpoint (struct gdbarch *gdbarch,
1499 struct bp_target_info *bp_tgt,
1500 enum remove_bp_reason reason)
1505 /* Removing breakpoints requires accessing memory. Allow it for the
1506 duration of this function. */
1507 old = replay_memory_access;
1508 replay_memory_access = replay_memory_access_read_write;
1513 ret = this->beneath ()->remove_breakpoint (gdbarch, bp_tgt, reason);
1515 catch (const gdb_exception &except)
1517 replay_memory_access = old;
1520 replay_memory_access = old;
1525 /* The fetch_registers method of target record-btrace. */
1528 record_btrace_target::fetch_registers (struct regcache *regcache, int regno)
1530 struct btrace_insn_iterator *replay;
1531 struct thread_info *tp;
1533 tp = find_thread_ptid (regcache->ptid ());
1534 gdb_assert (tp != NULL);
1536 replay = tp->btrace.replay;
1537 if (replay != NULL && !record_btrace_generating_corefile)
1539 const struct btrace_insn *insn;
1540 struct gdbarch *gdbarch;
1543 gdbarch = regcache->arch ();
1544 pcreg = gdbarch_pc_regnum (gdbarch);
1548 /* We can only provide the PC register. */
1549 if (regno >= 0 && regno != pcreg)
1552 insn = btrace_insn_get (replay);
1553 gdb_assert (insn != NULL);
1555 regcache->raw_supply (regno, &insn->pc);
1558 this->beneath ()->fetch_registers (regcache, regno);
1561 /* The store_registers method of target record-btrace. */
1564 record_btrace_target::store_registers (struct regcache *regcache, int regno)
1566 if (!record_btrace_generating_corefile
1567 && record_is_replaying (regcache->ptid ()))
1568 error (_("Cannot write registers while replaying."));
1570 gdb_assert (may_write_registers != 0);
1572 this->beneath ()->store_registers (regcache, regno);
1575 /* The prepare_to_store method of target record-btrace. */
1578 record_btrace_target::prepare_to_store (struct regcache *regcache)
1580 if (!record_btrace_generating_corefile
1581 && record_is_replaying (regcache->ptid ()))
1584 this->beneath ()->prepare_to_store (regcache);
1587 /* The branch trace frame cache. */
1589 struct btrace_frame_cache
1592 struct thread_info *tp;
1594 /* The frame info. */
1595 struct frame_info *frame;
1597 /* The branch trace function segment. */
1598 const struct btrace_function *bfun;
1601 /* A struct btrace_frame_cache hash table indexed by NEXT. */
1603 static htab_t bfcache;
1605 /* hash_f for htab_create_alloc of bfcache. */
1608 bfcache_hash (const void *arg)
1610 const struct btrace_frame_cache *cache
1611 = (const struct btrace_frame_cache *) arg;
1613 return htab_hash_pointer (cache->frame);
1616 /* eq_f for htab_create_alloc of bfcache. */
1619 bfcache_eq (const void *arg1, const void *arg2)
1621 const struct btrace_frame_cache *cache1
1622 = (const struct btrace_frame_cache *) arg1;
1623 const struct btrace_frame_cache *cache2
1624 = (const struct btrace_frame_cache *) arg2;
1626 return cache1->frame == cache2->frame;
1629 /* Create a new btrace frame cache. */
1631 static struct btrace_frame_cache *
1632 bfcache_new (struct frame_info *frame)
1634 struct btrace_frame_cache *cache;
1637 cache = FRAME_OBSTACK_ZALLOC (struct btrace_frame_cache);
1638 cache->frame = frame;
1640 slot = htab_find_slot (bfcache, cache, INSERT);
1641 gdb_assert (*slot == NULL);
1647 /* Extract the branch trace function from a branch trace frame. */
1649 static const struct btrace_function *
1650 btrace_get_frame_function (struct frame_info *frame)
1652 const struct btrace_frame_cache *cache;
1653 struct btrace_frame_cache pattern;
1656 pattern.frame = frame;
1658 slot = htab_find_slot (bfcache, &pattern, NO_INSERT);
1662 cache = (const struct btrace_frame_cache *) *slot;
1666 /* Implement stop_reason method for record_btrace_frame_unwind. */
1668 static enum unwind_stop_reason
1669 record_btrace_frame_unwind_stop_reason (struct frame_info *this_frame,
1672 const struct btrace_frame_cache *cache;
1673 const struct btrace_function *bfun;
1675 cache = (const struct btrace_frame_cache *) *this_cache;
1677 gdb_assert (bfun != NULL);
1680 return UNWIND_UNAVAILABLE;
1682 return UNWIND_NO_REASON;
1685 /* Implement this_id method for record_btrace_frame_unwind. */
1688 record_btrace_frame_this_id (struct frame_info *this_frame, void **this_cache,
1689 struct frame_id *this_id)
1691 const struct btrace_frame_cache *cache;
1692 const struct btrace_function *bfun;
1693 struct btrace_call_iterator it;
1694 CORE_ADDR code, special;
1696 cache = (const struct btrace_frame_cache *) *this_cache;
1699 gdb_assert (bfun != NULL);
1701 while (btrace_find_call_by_number (&it, &cache->tp->btrace, bfun->prev) != 0)
1702 bfun = btrace_call_get (&it);
1704 code = get_frame_func (this_frame);
1705 special = bfun->number;
1707 *this_id = frame_id_build_unavailable_stack_special (code, special);
1709 DEBUG ("[frame] %s id: (!stack, pc=%s, special=%s)",
1710 btrace_get_bfun_name (cache->bfun),
1711 core_addr_to_string_nz (this_id->code_addr),
1712 core_addr_to_string_nz (this_id->special_addr));
1715 /* Implement prev_register method for record_btrace_frame_unwind. */
1717 static struct value *
1718 record_btrace_frame_prev_register (struct frame_info *this_frame,
1722 const struct btrace_frame_cache *cache;
1723 const struct btrace_function *bfun, *caller;
1724 struct btrace_call_iterator it;
1725 struct gdbarch *gdbarch;
1729 gdbarch = get_frame_arch (this_frame);
1730 pcreg = gdbarch_pc_regnum (gdbarch);
1731 if (pcreg < 0 || regnum != pcreg)
1732 throw_error (NOT_AVAILABLE_ERROR,
1733 _("Registers are not available in btrace record history"));
1735 cache = (const struct btrace_frame_cache *) *this_cache;
1737 gdb_assert (bfun != NULL);
1739 if (btrace_find_call_by_number (&it, &cache->tp->btrace, bfun->up) == 0)
1740 throw_error (NOT_AVAILABLE_ERROR,
1741 _("No caller in btrace record history"));
1743 caller = btrace_call_get (&it);
1745 if ((bfun->flags & BFUN_UP_LINKS_TO_RET) != 0)
1746 pc = caller->insn.front ().pc;
1749 pc = caller->insn.back ().pc;
1750 pc += gdb_insn_length (gdbarch, pc);
1753 DEBUG ("[frame] unwound PC in %s on level %d: %s",
1754 btrace_get_bfun_name (bfun), bfun->level,
1755 core_addr_to_string_nz (pc));
1757 return frame_unwind_got_address (this_frame, regnum, pc);
1760 /* Implement sniffer method for record_btrace_frame_unwind. */
1763 record_btrace_frame_sniffer (const struct frame_unwind *self,
1764 struct frame_info *this_frame,
1767 const struct btrace_function *bfun;
1768 struct btrace_frame_cache *cache;
1769 struct thread_info *tp;
1770 struct frame_info *next;
1772 /* THIS_FRAME does not contain a reference to its thread. */
1773 tp = inferior_thread ();
1776 next = get_next_frame (this_frame);
1779 const struct btrace_insn_iterator *replay;
1781 replay = tp->btrace.replay;
1783 bfun = &replay->btinfo->functions[replay->call_index];
1787 const struct btrace_function *callee;
1788 struct btrace_call_iterator it;
1790 callee = btrace_get_frame_function (next);
1791 if (callee == NULL || (callee->flags & BFUN_UP_LINKS_TO_TAILCALL) != 0)
1794 if (btrace_find_call_by_number (&it, &tp->btrace, callee->up) == 0)
1797 bfun = btrace_call_get (&it);
1803 DEBUG ("[frame] sniffed frame for %s on level %d",
1804 btrace_get_bfun_name (bfun), bfun->level);
1806 /* This is our frame. Initialize the frame cache. */
1807 cache = bfcache_new (this_frame);
1811 *this_cache = cache;
1815 /* Implement sniffer method for record_btrace_tailcall_frame_unwind. */
1818 record_btrace_tailcall_frame_sniffer (const struct frame_unwind *self,
1819 struct frame_info *this_frame,
1822 const struct btrace_function *bfun, *callee;
1823 struct btrace_frame_cache *cache;
1824 struct btrace_call_iterator it;
1825 struct frame_info *next;
1826 struct thread_info *tinfo;
1828 next = get_next_frame (this_frame);
1832 callee = btrace_get_frame_function (next);
1836 if ((callee->flags & BFUN_UP_LINKS_TO_TAILCALL) == 0)
1839 tinfo = inferior_thread ();
1840 if (btrace_find_call_by_number (&it, &tinfo->btrace, callee->up) == 0)
1843 bfun = btrace_call_get (&it);
1845 DEBUG ("[frame] sniffed tailcall frame for %s on level %d",
1846 btrace_get_bfun_name (bfun), bfun->level);
1848 /* This is our frame. Initialize the frame cache. */
1849 cache = bfcache_new (this_frame);
1853 *this_cache = cache;
1858 record_btrace_frame_dealloc_cache (struct frame_info *self, void *this_cache)
1860 struct btrace_frame_cache *cache;
1863 cache = (struct btrace_frame_cache *) this_cache;
1865 slot = htab_find_slot (bfcache, cache, NO_INSERT);
1866 gdb_assert (slot != NULL);
1868 htab_remove_elt (bfcache, cache);
1871 /* btrace recording does not store previous memory content, neither the stack
1872 frames content. Any unwinding would return errorneous results as the stack
1873 contents no longer matches the changed PC value restored from history.
1874 Therefore this unwinder reports any possibly unwound registers as
1877 const struct frame_unwind record_btrace_frame_unwind =
1880 record_btrace_frame_unwind_stop_reason,
1881 record_btrace_frame_this_id,
1882 record_btrace_frame_prev_register,
1884 record_btrace_frame_sniffer,
1885 record_btrace_frame_dealloc_cache
1888 const struct frame_unwind record_btrace_tailcall_frame_unwind =
1891 record_btrace_frame_unwind_stop_reason,
1892 record_btrace_frame_this_id,
1893 record_btrace_frame_prev_register,
1895 record_btrace_tailcall_frame_sniffer,
1896 record_btrace_frame_dealloc_cache
1899 /* Implement the get_unwinder method. */
1901 const struct frame_unwind *
1902 record_btrace_target::get_unwinder ()
1904 return &record_btrace_frame_unwind;
1907 /* Implement the get_tailcall_unwinder method. */
1909 const struct frame_unwind *
1910 record_btrace_target::get_tailcall_unwinder ()
1912 return &record_btrace_tailcall_frame_unwind;
1915 /* Return a human-readable string for FLAG. */
1918 btrace_thread_flag_to_str (enum btrace_thread_flag flag)
1926 return "reverse-step";
1932 return "reverse-cont";
1941 /* Indicate that TP should be resumed according to FLAG. */
1944 record_btrace_resume_thread (struct thread_info *tp,
1945 enum btrace_thread_flag flag)
1947 struct btrace_thread_info *btinfo;
1949 DEBUG ("resuming thread %s (%s): %x (%s)", print_thread_id (tp),
1950 target_pid_to_str (tp->ptid).c_str (), flag,
1951 btrace_thread_flag_to_str (flag));
1953 btinfo = &tp->btrace;
1955 /* Fetch the latest branch trace. */
1956 btrace_fetch (tp, record_btrace_get_cpu ());
1958 /* A resume request overwrites a preceding resume or stop request. */
1959 btinfo->flags &= ~(BTHR_MOVE | BTHR_STOP);
1960 btinfo->flags |= flag;
1963 /* Get the current frame for TP. */
1965 static struct frame_id
1966 get_thread_current_frame_id (struct thread_info *tp)
1971 /* Set current thread, which is implicitly used by
1972 get_current_frame. */
1973 scoped_restore_current_thread restore_thread;
1975 switch_to_thread (tp);
1977 /* Clear the executing flag to allow changes to the current frame.
1978 We are not actually running, yet. We just started a reverse execution
1979 command or a record goto command.
1980 For the latter, EXECUTING is false and this has no effect.
1981 For the former, EXECUTING is true and we're in wait, about to
1982 move the thread. Since we need to recompute the stack, we temporarily
1983 set EXECUTING to flase. */
1984 executing = tp->executing;
1985 set_executing (inferior_ptid, false);
1990 id = get_frame_id (get_current_frame ());
1992 catch (const gdb_exception &except)
1994 /* Restore the previous execution state. */
1995 set_executing (inferior_ptid, executing);
2000 /* Restore the previous execution state. */
2001 set_executing (inferior_ptid, executing);
2006 /* Start replaying a thread. */
2008 static struct btrace_insn_iterator *
2009 record_btrace_start_replaying (struct thread_info *tp)
2011 struct btrace_insn_iterator *replay;
2012 struct btrace_thread_info *btinfo;
2014 btinfo = &tp->btrace;
2017 /* We can't start replaying without trace. */
2018 if (btinfo->functions.empty ())
2021 /* GDB stores the current frame_id when stepping in order to detects steps
2023 Since frames are computed differently when we're replaying, we need to
2024 recompute those stored frames and fix them up so we can still detect
2025 subroutines after we started replaying. */
2028 struct frame_id frame_id;
2029 int upd_step_frame_id, upd_step_stack_frame_id;
2031 /* The current frame without replaying - computed via normal unwind. */
2032 frame_id = get_thread_current_frame_id (tp);
2034 /* Check if we need to update any stepping-related frame id's. */
2035 upd_step_frame_id = frame_id_eq (frame_id,
2036 tp->control.step_frame_id);
2037 upd_step_stack_frame_id = frame_id_eq (frame_id,
2038 tp->control.step_stack_frame_id);
2040 /* We start replaying at the end of the branch trace. This corresponds
2041 to the current instruction. */
2042 replay = XNEW (struct btrace_insn_iterator);
2043 btrace_insn_end (replay, btinfo);
2045 /* Skip gaps at the end of the trace. */
2046 while (btrace_insn_get (replay) == NULL)
2050 steps = btrace_insn_prev (replay, 1);
2052 error (_("No trace."));
2055 /* We're not replaying, yet. */
2056 gdb_assert (btinfo->replay == NULL);
2057 btinfo->replay = replay;
2059 /* Make sure we're not using any stale registers. */
2060 registers_changed_thread (tp);
2062 /* The current frame with replaying - computed via btrace unwind. */
2063 frame_id = get_thread_current_frame_id (tp);
2065 /* Replace stepping related frames where necessary. */
2066 if (upd_step_frame_id)
2067 tp->control.step_frame_id = frame_id;
2068 if (upd_step_stack_frame_id)
2069 tp->control.step_stack_frame_id = frame_id;
2071 catch (const gdb_exception &except)
2073 xfree (btinfo->replay);
2074 btinfo->replay = NULL;
2076 registers_changed_thread (tp);
2084 /* Stop replaying a thread. */
2087 record_btrace_stop_replaying (struct thread_info *tp)
2089 struct btrace_thread_info *btinfo;
2091 btinfo = &tp->btrace;
2093 xfree (btinfo->replay);
2094 btinfo->replay = NULL;
2096 /* Make sure we're not leaving any stale registers. */
2097 registers_changed_thread (tp);
2100 /* Stop replaying TP if it is at the end of its execution history. */
2103 record_btrace_stop_replaying_at_end (struct thread_info *tp)
2105 struct btrace_insn_iterator *replay, end;
2106 struct btrace_thread_info *btinfo;
2108 btinfo = &tp->btrace;
2109 replay = btinfo->replay;
2114 btrace_insn_end (&end, btinfo);
2116 if (btrace_insn_cmp (replay, &end) == 0)
2117 record_btrace_stop_replaying (tp);
2120 /* The resume method of target record-btrace. */
2123 record_btrace_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
2125 enum btrace_thread_flag flag, cflag;
2127 DEBUG ("resume %s: %s%s", target_pid_to_str (ptid).c_str (),
2128 ::execution_direction == EXEC_REVERSE ? "reverse-" : "",
2129 step ? "step" : "cont");
2131 /* Store the execution direction of the last resume.
2133 If there is more than one resume call, we have to rely on infrun
2134 to not change the execution direction in-between. */
2135 record_btrace_resume_exec_dir = ::execution_direction;
2137 /* As long as we're not replaying, just forward the request.
2139 For non-stop targets this means that no thread is replaying. In order to
2140 make progress, we may need to explicitly move replaying threads to the end
2141 of their execution history. */
2142 if ((::execution_direction != EXEC_REVERSE)
2143 && !record_is_replaying (minus_one_ptid))
2145 this->beneath ()->resume (ptid, step, signal);
2149 /* Compute the btrace thread flag for the requested move. */
2150 if (::execution_direction == EXEC_REVERSE)
2152 flag = step == 0 ? BTHR_RCONT : BTHR_RSTEP;
2157 flag = step == 0 ? BTHR_CONT : BTHR_STEP;
2161 /* We just indicate the resume intent here. The actual stepping happens in
2162 record_btrace_wait below.
2164 For all-stop targets, we only step INFERIOR_PTID and continue others. */
2165 if (!target_is_non_stop_p ())
2167 gdb_assert (inferior_ptid.matches (ptid));
2169 for (thread_info *tp : all_non_exited_threads (ptid))
2171 if (tp->ptid.matches (inferior_ptid))
2172 record_btrace_resume_thread (tp, flag);
2174 record_btrace_resume_thread (tp, cflag);
2179 for (thread_info *tp : all_non_exited_threads (ptid))
2180 record_btrace_resume_thread (tp, flag);
2183 /* Async support. */
2184 if (target_can_async_p ())
2187 mark_async_event_handler (record_btrace_async_inferior_event_handler);
2191 /* The commit_resume method of target record-btrace. */
2194 record_btrace_target::commit_resume ()
2196 if ((::execution_direction != EXEC_REVERSE)
2197 && !record_is_replaying (minus_one_ptid))
2198 beneath ()->commit_resume ();
2201 /* Cancel resuming TP. */
2204 record_btrace_cancel_resume (struct thread_info *tp)
2206 enum btrace_thread_flag flags;
2208 flags = tp->btrace.flags & (BTHR_MOVE | BTHR_STOP);
2212 DEBUG ("cancel resume thread %s (%s): %x (%s)",
2213 print_thread_id (tp),
2214 target_pid_to_str (tp->ptid).c_str (), flags,
2215 btrace_thread_flag_to_str (flags));
2217 tp->btrace.flags &= ~(BTHR_MOVE | BTHR_STOP);
2218 record_btrace_stop_replaying_at_end (tp);
2221 /* Return a target_waitstatus indicating that we ran out of history. */
2223 static struct target_waitstatus
2224 btrace_step_no_history (void)
2226 struct target_waitstatus status;
2228 status.kind = TARGET_WAITKIND_NO_HISTORY;
2233 /* Return a target_waitstatus indicating that a step finished. */
2235 static struct target_waitstatus
2236 btrace_step_stopped (void)
2238 struct target_waitstatus status;
2240 status.kind = TARGET_WAITKIND_STOPPED;
2241 status.value.sig = GDB_SIGNAL_TRAP;
2246 /* Return a target_waitstatus indicating that a thread was stopped as
2249 static struct target_waitstatus
2250 btrace_step_stopped_on_request (void)
2252 struct target_waitstatus status;
2254 status.kind = TARGET_WAITKIND_STOPPED;
2255 status.value.sig = GDB_SIGNAL_0;
2260 /* Return a target_waitstatus indicating a spurious stop. */
2262 static struct target_waitstatus
2263 btrace_step_spurious (void)
2265 struct target_waitstatus status;
2267 status.kind = TARGET_WAITKIND_SPURIOUS;
2272 /* Return a target_waitstatus indicating that the thread was not resumed. */
2274 static struct target_waitstatus
2275 btrace_step_no_resumed (void)
2277 struct target_waitstatus status;
2279 status.kind = TARGET_WAITKIND_NO_RESUMED;
2284 /* Return a target_waitstatus indicating that we should wait again. */
2286 static struct target_waitstatus
2287 btrace_step_again (void)
2289 struct target_waitstatus status;
2291 status.kind = TARGET_WAITKIND_IGNORE;
2296 /* Clear the record histories. */
2299 record_btrace_clear_histories (struct btrace_thread_info *btinfo)
2301 xfree (btinfo->insn_history);
2302 xfree (btinfo->call_history);
2304 btinfo->insn_history = NULL;
2305 btinfo->call_history = NULL;
2308 /* Check whether TP's current replay position is at a breakpoint. */
2311 record_btrace_replay_at_breakpoint (struct thread_info *tp)
2313 struct btrace_insn_iterator *replay;
2314 struct btrace_thread_info *btinfo;
2315 const struct btrace_insn *insn;
2317 btinfo = &tp->btrace;
2318 replay = btinfo->replay;
2323 insn = btrace_insn_get (replay);
2327 return record_check_stopped_by_breakpoint (tp->inf->aspace, insn->pc,
2328 &btinfo->stop_reason);
2331 /* Step one instruction in forward direction. */
2333 static struct target_waitstatus
2334 record_btrace_single_step_forward (struct thread_info *tp)
2336 struct btrace_insn_iterator *replay, end, start;
2337 struct btrace_thread_info *btinfo;
2339 btinfo = &tp->btrace;
2340 replay = btinfo->replay;
2342 /* We're done if we're not replaying. */
2344 return btrace_step_no_history ();
2346 /* Check if we're stepping a breakpoint. */
2347 if (record_btrace_replay_at_breakpoint (tp))
2348 return btrace_step_stopped ();
2350 /* Skip gaps during replay. If we end up at a gap (at the end of the trace),
2351 jump back to the instruction at which we started. */
2357 /* We will bail out here if we continue stepping after reaching the end
2358 of the execution history. */
2359 steps = btrace_insn_next (replay, 1);
2363 return btrace_step_no_history ();
2366 while (btrace_insn_get (replay) == NULL);
2368 /* Determine the end of the instruction trace. */
2369 btrace_insn_end (&end, btinfo);
2371 /* The execution trace contains (and ends with) the current instruction.
2372 This instruction has not been executed, yet, so the trace really ends
2373 one instruction earlier. */
2374 if (btrace_insn_cmp (replay, &end) == 0)
2375 return btrace_step_no_history ();
2377 return btrace_step_spurious ();
2380 /* Step one instruction in backward direction. */
2382 static struct target_waitstatus
2383 record_btrace_single_step_backward (struct thread_info *tp)
2385 struct btrace_insn_iterator *replay, start;
2386 struct btrace_thread_info *btinfo;
2388 btinfo = &tp->btrace;
2389 replay = btinfo->replay;
2391 /* Start replaying if we're not already doing so. */
2393 replay = record_btrace_start_replaying (tp);
2395 /* If we can't step any further, we reached the end of the history.
2396 Skip gaps during replay. If we end up at a gap (at the beginning of
2397 the trace), jump back to the instruction at which we started. */
2403 steps = btrace_insn_prev (replay, 1);
2407 return btrace_step_no_history ();
2410 while (btrace_insn_get (replay) == NULL);
2412 /* Check if we're stepping a breakpoint.
2414 For reverse-stepping, this check is after the step. There is logic in
2415 infrun.c that handles reverse-stepping separately. See, for example,
2416 proceed and adjust_pc_after_break.
2418 This code assumes that for reverse-stepping, PC points to the last
2419 de-executed instruction, whereas for forward-stepping PC points to the
2420 next to-be-executed instruction. */
2421 if (record_btrace_replay_at_breakpoint (tp))
2422 return btrace_step_stopped ();
2424 return btrace_step_spurious ();
2427 /* Step a single thread. */
2429 static struct target_waitstatus
2430 record_btrace_step_thread (struct thread_info *tp)
2432 struct btrace_thread_info *btinfo;
2433 struct target_waitstatus status;
2434 enum btrace_thread_flag flags;
2436 btinfo = &tp->btrace;
2438 flags = btinfo->flags & (BTHR_MOVE | BTHR_STOP);
2439 btinfo->flags &= ~(BTHR_MOVE | BTHR_STOP);
2441 DEBUG ("stepping thread %s (%s): %x (%s)", print_thread_id (tp),
2442 target_pid_to_str (tp->ptid).c_str (), flags,
2443 btrace_thread_flag_to_str (flags));
2445 /* We can't step without an execution history. */
2446 if ((flags & BTHR_MOVE) != 0 && btrace_is_empty (tp))
2447 return btrace_step_no_history ();
2452 internal_error (__FILE__, __LINE__, _("invalid stepping type."));
2455 return btrace_step_stopped_on_request ();
2458 status = record_btrace_single_step_forward (tp);
2459 if (status.kind != TARGET_WAITKIND_SPURIOUS)
2462 return btrace_step_stopped ();
2465 status = record_btrace_single_step_backward (tp);
2466 if (status.kind != TARGET_WAITKIND_SPURIOUS)
2469 return btrace_step_stopped ();
2472 status = record_btrace_single_step_forward (tp);
2473 if (status.kind != TARGET_WAITKIND_SPURIOUS)
2476 btinfo->flags |= flags;
2477 return btrace_step_again ();
2480 status = record_btrace_single_step_backward (tp);
2481 if (status.kind != TARGET_WAITKIND_SPURIOUS)
2484 btinfo->flags |= flags;
2485 return btrace_step_again ();
2488 /* We keep threads moving at the end of their execution history. The wait
2489 method will stop the thread for whom the event is reported. */
2490 if (status.kind == TARGET_WAITKIND_NO_HISTORY)
2491 btinfo->flags |= flags;
2496 /* Announce further events if necessary. */
2499 record_btrace_maybe_mark_async_event
2500 (const std::vector<thread_info *> &moving,
2501 const std::vector<thread_info *> &no_history)
2503 bool more_moving = !moving.empty ();
2504 bool more_no_history = !no_history.empty ();;
2506 if (!more_moving && !more_no_history)
2510 DEBUG ("movers pending");
2512 if (more_no_history)
2513 DEBUG ("no-history pending");
2515 mark_async_event_handler (record_btrace_async_inferior_event_handler);
2518 /* The wait method of target record-btrace. */
2521 record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status,
2524 std::vector<thread_info *> moving;
2525 std::vector<thread_info *> no_history;
2527 DEBUG ("wait %s (0x%x)", target_pid_to_str (ptid).c_str (), options);
2529 /* As long as we're not replaying, just forward the request. */
2530 if ((::execution_direction != EXEC_REVERSE)
2531 && !record_is_replaying (minus_one_ptid))
2533 return this->beneath ()->wait (ptid, status, options);
2536 /* Keep a work list of moving threads. */
2537 for (thread_info *tp : all_non_exited_threads (ptid))
2538 if ((tp->btrace.flags & (BTHR_MOVE | BTHR_STOP)) != 0)
2539 moving.push_back (tp);
2541 if (moving.empty ())
2543 *status = btrace_step_no_resumed ();
2545 DEBUG ("wait ended by %s: %s", target_pid_to_str (null_ptid).c_str (),
2546 target_waitstatus_to_string (status).c_str ());
2551 /* Step moving threads one by one, one step each, until either one thread
2552 reports an event or we run out of threads to step.
2554 When stepping more than one thread, chances are that some threads reach
2555 the end of their execution history earlier than others. If we reported
2556 this immediately, all-stop on top of non-stop would stop all threads and
2557 resume the same threads next time. And we would report the same thread
2558 having reached the end of its execution history again.
2560 In the worst case, this would starve the other threads. But even if other
2561 threads would be allowed to make progress, this would result in far too
2562 many intermediate stops.
2564 We therefore delay the reporting of "no execution history" until we have
2565 nothing else to report. By this time, all threads should have moved to
2566 either the beginning or the end of their execution history. There will
2567 be a single user-visible stop. */
2568 struct thread_info *eventing = NULL;
2569 while ((eventing == NULL) && !moving.empty ())
2571 for (unsigned int ix = 0; eventing == NULL && ix < moving.size ();)
2573 thread_info *tp = moving[ix];
2575 *status = record_btrace_step_thread (tp);
2577 switch (status->kind)
2579 case TARGET_WAITKIND_IGNORE:
2583 case TARGET_WAITKIND_NO_HISTORY:
2584 no_history.push_back (ordered_remove (moving, ix));
2588 eventing = unordered_remove (moving, ix);
2594 if (eventing == NULL)
2596 /* We started with at least one moving thread. This thread must have
2597 either stopped or reached the end of its execution history.
2599 In the former case, EVENTING must not be NULL.
2600 In the latter case, NO_HISTORY must not be empty. */
2601 gdb_assert (!no_history.empty ());
2603 /* We kept threads moving at the end of their execution history. Stop
2604 EVENTING now that we are going to report its stop. */
2605 eventing = unordered_remove (no_history, 0);
2606 eventing->btrace.flags &= ~BTHR_MOVE;
2608 *status = btrace_step_no_history ();
2611 gdb_assert (eventing != NULL);
2613 /* We kept threads replaying at the end of their execution history. Stop
2614 replaying EVENTING now that we are going to report its stop. */
2615 record_btrace_stop_replaying_at_end (eventing);
2617 /* Stop all other threads. */
2618 if (!target_is_non_stop_p ())
2620 for (thread_info *tp : all_non_exited_threads ())
2621 record_btrace_cancel_resume (tp);
2624 /* In async mode, we need to announce further events. */
2625 if (target_is_async_p ())
2626 record_btrace_maybe_mark_async_event (moving, no_history);
2628 /* Start record histories anew from the current position. */
2629 record_btrace_clear_histories (&eventing->btrace);
2631 /* We moved the replay position but did not update registers. */
2632 registers_changed_thread (eventing);
2634 DEBUG ("wait ended by thread %s (%s): %s",
2635 print_thread_id (eventing),
2636 target_pid_to_str (eventing->ptid).c_str (),
2637 target_waitstatus_to_string (status).c_str ());
2639 return eventing->ptid;
2642 /* The stop method of target record-btrace. */
2645 record_btrace_target::stop (ptid_t ptid)
2647 DEBUG ("stop %s", target_pid_to_str (ptid).c_str ());
2649 /* As long as we're not replaying, just forward the request. */
2650 if ((::execution_direction != EXEC_REVERSE)
2651 && !record_is_replaying (minus_one_ptid))
2653 this->beneath ()->stop (ptid);
2657 for (thread_info *tp : all_non_exited_threads (ptid))
2659 tp->btrace.flags &= ~BTHR_MOVE;
2660 tp->btrace.flags |= BTHR_STOP;
2665 /* The can_execute_reverse method of target record-btrace. */
2668 record_btrace_target::can_execute_reverse ()
2673 /* The stopped_by_sw_breakpoint method of target record-btrace. */
2676 record_btrace_target::stopped_by_sw_breakpoint ()
2678 if (record_is_replaying (minus_one_ptid))
2680 struct thread_info *tp = inferior_thread ();
2682 return tp->btrace.stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT;
2685 return this->beneath ()->stopped_by_sw_breakpoint ();
2688 /* The supports_stopped_by_sw_breakpoint method of target
2692 record_btrace_target::supports_stopped_by_sw_breakpoint ()
2694 if (record_is_replaying (minus_one_ptid))
2697 return this->beneath ()->supports_stopped_by_sw_breakpoint ();
2700 /* The stopped_by_sw_breakpoint method of target record-btrace. */
2703 record_btrace_target::stopped_by_hw_breakpoint ()
2705 if (record_is_replaying (minus_one_ptid))
2707 struct thread_info *tp = inferior_thread ();
2709 return tp->btrace.stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT;
2712 return this->beneath ()->stopped_by_hw_breakpoint ();
2715 /* The supports_stopped_by_hw_breakpoint method of target
2719 record_btrace_target::supports_stopped_by_hw_breakpoint ()
2721 if (record_is_replaying (minus_one_ptid))
2724 return this->beneath ()->supports_stopped_by_hw_breakpoint ();
2727 /* The update_thread_list method of target record-btrace. */
2730 record_btrace_target::update_thread_list ()
2732 /* We don't add or remove threads during replay. */
2733 if (record_is_replaying (minus_one_ptid))
2736 /* Forward the request. */
2737 this->beneath ()->update_thread_list ();
2740 /* The thread_alive method of target record-btrace. */
2743 record_btrace_target::thread_alive (ptid_t ptid)
2745 /* We don't add or remove threads during replay. */
2746 if (record_is_replaying (minus_one_ptid))
2749 /* Forward the request. */
2750 return this->beneath ()->thread_alive (ptid);
2753 /* Set the replay branch trace instruction iterator. If IT is NULL, replay
2757 record_btrace_set_replay (struct thread_info *tp,
2758 const struct btrace_insn_iterator *it)
2760 struct btrace_thread_info *btinfo;
2762 btinfo = &tp->btrace;
2765 record_btrace_stop_replaying (tp);
2768 if (btinfo->replay == NULL)
2769 record_btrace_start_replaying (tp);
2770 else if (btrace_insn_cmp (btinfo->replay, it) == 0)
2773 *btinfo->replay = *it;
2774 registers_changed_thread (tp);
2777 /* Start anew from the new replay position. */
2778 record_btrace_clear_histories (btinfo);
2780 inferior_thread ()->suspend.stop_pc
2781 = regcache_read_pc (get_current_regcache ());
2782 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
2785 /* The goto_record_begin method of target record-btrace. */
2788 record_btrace_target::goto_record_begin ()
2790 struct thread_info *tp;
2791 struct btrace_insn_iterator begin;
2793 tp = require_btrace_thread ();
2795 btrace_insn_begin (&begin, &tp->btrace);
2797 /* Skip gaps at the beginning of the trace. */
2798 while (btrace_insn_get (&begin) == NULL)
2802 steps = btrace_insn_next (&begin, 1);
2804 error (_("No trace."));
2807 record_btrace_set_replay (tp, &begin);
2810 /* The goto_record_end method of target record-btrace. */
2813 record_btrace_target::goto_record_end ()
2815 struct thread_info *tp;
2817 tp = require_btrace_thread ();
2819 record_btrace_set_replay (tp, NULL);
2822 /* The goto_record method of target record-btrace. */
2825 record_btrace_target::goto_record (ULONGEST insn)
2827 struct thread_info *tp;
2828 struct btrace_insn_iterator it;
2829 unsigned int number;
2834 /* Check for wrap-arounds. */
2836 error (_("Instruction number out of range."));
2838 tp = require_btrace_thread ();
2840 found = btrace_find_insn_by_number (&it, &tp->btrace, number);
2842 /* Check if the instruction could not be found or is a gap. */
2843 if (found == 0 || btrace_insn_get (&it) == NULL)
2844 error (_("No such instruction."));
2846 record_btrace_set_replay (tp, &it);
2849 /* The record_stop_replaying method of target record-btrace. */
2852 record_btrace_target::record_stop_replaying ()
2854 for (thread_info *tp : all_non_exited_threads ())
2855 record_btrace_stop_replaying (tp);
2858 /* The execution_direction target method. */
2860 enum exec_direction_kind
2861 record_btrace_target::execution_direction ()
2863 return record_btrace_resume_exec_dir;
2866 /* The prepare_to_generate_core target method. */
2869 record_btrace_target::prepare_to_generate_core ()
2871 record_btrace_generating_corefile = 1;
2874 /* The done_generating_core target method. */
2877 record_btrace_target::done_generating_core ()
2879 record_btrace_generating_corefile = 0;
2882 /* Start recording in BTS format. */
2885 cmd_record_btrace_bts_start (const char *args, int from_tty)
2887 if (args != NULL && *args != 0)
2888 error (_("Invalid argument."));
2890 record_btrace_conf.format = BTRACE_FORMAT_BTS;
2894 execute_command ("target record-btrace", from_tty);
2896 catch (const gdb_exception &exception)
2898 record_btrace_conf.format = BTRACE_FORMAT_NONE;
2903 /* Start recording in Intel Processor Trace format. */
2906 cmd_record_btrace_pt_start (const char *args, int from_tty)
2908 if (args != NULL && *args != 0)
2909 error (_("Invalid argument."));
2911 record_btrace_conf.format = BTRACE_FORMAT_PT;
2915 execute_command ("target record-btrace", from_tty);
2917 catch (const gdb_exception &exception)
2919 record_btrace_conf.format = BTRACE_FORMAT_NONE;
2924 /* Alias for "target record". */
2927 cmd_record_btrace_start (const char *args, int from_tty)
2929 if (args != NULL && *args != 0)
2930 error (_("Invalid argument."));
2932 record_btrace_conf.format = BTRACE_FORMAT_PT;
2936 execute_command ("target record-btrace", from_tty);
2938 catch (const gdb_exception &exception)
2940 record_btrace_conf.format = BTRACE_FORMAT_BTS;
2944 execute_command ("target record-btrace", from_tty);
2946 catch (const gdb_exception &ex)
2948 record_btrace_conf.format = BTRACE_FORMAT_NONE;
2954 /* The "set record btrace" command. */
2957 cmd_set_record_btrace (const char *args, int from_tty)
2959 printf_unfiltered (_("\"set record btrace\" must be followed "
2960 "by an appropriate subcommand.\n"));
2961 help_list (set_record_btrace_cmdlist, "set record btrace ",
2962 all_commands, gdb_stdout);
2965 /* The "show record btrace" command. */
2968 cmd_show_record_btrace (const char *args, int from_tty)
2970 cmd_show_list (show_record_btrace_cmdlist, from_tty, "");
2973 /* The "show record btrace replay-memory-access" command. */
2976 cmd_show_replay_memory_access (struct ui_file *file, int from_tty,
2977 struct cmd_list_element *c, const char *value)
2979 fprintf_filtered (gdb_stdout, _("Replay memory access is %s.\n"),
2980 replay_memory_access);
2983 /* The "set record btrace cpu none" command. */
2986 cmd_set_record_btrace_cpu_none (const char *args, int from_tty)
2988 if (args != nullptr && *args != 0)
2989 error (_("Trailing junk: '%s'."), args);
2991 record_btrace_cpu_state = CS_NONE;
2994 /* The "set record btrace cpu auto" command. */
2997 cmd_set_record_btrace_cpu_auto (const char *args, int from_tty)
2999 if (args != nullptr && *args != 0)
3000 error (_("Trailing junk: '%s'."), args);
3002 record_btrace_cpu_state = CS_AUTO;
3005 /* The "set record btrace cpu" command. */
3008 cmd_set_record_btrace_cpu (const char *args, int from_tty)
3010 if (args == nullptr)
3013 /* We use a hard-coded vendor string for now. */
3014 unsigned int family, model, stepping;
3015 int l1, l2, matches = sscanf (args, "intel: %u/%u%n/%u%n", &family,
3016 &model, &l1, &stepping, &l2);
3019 if (strlen (args) != l2)
3020 error (_("Trailing junk: '%s'."), args + l2);
3022 else if (matches == 2)
3024 if (strlen (args) != l1)
3025 error (_("Trailing junk: '%s'."), args + l1);
3030 error (_("Bad format. See \"help set record btrace cpu\"."));
3032 if (USHRT_MAX < family)
3033 error (_("Cpu family too big."));
3035 if (UCHAR_MAX < model)
3036 error (_("Cpu model too big."));
3038 if (UCHAR_MAX < stepping)
3039 error (_("Cpu stepping too big."));
3041 record_btrace_cpu.vendor = CV_INTEL;
3042 record_btrace_cpu.family = family;
3043 record_btrace_cpu.model = model;
3044 record_btrace_cpu.stepping = stepping;
3046 record_btrace_cpu_state = CS_CPU;
3049 /* The "show record btrace cpu" command. */
3052 cmd_show_record_btrace_cpu (const char *args, int from_tty)
3054 if (args != nullptr && *args != 0)
3055 error (_("Trailing junk: '%s'."), args);
3057 switch (record_btrace_cpu_state)
3060 printf_unfiltered (_("btrace cpu is 'auto'.\n"));
3064 printf_unfiltered (_("btrace cpu is 'none'.\n"));
3068 switch (record_btrace_cpu.vendor)
3071 if (record_btrace_cpu.stepping == 0)
3072 printf_unfiltered (_("btrace cpu is 'intel: %u/%u'.\n"),
3073 record_btrace_cpu.family,
3074 record_btrace_cpu.model);
3076 printf_unfiltered (_("btrace cpu is 'intel: %u/%u/%u'.\n"),
3077 record_btrace_cpu.family,
3078 record_btrace_cpu.model,
3079 record_btrace_cpu.stepping);
3084 error (_("Internal error: bad cpu state."));
3087 /* The "s record btrace bts" command. */
3090 cmd_set_record_btrace_bts (const char *args, int from_tty)
3092 printf_unfiltered (_("\"set record btrace bts\" must be followed "
3093 "by an appropriate subcommand.\n"));
3094 help_list (set_record_btrace_bts_cmdlist, "set record btrace bts ",
3095 all_commands, gdb_stdout);
3098 /* The "show record btrace bts" command. */
3101 cmd_show_record_btrace_bts (const char *args, int from_tty)
3103 cmd_show_list (show_record_btrace_bts_cmdlist, from_tty, "");
3106 /* The "set record btrace pt" command. */
3109 cmd_set_record_btrace_pt (const char *args, int from_tty)
3111 printf_unfiltered (_("\"set record btrace pt\" must be followed "
3112 "by an appropriate subcommand.\n"));
3113 help_list (set_record_btrace_pt_cmdlist, "set record btrace pt ",
3114 all_commands, gdb_stdout);
3117 /* The "show record btrace pt" command. */
3120 cmd_show_record_btrace_pt (const char *args, int from_tty)
3122 cmd_show_list (show_record_btrace_pt_cmdlist, from_tty, "");
3125 /* The "record bts buffer-size" show value function. */
3128 show_record_bts_buffer_size_value (struct ui_file *file, int from_tty,
3129 struct cmd_list_element *c,
3132 fprintf_filtered (file, _("The record/replay bts buffer size is %s.\n"),
3136 /* The "record pt buffer-size" show value function. */
3139 show_record_pt_buffer_size_value (struct ui_file *file, int from_tty,
3140 struct cmd_list_element *c,
3143 fprintf_filtered (file, _("The record/replay pt buffer size is %s.\n"),
3147 /* Initialize btrace commands. */
3150 _initialize_record_btrace (void)
3152 add_prefix_cmd ("btrace", class_obscure, cmd_record_btrace_start,
3153 _("Start branch trace recording."), &record_btrace_cmdlist,
3154 "record btrace ", 0, &record_cmdlist);
3155 add_alias_cmd ("b", "btrace", class_obscure, 1, &record_cmdlist);
3157 add_cmd ("bts", class_obscure, cmd_record_btrace_bts_start,
3159 Start branch trace recording in Branch Trace Store (BTS) format.\n\n\
3160 The processor stores a from/to record for each branch into a cyclic buffer.\n\
3161 This format may not be available on all processors."),
3162 &record_btrace_cmdlist);
3163 add_alias_cmd ("bts", "btrace bts", class_obscure, 1, &record_cmdlist);
3165 add_cmd ("pt", class_obscure, cmd_record_btrace_pt_start,
3167 Start branch trace recording in Intel Processor Trace format.\n\n\
3168 This format may not be available on all processors."),
3169 &record_btrace_cmdlist);
3170 add_alias_cmd ("pt", "btrace pt", class_obscure, 1, &record_cmdlist);
3172 add_prefix_cmd ("btrace", class_support, cmd_set_record_btrace,
3173 _("Set record options"), &set_record_btrace_cmdlist,
3174 "set record btrace ", 0, &set_record_cmdlist);
3176 add_prefix_cmd ("btrace", class_support, cmd_show_record_btrace,
3177 _("Show record options"), &show_record_btrace_cmdlist,
3178 "show record btrace ", 0, &show_record_cmdlist);
3180 add_setshow_enum_cmd ("replay-memory-access", no_class,
3181 replay_memory_access_types, &replay_memory_access, _("\
3182 Set what memory accesses are allowed during replay."), _("\
3183 Show what memory accesses are allowed during replay."),
3184 _("Default is READ-ONLY.\n\n\
3185 The btrace record target does not trace data.\n\
3186 The memory therefore corresponds to the live target and not \
3187 to the current replay position.\n\n\
3188 When READ-ONLY, allow accesses to read-only memory during replay.\n\
3189 When READ-WRITE, allow accesses to read-only and read-write memory during \
3191 NULL, cmd_show_replay_memory_access,
3192 &set_record_btrace_cmdlist,
3193 &show_record_btrace_cmdlist);
3195 add_prefix_cmd ("cpu", class_support, cmd_set_record_btrace_cpu,
3197 Set the cpu to be used for trace decode.\n\n\
3198 The format is \"VENDOR:IDENTIFIER\" or \"none\" or \"auto\" (default).\n\
3199 For vendor \"intel\" the format is \"FAMILY/MODEL[/STEPPING]\".\n\n\
3200 When decoding branch trace, enable errata workarounds for the specified cpu.\n\
3201 The default is \"auto\", which uses the cpu on which the trace was recorded.\n\
3202 When GDB does not support that cpu, this option can be used to enable\n\
3203 workarounds for a similar cpu that GDB supports.\n\n\
3204 When set to \"none\", errata workarounds are disabled."),
3205 &set_record_btrace_cpu_cmdlist,
3206 _("set record btrace cpu "), 1,
3207 &set_record_btrace_cmdlist);
3209 add_cmd ("auto", class_support, cmd_set_record_btrace_cpu_auto, _("\
3210 Automatically determine the cpu to be used for trace decode."),
3211 &set_record_btrace_cpu_cmdlist);
3213 add_cmd ("none", class_support, cmd_set_record_btrace_cpu_none, _("\
3214 Do not enable errata workarounds for trace decode."),
3215 &set_record_btrace_cpu_cmdlist);
3217 add_cmd ("cpu", class_support, cmd_show_record_btrace_cpu, _("\
3218 Show the cpu to be used for trace decode."),
3219 &show_record_btrace_cmdlist);
3221 add_prefix_cmd ("bts", class_support, cmd_set_record_btrace_bts,
3222 _("Set record btrace bts options"),
3223 &set_record_btrace_bts_cmdlist,
3224 "set record btrace bts ", 0, &set_record_btrace_cmdlist);
3226 add_prefix_cmd ("bts", class_support, cmd_show_record_btrace_bts,
3227 _("Show record btrace bts options"),
3228 &show_record_btrace_bts_cmdlist,
3229 "show record btrace bts ", 0, &show_record_btrace_cmdlist);
3231 add_setshow_uinteger_cmd ("buffer-size", no_class,
3232 &record_btrace_conf.bts.size,
3233 _("Set the record/replay bts buffer size."),
3234 _("Show the record/replay bts buffer size."), _("\
3235 When starting recording request a trace buffer of this size. \
3236 The actual buffer size may differ from the requested size. \
3237 Use \"info record\" to see the actual buffer size.\n\n\
3238 Bigger buffers allow longer recording but also take more time to process \
3239 the recorded execution trace.\n\n\
3240 The trace buffer size may not be changed while recording."), NULL,
3241 show_record_bts_buffer_size_value,
3242 &set_record_btrace_bts_cmdlist,
3243 &show_record_btrace_bts_cmdlist);
3245 add_prefix_cmd ("pt", class_support, cmd_set_record_btrace_pt,
3246 _("Set record btrace pt options"),
3247 &set_record_btrace_pt_cmdlist,
3248 "set record btrace pt ", 0, &set_record_btrace_cmdlist);
3250 add_prefix_cmd ("pt", class_support, cmd_show_record_btrace_pt,
3251 _("Show record btrace pt options"),
3252 &show_record_btrace_pt_cmdlist,
3253 "show record btrace pt ", 0, &show_record_btrace_cmdlist);
3255 add_setshow_uinteger_cmd ("buffer-size", no_class,
3256 &record_btrace_conf.pt.size,
3257 _("Set the record/replay pt buffer size."),
3258 _("Show the record/replay pt buffer size."), _("\
3259 Bigger buffers allow longer recording but also take more time to process \
3260 the recorded execution.\n\
3261 The actual buffer size may differ from the requested size. Use \"info record\" \
3262 to see the actual buffer size."), NULL, show_record_pt_buffer_size_value,
3263 &set_record_btrace_pt_cmdlist,
3264 &show_record_btrace_pt_cmdlist);
3266 add_target (record_btrace_target_info, record_btrace_target_open);
3268 bfcache = htab_create_alloc (50, bfcache_hash, bfcache_eq, NULL,
3271 record_btrace_conf.bts.size = 64 * 1024;
3272 record_btrace_conf.pt.size = 16 * 1024;