1 /* Branch trace support for GDB, the GNU debugger.
3 Copyright (C) 2013-2018 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"
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 (error, RETURN_MASK_ERROR)
291 warning ("%s", error.message);
296 /* Enable automatic tracing of new threads. */
299 record_btrace_auto_enable (void)
301 DEBUG ("attach thread observer");
303 gdb::observers::new_thread.attach (record_btrace_enable_warn,
304 record_btrace_thread_observer_token);
307 /* Disable automatic tracing of new threads. */
310 record_btrace_auto_disable (void)
312 DEBUG ("detach thread observer");
314 gdb::observers::new_thread.detach (record_btrace_thread_observer_token);
317 /* The record-btrace async event handler function. */
320 record_btrace_handle_async_inferior_event (gdb_client_data data)
322 inferior_event_handler (INF_REG_EVENT, NULL);
325 /* See record-btrace.h. */
328 record_btrace_push_target (void)
332 record_btrace_auto_enable ();
334 push_target (&record_btrace_ops);
336 record_btrace_async_inferior_event_handler
337 = create_async_event_handler (record_btrace_handle_async_inferior_event,
339 record_btrace_generating_corefile = 0;
341 format = btrace_format_short_string (record_btrace_conf.format);
342 gdb::observers::record_changed.notify (current_inferior (), 1, "btrace", format);
345 /* Disable btrace on a set of threads on scope exit. */
347 struct scoped_btrace_disable
349 scoped_btrace_disable () = default;
351 DISABLE_COPY_AND_ASSIGN (scoped_btrace_disable);
353 ~scoped_btrace_disable ()
355 for (thread_info *tp : m_threads)
359 void add_thread (thread_info *thread)
361 m_threads.push_front (thread);
370 std::forward_list<thread_info *> m_threads;
373 /* Open target record-btrace. */
376 record_btrace_target_open (const char *args, int from_tty)
378 /* If we fail to enable btrace for one thread, disable it for the threads for
379 which it was successfully enabled. */
380 scoped_btrace_disable btrace_disable;
386 if (!target_has_execution)
387 error (_("The program is not being run."));
389 for (thread_info *tp : all_non_exited_threads ())
390 if (args == NULL || *args == 0 || number_is_in_list (args, tp->global_num))
392 btrace_enable (tp, &record_btrace_conf);
394 btrace_disable.add_thread (tp);
397 record_btrace_push_target ();
399 btrace_disable.discard ();
402 /* The stop_recording method of target record-btrace. */
405 record_btrace_target::stop_recording ()
407 DEBUG ("stop recording");
409 record_btrace_auto_disable ();
411 for (thread_info *tp : all_non_exited_threads ())
412 if (tp->btrace.target != NULL)
416 /* The disconnect method of target record-btrace. */
419 record_btrace_target::disconnect (const char *args,
422 struct target_ops *beneath = this->beneath ();
424 /* Do not stop recording, just clean up GDB side. */
425 unpush_target (this);
427 /* Forward disconnect. */
428 beneath->disconnect (args, from_tty);
431 /* The close method of target record-btrace. */
434 record_btrace_target::close ()
436 if (record_btrace_async_inferior_event_handler != NULL)
437 delete_async_event_handler (&record_btrace_async_inferior_event_handler);
439 /* Make sure automatic recording gets disabled even if we did not stop
440 recording before closing the record-btrace target. */
441 record_btrace_auto_disable ();
443 /* We should have already stopped recording.
444 Tear down btrace in case we have not. */
445 for (thread_info *tp : all_non_exited_threads ())
446 btrace_teardown (tp);
449 /* The async method of target record-btrace. */
452 record_btrace_target::async (int enable)
455 mark_async_event_handler (record_btrace_async_inferior_event_handler);
457 clear_async_event_handler (record_btrace_async_inferior_event_handler);
459 this->beneath ()->async (enable);
462 /* Adjusts the size and returns a human readable size suffix. */
465 record_btrace_adjust_size (unsigned int *size)
471 if ((sz & ((1u << 30) - 1)) == 0)
476 else if ((sz & ((1u << 20) - 1)) == 0)
481 else if ((sz & ((1u << 10) - 1)) == 0)
490 /* Print a BTS configuration. */
493 record_btrace_print_bts_conf (const struct btrace_config_bts *conf)
501 suffix = record_btrace_adjust_size (&size);
502 printf_unfiltered (_("Buffer size: %u%s.\n"), size, suffix);
506 /* Print an Intel Processor Trace configuration. */
509 record_btrace_print_pt_conf (const struct btrace_config_pt *conf)
517 suffix = record_btrace_adjust_size (&size);
518 printf_unfiltered (_("Buffer size: %u%s.\n"), size, suffix);
522 /* Print a branch tracing configuration. */
525 record_btrace_print_conf (const struct btrace_config *conf)
527 printf_unfiltered (_("Recording format: %s.\n"),
528 btrace_format_string (conf->format));
530 switch (conf->format)
532 case BTRACE_FORMAT_NONE:
535 case BTRACE_FORMAT_BTS:
536 record_btrace_print_bts_conf (&conf->bts);
539 case BTRACE_FORMAT_PT:
540 record_btrace_print_pt_conf (&conf->pt);
544 internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
547 /* The info_record method of target record-btrace. */
550 record_btrace_target::info_record ()
552 struct btrace_thread_info *btinfo;
553 const struct btrace_config *conf;
554 struct thread_info *tp;
555 unsigned int insns, calls, gaps;
559 tp = find_thread_ptid (inferior_ptid);
561 error (_("No thread."));
563 validate_registers_access ();
565 btinfo = &tp->btrace;
567 conf = ::btrace_conf (btinfo);
569 record_btrace_print_conf (conf);
571 btrace_fetch (tp, record_btrace_get_cpu ());
577 if (!btrace_is_empty (tp))
579 struct btrace_call_iterator call;
580 struct btrace_insn_iterator insn;
582 btrace_call_end (&call, btinfo);
583 btrace_call_prev (&call, 1);
584 calls = btrace_call_number (&call);
586 btrace_insn_end (&insn, btinfo);
587 insns = btrace_insn_number (&insn);
589 /* If the last instruction is not a gap, it is the current instruction
590 that is not actually part of the record. */
591 if (btrace_insn_get (&insn) != NULL)
594 gaps = btinfo->ngaps;
597 printf_unfiltered (_("Recorded %u instructions in %u functions (%u gaps) "
598 "for thread %s (%s).\n"), insns, calls, gaps,
599 print_thread_id (tp), target_pid_to_str (tp->ptid));
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)));
1095 btrace_compute_src_line_range (bfun, &begin, &end);
1100 uiout->field_int ("min line", begin);
1106 uiout->field_int ("max line", end);
1109 /* Get the name of a branch trace function. */
1112 btrace_get_bfun_name (const struct btrace_function *bfun)
1114 struct minimal_symbol *msym;
1124 return SYMBOL_PRINT_NAME (sym);
1125 else if (msym != NULL)
1126 return MSYMBOL_PRINT_NAME (msym);
1131 /* Disassemble a section of the recorded function trace. */
1134 btrace_call_history (struct ui_out *uiout,
1135 const struct btrace_thread_info *btinfo,
1136 const struct btrace_call_iterator *begin,
1137 const struct btrace_call_iterator *end,
1140 struct btrace_call_iterator it;
1141 record_print_flags flags = (enum record_print_flag) int_flags;
1143 DEBUG ("ftrace (0x%x): [%u; %u)", int_flags, btrace_call_number (begin),
1144 btrace_call_number (end));
1146 for (it = *begin; btrace_call_cmp (&it, end) < 0; btrace_call_next (&it, 1))
1148 const struct btrace_function *bfun;
1149 struct minimal_symbol *msym;
1152 bfun = btrace_call_get (&it);
1156 /* Print the function index. */
1157 ui_out_field_uint (uiout, "index", bfun->number);
1160 /* Indicate gaps in the trace. */
1161 if (bfun->errcode != 0)
1163 const struct btrace_config *conf;
1165 conf = btrace_conf (btinfo);
1167 /* We have trace so we must have a configuration. */
1168 gdb_assert (conf != NULL);
1170 btrace_ui_out_decode_error (uiout, bfun->errcode, conf->format);
1175 if ((flags & RECORD_PRINT_INDENT_CALLS) != 0)
1177 int level = bfun->level + btinfo->level, i;
1179 for (i = 0; i < level; ++i)
1184 uiout->field_string ("function", SYMBOL_PRINT_NAME (sym));
1185 else if (msym != NULL)
1186 uiout->field_string ("function", MSYMBOL_PRINT_NAME (msym));
1187 else if (!uiout->is_mi_like_p ())
1188 uiout->field_string ("function", "??");
1190 if ((flags & RECORD_PRINT_INSN_RANGE) != 0)
1192 uiout->text (_("\tinst "));
1193 btrace_call_history_insn_range (uiout, bfun);
1196 if ((flags & RECORD_PRINT_SRC_LINE) != 0)
1198 uiout->text (_("\tat "));
1199 btrace_call_history_src_line (uiout, bfun);
1206 /* The call_history method of target record-btrace. */
1209 record_btrace_target::call_history (int size, record_print_flags flags)
1211 struct btrace_thread_info *btinfo;
1212 struct btrace_call_history *history;
1213 struct btrace_call_iterator begin, end;
1214 struct ui_out *uiout;
1215 unsigned int context, covered;
1217 uiout = current_uiout;
1218 ui_out_emit_tuple tuple_emitter (uiout, "insn history");
1219 context = abs (size);
1221 error (_("Bad record function-call-history-size."));
1223 btinfo = require_btrace ();
1224 history = btinfo->call_history;
1225 if (history == NULL)
1227 struct btrace_insn_iterator *replay;
1229 DEBUG ("call-history (0x%x): %d", (int) flags, size);
1231 /* If we're replaying, we start at the replay position. Otherwise, we
1232 start at the tail of the trace. */
1233 replay = btinfo->replay;
1236 begin.btinfo = btinfo;
1237 begin.index = replay->call_index;
1240 btrace_call_end (&begin, btinfo);
1242 /* We start from here and expand in the requested direction. Then we
1243 expand in the other direction, as well, to fill up any remaining
1248 /* We want the current position covered, as well. */
1249 covered = btrace_call_next (&end, 1);
1250 covered += btrace_call_prev (&begin, context - covered);
1251 covered += btrace_call_next (&end, context - covered);
1255 covered = btrace_call_next (&end, context);
1256 covered += btrace_call_prev (&begin, context- covered);
1261 begin = history->begin;
1264 DEBUG ("call-history (0x%x): %d, prev: [%u; %u)", (int) flags, size,
1265 btrace_call_number (&begin), btrace_call_number (&end));
1270 covered = btrace_call_prev (&begin, context);
1275 covered = btrace_call_next (&end, context);
1280 btrace_call_history (uiout, btinfo, &begin, &end, flags);
1284 printf_unfiltered (_("At the start of the branch trace record.\n"));
1286 printf_unfiltered (_("At the end of the branch trace record.\n"));
1289 btrace_set_call_history (btinfo, &begin, &end);
1292 /* The call_history_range method of target record-btrace. */
1295 record_btrace_target::call_history_range (ULONGEST from, ULONGEST to,
1296 record_print_flags flags)
1298 struct btrace_thread_info *btinfo;
1299 struct btrace_call_iterator begin, end;
1300 struct ui_out *uiout;
1301 unsigned int low, high;
1304 uiout = current_uiout;
1305 ui_out_emit_tuple tuple_emitter (uiout, "func history");
1309 DEBUG ("call-history (0x%x): [%u; %u)", (int) flags, low, high);
1311 /* Check for wrap-arounds. */
1312 if (low != from || high != to)
1313 error (_("Bad range."));
1316 error (_("Bad range."));
1318 btinfo = require_btrace ();
1320 found = btrace_find_call_by_number (&begin, btinfo, low);
1322 error (_("Range out of bounds."));
1324 found = btrace_find_call_by_number (&end, btinfo, high);
1327 /* Silently truncate the range. */
1328 btrace_call_end (&end, btinfo);
1332 /* We want both begin and end to be inclusive. */
1333 btrace_call_next (&end, 1);
1336 btrace_call_history (uiout, btinfo, &begin, &end, flags);
1337 btrace_set_call_history (btinfo, &begin, &end);
1340 /* The call_history_from method of target record-btrace. */
1343 record_btrace_target::call_history_from (ULONGEST from, int size,
1344 record_print_flags flags)
1346 ULONGEST begin, end, context;
1348 context = abs (size);
1350 error (_("Bad record function-call-history-size."));
1359 begin = from - context + 1;
1364 end = from + context - 1;
1366 /* Check for wrap-around. */
1371 call_history_range ( begin, end, flags);
1374 /* The record_method method of target record-btrace. */
1377 record_btrace_target::record_method (ptid_t ptid)
1379 struct thread_info * const tp = find_thread_ptid (ptid);
1382 error (_("No thread."));
1384 if (tp->btrace.target == NULL)
1385 return RECORD_METHOD_NONE;
1387 return RECORD_METHOD_BTRACE;
1390 /* The record_is_replaying method of target record-btrace. */
1393 record_btrace_target::record_is_replaying (ptid_t ptid)
1395 for (thread_info *tp : all_non_exited_threads (ptid))
1396 if (btrace_is_replaying (tp))
1402 /* The record_will_replay method of target record-btrace. */
1405 record_btrace_target::record_will_replay (ptid_t ptid, int dir)
1407 return dir == EXEC_REVERSE || record_is_replaying (ptid);
1410 /* The xfer_partial method of target record-btrace. */
1412 enum target_xfer_status
1413 record_btrace_target::xfer_partial (enum target_object object,
1414 const char *annex, gdb_byte *readbuf,
1415 const gdb_byte *writebuf, ULONGEST offset,
1416 ULONGEST len, ULONGEST *xfered_len)
1418 /* Filter out requests that don't make sense during replay. */
1419 if (replay_memory_access == replay_memory_access_read_only
1420 && !record_btrace_generating_corefile
1421 && record_is_replaying (inferior_ptid))
1425 case TARGET_OBJECT_MEMORY:
1427 struct target_section *section;
1429 /* We do not allow writing memory in general. */
1430 if (writebuf != NULL)
1433 return TARGET_XFER_UNAVAILABLE;
1436 /* We allow reading readonly memory. */
1437 section = target_section_by_addr (this, offset);
1438 if (section != NULL)
1440 /* Check if the section we found is readonly. */
1441 if ((bfd_get_section_flags (section->the_bfd_section->owner,
1442 section->the_bfd_section)
1443 & SEC_READONLY) != 0)
1445 /* Truncate the request to fit into this section. */
1446 len = std::min (len, section->endaddr - offset);
1452 return TARGET_XFER_UNAVAILABLE;
1457 /* Forward the request. */
1458 return this->beneath ()->xfer_partial (object, annex, readbuf, writebuf,
1459 offset, len, xfered_len);
1462 /* The insert_breakpoint method of target record-btrace. */
1465 record_btrace_target::insert_breakpoint (struct gdbarch *gdbarch,
1466 struct bp_target_info *bp_tgt)
1471 /* Inserting breakpoints requires accessing memory. Allow it for the
1472 duration of this function. */
1473 old = replay_memory_access;
1474 replay_memory_access = replay_memory_access_read_write;
1479 ret = this->beneath ()->insert_breakpoint (gdbarch, bp_tgt);
1481 CATCH (except, RETURN_MASK_ALL)
1483 replay_memory_access = old;
1484 throw_exception (except);
1487 replay_memory_access = old;
1492 /* The remove_breakpoint method of target record-btrace. */
1495 record_btrace_target::remove_breakpoint (struct gdbarch *gdbarch,
1496 struct bp_target_info *bp_tgt,
1497 enum remove_bp_reason reason)
1502 /* Removing breakpoints requires accessing memory. Allow it for the
1503 duration of this function. */
1504 old = replay_memory_access;
1505 replay_memory_access = replay_memory_access_read_write;
1510 ret = this->beneath ()->remove_breakpoint (gdbarch, bp_tgt, reason);
1512 CATCH (except, RETURN_MASK_ALL)
1514 replay_memory_access = old;
1515 throw_exception (except);
1518 replay_memory_access = old;
1523 /* The fetch_registers method of target record-btrace. */
1526 record_btrace_target::fetch_registers (struct regcache *regcache, int regno)
1528 struct btrace_insn_iterator *replay;
1529 struct thread_info *tp;
1531 tp = find_thread_ptid (regcache->ptid ());
1532 gdb_assert (tp != NULL);
1534 replay = tp->btrace.replay;
1535 if (replay != NULL && !record_btrace_generating_corefile)
1537 const struct btrace_insn *insn;
1538 struct gdbarch *gdbarch;
1541 gdbarch = regcache->arch ();
1542 pcreg = gdbarch_pc_regnum (gdbarch);
1546 /* We can only provide the PC register. */
1547 if (regno >= 0 && regno != pcreg)
1550 insn = btrace_insn_get (replay);
1551 gdb_assert (insn != NULL);
1553 regcache->raw_supply (regno, &insn->pc);
1556 this->beneath ()->fetch_registers (regcache, regno);
1559 /* The store_registers method of target record-btrace. */
1562 record_btrace_target::store_registers (struct regcache *regcache, int regno)
1564 if (!record_btrace_generating_corefile
1565 && record_is_replaying (regcache->ptid ()))
1566 error (_("Cannot write registers while replaying."));
1568 gdb_assert (may_write_registers != 0);
1570 this->beneath ()->store_registers (regcache, regno);
1573 /* The prepare_to_store method of target record-btrace. */
1576 record_btrace_target::prepare_to_store (struct regcache *regcache)
1578 if (!record_btrace_generating_corefile
1579 && record_is_replaying (regcache->ptid ()))
1582 this->beneath ()->prepare_to_store (regcache);
1585 /* The branch trace frame cache. */
1587 struct btrace_frame_cache
1590 struct thread_info *tp;
1592 /* The frame info. */
1593 struct frame_info *frame;
1595 /* The branch trace function segment. */
1596 const struct btrace_function *bfun;
1599 /* A struct btrace_frame_cache hash table indexed by NEXT. */
1601 static htab_t bfcache;
1603 /* hash_f for htab_create_alloc of bfcache. */
1606 bfcache_hash (const void *arg)
1608 const struct btrace_frame_cache *cache
1609 = (const struct btrace_frame_cache *) arg;
1611 return htab_hash_pointer (cache->frame);
1614 /* eq_f for htab_create_alloc of bfcache. */
1617 bfcache_eq (const void *arg1, const void *arg2)
1619 const struct btrace_frame_cache *cache1
1620 = (const struct btrace_frame_cache *) arg1;
1621 const struct btrace_frame_cache *cache2
1622 = (const struct btrace_frame_cache *) arg2;
1624 return cache1->frame == cache2->frame;
1627 /* Create a new btrace frame cache. */
1629 static struct btrace_frame_cache *
1630 bfcache_new (struct frame_info *frame)
1632 struct btrace_frame_cache *cache;
1635 cache = FRAME_OBSTACK_ZALLOC (struct btrace_frame_cache);
1636 cache->frame = frame;
1638 slot = htab_find_slot (bfcache, cache, INSERT);
1639 gdb_assert (*slot == NULL);
1645 /* Extract the branch trace function from a branch trace frame. */
1647 static const struct btrace_function *
1648 btrace_get_frame_function (struct frame_info *frame)
1650 const struct btrace_frame_cache *cache;
1651 struct btrace_frame_cache pattern;
1654 pattern.frame = frame;
1656 slot = htab_find_slot (bfcache, &pattern, NO_INSERT);
1660 cache = (const struct btrace_frame_cache *) *slot;
1664 /* Implement stop_reason method for record_btrace_frame_unwind. */
1666 static enum unwind_stop_reason
1667 record_btrace_frame_unwind_stop_reason (struct frame_info *this_frame,
1670 const struct btrace_frame_cache *cache;
1671 const struct btrace_function *bfun;
1673 cache = (const struct btrace_frame_cache *) *this_cache;
1675 gdb_assert (bfun != NULL);
1678 return UNWIND_UNAVAILABLE;
1680 return UNWIND_NO_REASON;
1683 /* Implement this_id method for record_btrace_frame_unwind. */
1686 record_btrace_frame_this_id (struct frame_info *this_frame, void **this_cache,
1687 struct frame_id *this_id)
1689 const struct btrace_frame_cache *cache;
1690 const struct btrace_function *bfun;
1691 struct btrace_call_iterator it;
1692 CORE_ADDR code, special;
1694 cache = (const struct btrace_frame_cache *) *this_cache;
1697 gdb_assert (bfun != NULL);
1699 while (btrace_find_call_by_number (&it, &cache->tp->btrace, bfun->prev) != 0)
1700 bfun = btrace_call_get (&it);
1702 code = get_frame_func (this_frame);
1703 special = bfun->number;
1705 *this_id = frame_id_build_unavailable_stack_special (code, special);
1707 DEBUG ("[frame] %s id: (!stack, pc=%s, special=%s)",
1708 btrace_get_bfun_name (cache->bfun),
1709 core_addr_to_string_nz (this_id->code_addr),
1710 core_addr_to_string_nz (this_id->special_addr));
1713 /* Implement prev_register method for record_btrace_frame_unwind. */
1715 static struct value *
1716 record_btrace_frame_prev_register (struct frame_info *this_frame,
1720 const struct btrace_frame_cache *cache;
1721 const struct btrace_function *bfun, *caller;
1722 struct btrace_call_iterator it;
1723 struct gdbarch *gdbarch;
1727 gdbarch = get_frame_arch (this_frame);
1728 pcreg = gdbarch_pc_regnum (gdbarch);
1729 if (pcreg < 0 || regnum != pcreg)
1730 throw_error (NOT_AVAILABLE_ERROR,
1731 _("Registers are not available in btrace record history"));
1733 cache = (const struct btrace_frame_cache *) *this_cache;
1735 gdb_assert (bfun != NULL);
1737 if (btrace_find_call_by_number (&it, &cache->tp->btrace, bfun->up) == 0)
1738 throw_error (NOT_AVAILABLE_ERROR,
1739 _("No caller in btrace record history"));
1741 caller = btrace_call_get (&it);
1743 if ((bfun->flags & BFUN_UP_LINKS_TO_RET) != 0)
1744 pc = caller->insn.front ().pc;
1747 pc = caller->insn.back ().pc;
1748 pc += gdb_insn_length (gdbarch, pc);
1751 DEBUG ("[frame] unwound PC in %s on level %d: %s",
1752 btrace_get_bfun_name (bfun), bfun->level,
1753 core_addr_to_string_nz (pc));
1755 return frame_unwind_got_address (this_frame, regnum, pc);
1758 /* Implement sniffer method for record_btrace_frame_unwind. */
1761 record_btrace_frame_sniffer (const struct frame_unwind *self,
1762 struct frame_info *this_frame,
1765 const struct btrace_function *bfun;
1766 struct btrace_frame_cache *cache;
1767 struct thread_info *tp;
1768 struct frame_info *next;
1770 /* THIS_FRAME does not contain a reference to its thread. */
1771 tp = inferior_thread ();
1774 next = get_next_frame (this_frame);
1777 const struct btrace_insn_iterator *replay;
1779 replay = tp->btrace.replay;
1781 bfun = &replay->btinfo->functions[replay->call_index];
1785 const struct btrace_function *callee;
1786 struct btrace_call_iterator it;
1788 callee = btrace_get_frame_function (next);
1789 if (callee == NULL || (callee->flags & BFUN_UP_LINKS_TO_TAILCALL) != 0)
1792 if (btrace_find_call_by_number (&it, &tp->btrace, callee->up) == 0)
1795 bfun = btrace_call_get (&it);
1801 DEBUG ("[frame] sniffed frame for %s on level %d",
1802 btrace_get_bfun_name (bfun), bfun->level);
1804 /* This is our frame. Initialize the frame cache. */
1805 cache = bfcache_new (this_frame);
1809 *this_cache = cache;
1813 /* Implement sniffer method for record_btrace_tailcall_frame_unwind. */
1816 record_btrace_tailcall_frame_sniffer (const struct frame_unwind *self,
1817 struct frame_info *this_frame,
1820 const struct btrace_function *bfun, *callee;
1821 struct btrace_frame_cache *cache;
1822 struct btrace_call_iterator it;
1823 struct frame_info *next;
1824 struct thread_info *tinfo;
1826 next = get_next_frame (this_frame);
1830 callee = btrace_get_frame_function (next);
1834 if ((callee->flags & BFUN_UP_LINKS_TO_TAILCALL) == 0)
1837 tinfo = inferior_thread ();
1838 if (btrace_find_call_by_number (&it, &tinfo->btrace, callee->up) == 0)
1841 bfun = btrace_call_get (&it);
1843 DEBUG ("[frame] sniffed tailcall frame for %s on level %d",
1844 btrace_get_bfun_name (bfun), bfun->level);
1846 /* This is our frame. Initialize the frame cache. */
1847 cache = bfcache_new (this_frame);
1851 *this_cache = cache;
1856 record_btrace_frame_dealloc_cache (struct frame_info *self, void *this_cache)
1858 struct btrace_frame_cache *cache;
1861 cache = (struct btrace_frame_cache *) this_cache;
1863 slot = htab_find_slot (bfcache, cache, NO_INSERT);
1864 gdb_assert (slot != NULL);
1866 htab_remove_elt (bfcache, cache);
1869 /* btrace recording does not store previous memory content, neither the stack
1870 frames content. Any unwinding would return errorneous results as the stack
1871 contents no longer matches the changed PC value restored from history.
1872 Therefore this unwinder reports any possibly unwound registers as
1875 const struct frame_unwind record_btrace_frame_unwind =
1878 record_btrace_frame_unwind_stop_reason,
1879 record_btrace_frame_this_id,
1880 record_btrace_frame_prev_register,
1882 record_btrace_frame_sniffer,
1883 record_btrace_frame_dealloc_cache
1886 const struct frame_unwind record_btrace_tailcall_frame_unwind =
1889 record_btrace_frame_unwind_stop_reason,
1890 record_btrace_frame_this_id,
1891 record_btrace_frame_prev_register,
1893 record_btrace_tailcall_frame_sniffer,
1894 record_btrace_frame_dealloc_cache
1897 /* Implement the get_unwinder method. */
1899 const struct frame_unwind *
1900 record_btrace_target::get_unwinder ()
1902 return &record_btrace_frame_unwind;
1905 /* Implement the get_tailcall_unwinder method. */
1907 const struct frame_unwind *
1908 record_btrace_target::get_tailcall_unwinder ()
1910 return &record_btrace_tailcall_frame_unwind;
1913 /* Return a human-readable string for FLAG. */
1916 btrace_thread_flag_to_str (enum btrace_thread_flag flag)
1924 return "reverse-step";
1930 return "reverse-cont";
1939 /* Indicate that TP should be resumed according to FLAG. */
1942 record_btrace_resume_thread (struct thread_info *tp,
1943 enum btrace_thread_flag flag)
1945 struct btrace_thread_info *btinfo;
1947 DEBUG ("resuming thread %s (%s): %x (%s)", print_thread_id (tp),
1948 target_pid_to_str (tp->ptid), flag, btrace_thread_flag_to_str (flag));
1950 btinfo = &tp->btrace;
1952 /* Fetch the latest branch trace. */
1953 btrace_fetch (tp, record_btrace_get_cpu ());
1955 /* A resume request overwrites a preceding resume or stop request. */
1956 btinfo->flags &= ~(BTHR_MOVE | BTHR_STOP);
1957 btinfo->flags |= flag;
1960 /* Get the current frame for TP. */
1962 static struct frame_id
1963 get_thread_current_frame_id (struct thread_info *tp)
1968 /* Set current thread, which is implicitly used by
1969 get_current_frame. */
1970 scoped_restore_current_thread restore_thread;
1972 switch_to_thread (tp);
1974 /* Clear the executing flag to allow changes to the current frame.
1975 We are not actually running, yet. We just started a reverse execution
1976 command or a record goto command.
1977 For the latter, EXECUTING is false and this has no effect.
1978 For the former, EXECUTING is true and we're in wait, about to
1979 move the thread. Since we need to recompute the stack, we temporarily
1980 set EXECUTING to flase. */
1981 executing = tp->executing;
1982 set_executing (inferior_ptid, false);
1987 id = get_frame_id (get_current_frame ());
1989 CATCH (except, RETURN_MASK_ALL)
1991 /* Restore the previous execution state. */
1992 set_executing (inferior_ptid, executing);
1994 throw_exception (except);
1998 /* Restore the previous execution state. */
1999 set_executing (inferior_ptid, executing);
2004 /* Start replaying a thread. */
2006 static struct btrace_insn_iterator *
2007 record_btrace_start_replaying (struct thread_info *tp)
2009 struct btrace_insn_iterator *replay;
2010 struct btrace_thread_info *btinfo;
2012 btinfo = &tp->btrace;
2015 /* We can't start replaying without trace. */
2016 if (btinfo->functions.empty ())
2019 /* GDB stores the current frame_id when stepping in order to detects steps
2021 Since frames are computed differently when we're replaying, we need to
2022 recompute those stored frames and fix them up so we can still detect
2023 subroutines after we started replaying. */
2026 struct frame_id frame_id;
2027 int upd_step_frame_id, upd_step_stack_frame_id;
2029 /* The current frame without replaying - computed via normal unwind. */
2030 frame_id = get_thread_current_frame_id (tp);
2032 /* Check if we need to update any stepping-related frame id's. */
2033 upd_step_frame_id = frame_id_eq (frame_id,
2034 tp->control.step_frame_id);
2035 upd_step_stack_frame_id = frame_id_eq (frame_id,
2036 tp->control.step_stack_frame_id);
2038 /* We start replaying at the end of the branch trace. This corresponds
2039 to the current instruction. */
2040 replay = XNEW (struct btrace_insn_iterator);
2041 btrace_insn_end (replay, btinfo);
2043 /* Skip gaps at the end of the trace. */
2044 while (btrace_insn_get (replay) == NULL)
2048 steps = btrace_insn_prev (replay, 1);
2050 error (_("No trace."));
2053 /* We're not replaying, yet. */
2054 gdb_assert (btinfo->replay == NULL);
2055 btinfo->replay = replay;
2057 /* Make sure we're not using any stale registers. */
2058 registers_changed_thread (tp);
2060 /* The current frame with replaying - computed via btrace unwind. */
2061 frame_id = get_thread_current_frame_id (tp);
2063 /* Replace stepping related frames where necessary. */
2064 if (upd_step_frame_id)
2065 tp->control.step_frame_id = frame_id;
2066 if (upd_step_stack_frame_id)
2067 tp->control.step_stack_frame_id = frame_id;
2069 CATCH (except, RETURN_MASK_ALL)
2071 xfree (btinfo->replay);
2072 btinfo->replay = NULL;
2074 registers_changed_thread (tp);
2076 throw_exception (except);
2083 /* Stop replaying a thread. */
2086 record_btrace_stop_replaying (struct thread_info *tp)
2088 struct btrace_thread_info *btinfo;
2090 btinfo = &tp->btrace;
2092 xfree (btinfo->replay);
2093 btinfo->replay = NULL;
2095 /* Make sure we're not leaving any stale registers. */
2096 registers_changed_thread (tp);
2099 /* Stop replaying TP if it is at the end of its execution history. */
2102 record_btrace_stop_replaying_at_end (struct thread_info *tp)
2104 struct btrace_insn_iterator *replay, end;
2105 struct btrace_thread_info *btinfo;
2107 btinfo = &tp->btrace;
2108 replay = btinfo->replay;
2113 btrace_insn_end (&end, btinfo);
2115 if (btrace_insn_cmp (replay, &end) == 0)
2116 record_btrace_stop_replaying (tp);
2119 /* The resume method of target record-btrace. */
2122 record_btrace_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
2124 enum btrace_thread_flag flag, cflag;
2126 DEBUG ("resume %s: %s%s", target_pid_to_str (ptid),
2127 ::execution_direction == EXEC_REVERSE ? "reverse-" : "",
2128 step ? "step" : "cont");
2130 /* Store the execution direction of the last resume.
2132 If there is more than one resume call, we have to rely on infrun
2133 to not change the execution direction in-between. */
2134 record_btrace_resume_exec_dir = ::execution_direction;
2136 /* As long as we're not replaying, just forward the request.
2138 For non-stop targets this means that no thread is replaying. In order to
2139 make progress, we may need to explicitly move replaying threads to the end
2140 of their execution history. */
2141 if ((::execution_direction != EXEC_REVERSE)
2142 && !record_is_replaying (minus_one_ptid))
2144 this->beneath ()->resume (ptid, step, signal);
2148 /* Compute the btrace thread flag for the requested move. */
2149 if (::execution_direction == EXEC_REVERSE)
2151 flag = step == 0 ? BTHR_RCONT : BTHR_RSTEP;
2156 flag = step == 0 ? BTHR_CONT : BTHR_STEP;
2160 /* We just indicate the resume intent here. The actual stepping happens in
2161 record_btrace_wait below.
2163 For all-stop targets, we only step INFERIOR_PTID and continue others. */
2164 if (!target_is_non_stop_p ())
2166 gdb_assert (inferior_ptid.matches (ptid));
2168 for (thread_info *tp : all_non_exited_threads (ptid))
2170 if (tp->ptid.matches (inferior_ptid))
2171 record_btrace_resume_thread (tp, flag);
2173 record_btrace_resume_thread (tp, cflag);
2178 for (thread_info *tp : all_non_exited_threads (ptid))
2179 record_btrace_resume_thread (tp, flag);
2182 /* Async support. */
2183 if (target_can_async_p ())
2186 mark_async_event_handler (record_btrace_async_inferior_event_handler);
2190 /* The commit_resume method of target record-btrace. */
2193 record_btrace_target::commit_resume ()
2195 if ((::execution_direction != EXEC_REVERSE)
2196 && !record_is_replaying (minus_one_ptid))
2197 beneath ()->commit_resume ();
2200 /* Cancel resuming TP. */
2203 record_btrace_cancel_resume (struct thread_info *tp)
2205 enum btrace_thread_flag flags;
2207 flags = tp->btrace.flags & (BTHR_MOVE | BTHR_STOP);
2211 DEBUG ("cancel resume thread %s (%s): %x (%s)",
2212 print_thread_id (tp),
2213 target_pid_to_str (tp->ptid), flags,
2214 btrace_thread_flag_to_str (flags));
2216 tp->btrace.flags &= ~(BTHR_MOVE | BTHR_STOP);
2217 record_btrace_stop_replaying_at_end (tp);
2220 /* Return a target_waitstatus indicating that we ran out of history. */
2222 static struct target_waitstatus
2223 btrace_step_no_history (void)
2225 struct target_waitstatus status;
2227 status.kind = TARGET_WAITKIND_NO_HISTORY;
2232 /* Return a target_waitstatus indicating that a step finished. */
2234 static struct target_waitstatus
2235 btrace_step_stopped (void)
2237 struct target_waitstatus status;
2239 status.kind = TARGET_WAITKIND_STOPPED;
2240 status.value.sig = GDB_SIGNAL_TRAP;
2245 /* Return a target_waitstatus indicating that a thread was stopped as
2248 static struct target_waitstatus
2249 btrace_step_stopped_on_request (void)
2251 struct target_waitstatus status;
2253 status.kind = TARGET_WAITKIND_STOPPED;
2254 status.value.sig = GDB_SIGNAL_0;
2259 /* Return a target_waitstatus indicating a spurious stop. */
2261 static struct target_waitstatus
2262 btrace_step_spurious (void)
2264 struct target_waitstatus status;
2266 status.kind = TARGET_WAITKIND_SPURIOUS;
2271 /* Return a target_waitstatus indicating that the thread was not resumed. */
2273 static struct target_waitstatus
2274 btrace_step_no_resumed (void)
2276 struct target_waitstatus status;
2278 status.kind = TARGET_WAITKIND_NO_RESUMED;
2283 /* Return a target_waitstatus indicating that we should wait again. */
2285 static struct target_waitstatus
2286 btrace_step_again (void)
2288 struct target_waitstatus status;
2290 status.kind = TARGET_WAITKIND_IGNORE;
2295 /* Clear the record histories. */
2298 record_btrace_clear_histories (struct btrace_thread_info *btinfo)
2300 xfree (btinfo->insn_history);
2301 xfree (btinfo->call_history);
2303 btinfo->insn_history = NULL;
2304 btinfo->call_history = NULL;
2307 /* Check whether TP's current replay position is at a breakpoint. */
2310 record_btrace_replay_at_breakpoint (struct thread_info *tp)
2312 struct btrace_insn_iterator *replay;
2313 struct btrace_thread_info *btinfo;
2314 const struct btrace_insn *insn;
2316 btinfo = &tp->btrace;
2317 replay = btinfo->replay;
2322 insn = btrace_insn_get (replay);
2326 return record_check_stopped_by_breakpoint (tp->inf->aspace, insn->pc,
2327 &btinfo->stop_reason);
2330 /* Step one instruction in forward direction. */
2332 static struct target_waitstatus
2333 record_btrace_single_step_forward (struct thread_info *tp)
2335 struct btrace_insn_iterator *replay, end, start;
2336 struct btrace_thread_info *btinfo;
2338 btinfo = &tp->btrace;
2339 replay = btinfo->replay;
2341 /* We're done if we're not replaying. */
2343 return btrace_step_no_history ();
2345 /* Check if we're stepping a breakpoint. */
2346 if (record_btrace_replay_at_breakpoint (tp))
2347 return btrace_step_stopped ();
2349 /* Skip gaps during replay. If we end up at a gap (at the end of the trace),
2350 jump back to the instruction at which we started. */
2356 /* We will bail out here if we continue stepping after reaching the end
2357 of the execution history. */
2358 steps = btrace_insn_next (replay, 1);
2362 return btrace_step_no_history ();
2365 while (btrace_insn_get (replay) == NULL);
2367 /* Determine the end of the instruction trace. */
2368 btrace_insn_end (&end, btinfo);
2370 /* The execution trace contains (and ends with) the current instruction.
2371 This instruction has not been executed, yet, so the trace really ends
2372 one instruction earlier. */
2373 if (btrace_insn_cmp (replay, &end) == 0)
2374 return btrace_step_no_history ();
2376 return btrace_step_spurious ();
2379 /* Step one instruction in backward direction. */
2381 static struct target_waitstatus
2382 record_btrace_single_step_backward (struct thread_info *tp)
2384 struct btrace_insn_iterator *replay, start;
2385 struct btrace_thread_info *btinfo;
2387 btinfo = &tp->btrace;
2388 replay = btinfo->replay;
2390 /* Start replaying if we're not already doing so. */
2392 replay = record_btrace_start_replaying (tp);
2394 /* If we can't step any further, we reached the end of the history.
2395 Skip gaps during replay. If we end up at a gap (at the beginning of
2396 the trace), jump back to the instruction at which we started. */
2402 steps = btrace_insn_prev (replay, 1);
2406 return btrace_step_no_history ();
2409 while (btrace_insn_get (replay) == NULL);
2411 /* Check if we're stepping a breakpoint.
2413 For reverse-stepping, this check is after the step. There is logic in
2414 infrun.c that handles reverse-stepping separately. See, for example,
2415 proceed and adjust_pc_after_break.
2417 This code assumes that for reverse-stepping, PC points to the last
2418 de-executed instruction, whereas for forward-stepping PC points to the
2419 next to-be-executed instruction. */
2420 if (record_btrace_replay_at_breakpoint (tp))
2421 return btrace_step_stopped ();
2423 return btrace_step_spurious ();
2426 /* Step a single thread. */
2428 static struct target_waitstatus
2429 record_btrace_step_thread (struct thread_info *tp)
2431 struct btrace_thread_info *btinfo;
2432 struct target_waitstatus status;
2433 enum btrace_thread_flag flags;
2435 btinfo = &tp->btrace;
2437 flags = btinfo->flags & (BTHR_MOVE | BTHR_STOP);
2438 btinfo->flags &= ~(BTHR_MOVE | BTHR_STOP);
2440 DEBUG ("stepping thread %s (%s): %x (%s)", print_thread_id (tp),
2441 target_pid_to_str (tp->ptid), flags,
2442 btrace_thread_flag_to_str (flags));
2444 /* We can't step without an execution history. */
2445 if ((flags & BTHR_MOVE) != 0 && btrace_is_empty (tp))
2446 return btrace_step_no_history ();
2451 internal_error (__FILE__, __LINE__, _("invalid stepping type."));
2454 return btrace_step_stopped_on_request ();
2457 status = record_btrace_single_step_forward (tp);
2458 if (status.kind != TARGET_WAITKIND_SPURIOUS)
2461 return btrace_step_stopped ();
2464 status = record_btrace_single_step_backward (tp);
2465 if (status.kind != TARGET_WAITKIND_SPURIOUS)
2468 return btrace_step_stopped ();
2471 status = record_btrace_single_step_forward (tp);
2472 if (status.kind != TARGET_WAITKIND_SPURIOUS)
2475 btinfo->flags |= flags;
2476 return btrace_step_again ();
2479 status = record_btrace_single_step_backward (tp);
2480 if (status.kind != TARGET_WAITKIND_SPURIOUS)
2483 btinfo->flags |= flags;
2484 return btrace_step_again ();
2487 /* We keep threads moving at the end of their execution history. The wait
2488 method will stop the thread for whom the event is reported. */
2489 if (status.kind == TARGET_WAITKIND_NO_HISTORY)
2490 btinfo->flags |= flags;
2495 /* Announce further events if necessary. */
2498 record_btrace_maybe_mark_async_event
2499 (const std::vector<thread_info *> &moving,
2500 const std::vector<thread_info *> &no_history)
2502 bool more_moving = !moving.empty ();
2503 bool more_no_history = !no_history.empty ();;
2505 if (!more_moving && !more_no_history)
2509 DEBUG ("movers pending");
2511 if (more_no_history)
2512 DEBUG ("no-history pending");
2514 mark_async_event_handler (record_btrace_async_inferior_event_handler);
2517 /* The wait method of target record-btrace. */
2520 record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status,
2523 std::vector<thread_info *> moving;
2524 std::vector<thread_info *> no_history;
2526 DEBUG ("wait %s (0x%x)", target_pid_to_str (ptid), options);
2528 /* As long as we're not replaying, just forward the request. */
2529 if ((::execution_direction != EXEC_REVERSE)
2530 && !record_is_replaying (minus_one_ptid))
2532 return this->beneath ()->wait (ptid, status, options);
2535 /* Keep a work list of moving threads. */
2536 for (thread_info *tp : all_non_exited_threads (ptid))
2537 if ((tp->btrace.flags & (BTHR_MOVE | BTHR_STOP)) != 0)
2538 moving.push_back (tp);
2540 if (moving.empty ())
2542 *status = btrace_step_no_resumed ();
2544 DEBUG ("wait ended by %s: %s", target_pid_to_str (null_ptid),
2545 target_waitstatus_to_string (status).c_str ());
2550 /* Step moving threads one by one, one step each, until either one thread
2551 reports an event or we run out of threads to step.
2553 When stepping more than one thread, chances are that some threads reach
2554 the end of their execution history earlier than others. If we reported
2555 this immediately, all-stop on top of non-stop would stop all threads and
2556 resume the same threads next time. And we would report the same thread
2557 having reached the end of its execution history again.
2559 In the worst case, this would starve the other threads. But even if other
2560 threads would be allowed to make progress, this would result in far too
2561 many intermediate stops.
2563 We therefore delay the reporting of "no execution history" until we have
2564 nothing else to report. By this time, all threads should have moved to
2565 either the beginning or the end of their execution history. There will
2566 be a single user-visible stop. */
2567 struct thread_info *eventing = NULL;
2568 while ((eventing == NULL) && !moving.empty ())
2570 for (unsigned int ix = 0; eventing == NULL && ix < moving.size ();)
2572 thread_info *tp = moving[ix];
2574 *status = record_btrace_step_thread (tp);
2576 switch (status->kind)
2578 case TARGET_WAITKIND_IGNORE:
2582 case TARGET_WAITKIND_NO_HISTORY:
2583 no_history.push_back (ordered_remove (moving, ix));
2587 eventing = unordered_remove (moving, ix);
2593 if (eventing == NULL)
2595 /* We started with at least one moving thread. This thread must have
2596 either stopped or reached the end of its execution history.
2598 In the former case, EVENTING must not be NULL.
2599 In the latter case, NO_HISTORY must not be empty. */
2600 gdb_assert (!no_history.empty ());
2602 /* We kept threads moving at the end of their execution history. Stop
2603 EVENTING now that we are going to report its stop. */
2604 eventing = unordered_remove (no_history, 0);
2605 eventing->btrace.flags &= ~BTHR_MOVE;
2607 *status = btrace_step_no_history ();
2610 gdb_assert (eventing != NULL);
2612 /* We kept threads replaying at the end of their execution history. Stop
2613 replaying EVENTING now that we are going to report its stop. */
2614 record_btrace_stop_replaying_at_end (eventing);
2616 /* Stop all other threads. */
2617 if (!target_is_non_stop_p ())
2619 for (thread_info *tp : all_non_exited_threads ())
2620 record_btrace_cancel_resume (tp);
2623 /* In async mode, we need to announce further events. */
2624 if (target_is_async_p ())
2625 record_btrace_maybe_mark_async_event (moving, no_history);
2627 /* Start record histories anew from the current position. */
2628 record_btrace_clear_histories (&eventing->btrace);
2630 /* We moved the replay position but did not update registers. */
2631 registers_changed_thread (eventing);
2633 DEBUG ("wait ended by thread %s (%s): %s",
2634 print_thread_id (eventing),
2635 target_pid_to_str (eventing->ptid),
2636 target_waitstatus_to_string (status).c_str ());
2638 return eventing->ptid;
2641 /* The stop method of target record-btrace. */
2644 record_btrace_target::stop (ptid_t ptid)
2646 DEBUG ("stop %s", target_pid_to_str (ptid));
2648 /* As long as we're not replaying, just forward the request. */
2649 if ((::execution_direction != EXEC_REVERSE)
2650 && !record_is_replaying (minus_one_ptid))
2652 this->beneath ()->stop (ptid);
2656 for (thread_info *tp : all_non_exited_threads (ptid))
2658 tp->btrace.flags &= ~BTHR_MOVE;
2659 tp->btrace.flags |= BTHR_STOP;
2664 /* The can_execute_reverse method of target record-btrace. */
2667 record_btrace_target::can_execute_reverse ()
2672 /* The stopped_by_sw_breakpoint method of target record-btrace. */
2675 record_btrace_target::stopped_by_sw_breakpoint ()
2677 if (record_is_replaying (minus_one_ptid))
2679 struct thread_info *tp = inferior_thread ();
2681 return tp->btrace.stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT;
2684 return this->beneath ()->stopped_by_sw_breakpoint ();
2687 /* The supports_stopped_by_sw_breakpoint method of target
2691 record_btrace_target::supports_stopped_by_sw_breakpoint ()
2693 if (record_is_replaying (minus_one_ptid))
2696 return this->beneath ()->supports_stopped_by_sw_breakpoint ();
2699 /* The stopped_by_sw_breakpoint method of target record-btrace. */
2702 record_btrace_target::stopped_by_hw_breakpoint ()
2704 if (record_is_replaying (minus_one_ptid))
2706 struct thread_info *tp = inferior_thread ();
2708 return tp->btrace.stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT;
2711 return this->beneath ()->stopped_by_hw_breakpoint ();
2714 /* The supports_stopped_by_hw_breakpoint method of target
2718 record_btrace_target::supports_stopped_by_hw_breakpoint ()
2720 if (record_is_replaying (minus_one_ptid))
2723 return this->beneath ()->supports_stopped_by_hw_breakpoint ();
2726 /* The update_thread_list method of target record-btrace. */
2729 record_btrace_target::update_thread_list ()
2731 /* We don't add or remove threads during replay. */
2732 if (record_is_replaying (minus_one_ptid))
2735 /* Forward the request. */
2736 this->beneath ()->update_thread_list ();
2739 /* The thread_alive method of target record-btrace. */
2742 record_btrace_target::thread_alive (ptid_t ptid)
2744 /* We don't add or remove threads during replay. */
2745 if (record_is_replaying (minus_one_ptid))
2748 /* Forward the request. */
2749 return this->beneath ()->thread_alive (ptid);
2752 /* Set the replay branch trace instruction iterator. If IT is NULL, replay
2756 record_btrace_set_replay (struct thread_info *tp,
2757 const struct btrace_insn_iterator *it)
2759 struct btrace_thread_info *btinfo;
2761 btinfo = &tp->btrace;
2764 record_btrace_stop_replaying (tp);
2767 if (btinfo->replay == NULL)
2768 record_btrace_start_replaying (tp);
2769 else if (btrace_insn_cmp (btinfo->replay, it) == 0)
2772 *btinfo->replay = *it;
2773 registers_changed_thread (tp);
2776 /* Start anew from the new replay position. */
2777 record_btrace_clear_histories (btinfo);
2779 inferior_thread ()->suspend.stop_pc
2780 = regcache_read_pc (get_current_regcache ());
2781 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
2784 /* The goto_record_begin method of target record-btrace. */
2787 record_btrace_target::goto_record_begin ()
2789 struct thread_info *tp;
2790 struct btrace_insn_iterator begin;
2792 tp = require_btrace_thread ();
2794 btrace_insn_begin (&begin, &tp->btrace);
2796 /* Skip gaps at the beginning of the trace. */
2797 while (btrace_insn_get (&begin) == NULL)
2801 steps = btrace_insn_next (&begin, 1);
2803 error (_("No trace."));
2806 record_btrace_set_replay (tp, &begin);
2809 /* The goto_record_end method of target record-btrace. */
2812 record_btrace_target::goto_record_end ()
2814 struct thread_info *tp;
2816 tp = require_btrace_thread ();
2818 record_btrace_set_replay (tp, NULL);
2821 /* The goto_record method of target record-btrace. */
2824 record_btrace_target::goto_record (ULONGEST insn)
2826 struct thread_info *tp;
2827 struct btrace_insn_iterator it;
2828 unsigned int number;
2833 /* Check for wrap-arounds. */
2835 error (_("Instruction number out of range."));
2837 tp = require_btrace_thread ();
2839 found = btrace_find_insn_by_number (&it, &tp->btrace, number);
2841 /* Check if the instruction could not be found or is a gap. */
2842 if (found == 0 || btrace_insn_get (&it) == NULL)
2843 error (_("No such instruction."));
2845 record_btrace_set_replay (tp, &it);
2848 /* The record_stop_replaying method of target record-btrace. */
2851 record_btrace_target::record_stop_replaying ()
2853 for (thread_info *tp : all_non_exited_threads ())
2854 record_btrace_stop_replaying (tp);
2857 /* The execution_direction target method. */
2859 enum exec_direction_kind
2860 record_btrace_target::execution_direction ()
2862 return record_btrace_resume_exec_dir;
2865 /* The prepare_to_generate_core target method. */
2868 record_btrace_target::prepare_to_generate_core ()
2870 record_btrace_generating_corefile = 1;
2873 /* The done_generating_core target method. */
2876 record_btrace_target::done_generating_core ()
2878 record_btrace_generating_corefile = 0;
2881 /* Start recording in BTS format. */
2884 cmd_record_btrace_bts_start (const char *args, int from_tty)
2886 if (args != NULL && *args != 0)
2887 error (_("Invalid argument."));
2889 record_btrace_conf.format = BTRACE_FORMAT_BTS;
2893 execute_command ("target record-btrace", from_tty);
2895 CATCH (exception, RETURN_MASK_ALL)
2897 record_btrace_conf.format = BTRACE_FORMAT_NONE;
2898 throw_exception (exception);
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 (exception, RETURN_MASK_ALL)
2919 record_btrace_conf.format = BTRACE_FORMAT_NONE;
2920 throw_exception (exception);
2925 /* Alias for "target record". */
2928 cmd_record_btrace_start (const char *args, int from_tty)
2930 if (args != NULL && *args != 0)
2931 error (_("Invalid argument."));
2933 record_btrace_conf.format = BTRACE_FORMAT_PT;
2937 execute_command ("target record-btrace", from_tty);
2939 CATCH (exception, RETURN_MASK_ALL)
2941 record_btrace_conf.format = BTRACE_FORMAT_BTS;
2945 execute_command ("target record-btrace", from_tty);
2947 CATCH (ex, RETURN_MASK_ALL)
2949 record_btrace_conf.format = BTRACE_FORMAT_NONE;
2950 throw_exception (ex);
2957 /* The "set record btrace" command. */
2960 cmd_set_record_btrace (const char *args, int from_tty)
2962 printf_unfiltered (_("\"set record btrace\" must be followed "
2963 "by an appropriate subcommand.\n"));
2964 help_list (set_record_btrace_cmdlist, "set record btrace ",
2965 all_commands, gdb_stdout);
2968 /* The "show record btrace" command. */
2971 cmd_show_record_btrace (const char *args, int from_tty)
2973 cmd_show_list (show_record_btrace_cmdlist, from_tty, "");
2976 /* The "show record btrace replay-memory-access" command. */
2979 cmd_show_replay_memory_access (struct ui_file *file, int from_tty,
2980 struct cmd_list_element *c, const char *value)
2982 fprintf_filtered (gdb_stdout, _("Replay memory access is %s.\n"),
2983 replay_memory_access);
2986 /* The "set record btrace cpu none" command. */
2989 cmd_set_record_btrace_cpu_none (const char *args, int from_tty)
2991 if (args != nullptr && *args != 0)
2992 error (_("Trailing junk: '%s'."), args);
2994 record_btrace_cpu_state = CS_NONE;
2997 /* The "set record btrace cpu auto" command. */
3000 cmd_set_record_btrace_cpu_auto (const char *args, int from_tty)
3002 if (args != nullptr && *args != 0)
3003 error (_("Trailing junk: '%s'."), args);
3005 record_btrace_cpu_state = CS_AUTO;
3008 /* The "set record btrace cpu" command. */
3011 cmd_set_record_btrace_cpu (const char *args, int from_tty)
3013 if (args == nullptr)
3016 /* We use a hard-coded vendor string for now. */
3017 unsigned int family, model, stepping;
3018 int l1, l2, matches = sscanf (args, "intel: %u/%u%n/%u%n", &family,
3019 &model, &l1, &stepping, &l2);
3022 if (strlen (args) != l2)
3023 error (_("Trailing junk: '%s'."), args + l2);
3025 else if (matches == 2)
3027 if (strlen (args) != l1)
3028 error (_("Trailing junk: '%s'."), args + l1);
3033 error (_("Bad format. See \"help set record btrace cpu\"."));
3035 if (USHRT_MAX < family)
3036 error (_("Cpu family too big."));
3038 if (UCHAR_MAX < model)
3039 error (_("Cpu model too big."));
3041 if (UCHAR_MAX < stepping)
3042 error (_("Cpu stepping too big."));
3044 record_btrace_cpu.vendor = CV_INTEL;
3045 record_btrace_cpu.family = family;
3046 record_btrace_cpu.model = model;
3047 record_btrace_cpu.stepping = stepping;
3049 record_btrace_cpu_state = CS_CPU;
3052 /* The "show record btrace cpu" command. */
3055 cmd_show_record_btrace_cpu (const char *args, int from_tty)
3057 if (args != nullptr && *args != 0)
3058 error (_("Trailing junk: '%s'."), args);
3060 switch (record_btrace_cpu_state)
3063 printf_unfiltered (_("btrace cpu is 'auto'.\n"));
3067 printf_unfiltered (_("btrace cpu is 'none'.\n"));
3071 switch (record_btrace_cpu.vendor)
3074 if (record_btrace_cpu.stepping == 0)
3075 printf_unfiltered (_("btrace cpu is 'intel: %u/%u'.\n"),
3076 record_btrace_cpu.family,
3077 record_btrace_cpu.model);
3079 printf_unfiltered (_("btrace cpu is 'intel: %u/%u/%u'.\n"),
3080 record_btrace_cpu.family,
3081 record_btrace_cpu.model,
3082 record_btrace_cpu.stepping);
3087 error (_("Internal error: bad cpu state."));
3090 /* The "s record btrace bts" command. */
3093 cmd_set_record_btrace_bts (const char *args, int from_tty)
3095 printf_unfiltered (_("\"set record btrace bts\" must be followed "
3096 "by an appropriate subcommand.\n"));
3097 help_list (set_record_btrace_bts_cmdlist, "set record btrace bts ",
3098 all_commands, gdb_stdout);
3101 /* The "show record btrace bts" command. */
3104 cmd_show_record_btrace_bts (const char *args, int from_tty)
3106 cmd_show_list (show_record_btrace_bts_cmdlist, from_tty, "");
3109 /* The "set record btrace pt" command. */
3112 cmd_set_record_btrace_pt (const char *args, int from_tty)
3114 printf_unfiltered (_("\"set record btrace pt\" must be followed "
3115 "by an appropriate subcommand.\n"));
3116 help_list (set_record_btrace_pt_cmdlist, "set record btrace pt ",
3117 all_commands, gdb_stdout);
3120 /* The "show record btrace pt" command. */
3123 cmd_show_record_btrace_pt (const char *args, int from_tty)
3125 cmd_show_list (show_record_btrace_pt_cmdlist, from_tty, "");
3128 /* The "record bts buffer-size" show value function. */
3131 show_record_bts_buffer_size_value (struct ui_file *file, int from_tty,
3132 struct cmd_list_element *c,
3135 fprintf_filtered (file, _("The record/replay bts buffer size is %s.\n"),
3139 /* The "record pt buffer-size" show value function. */
3142 show_record_pt_buffer_size_value (struct ui_file *file, int from_tty,
3143 struct cmd_list_element *c,
3146 fprintf_filtered (file, _("The record/replay pt buffer size is %s.\n"),
3150 /* Initialize btrace commands. */
3153 _initialize_record_btrace (void)
3155 add_prefix_cmd ("btrace", class_obscure, cmd_record_btrace_start,
3156 _("Start branch trace recording."), &record_btrace_cmdlist,
3157 "record btrace ", 0, &record_cmdlist);
3158 add_alias_cmd ("b", "btrace", class_obscure, 1, &record_cmdlist);
3160 add_cmd ("bts", class_obscure, cmd_record_btrace_bts_start,
3162 Start branch trace recording in Branch Trace Store (BTS) format.\n\n\
3163 The processor stores a from/to record for each branch into a cyclic buffer.\n\
3164 This format may not be available on all processors."),
3165 &record_btrace_cmdlist);
3166 add_alias_cmd ("bts", "btrace bts", class_obscure, 1, &record_cmdlist);
3168 add_cmd ("pt", class_obscure, cmd_record_btrace_pt_start,
3170 Start branch trace recording in Intel Processor Trace format.\n\n\
3171 This format may not be available on all processors."),
3172 &record_btrace_cmdlist);
3173 add_alias_cmd ("pt", "btrace pt", class_obscure, 1, &record_cmdlist);
3175 add_prefix_cmd ("btrace", class_support, cmd_set_record_btrace,
3176 _("Set record options"), &set_record_btrace_cmdlist,
3177 "set record btrace ", 0, &set_record_cmdlist);
3179 add_prefix_cmd ("btrace", class_support, cmd_show_record_btrace,
3180 _("Show record options"), &show_record_btrace_cmdlist,
3181 "show record btrace ", 0, &show_record_cmdlist);
3183 add_setshow_enum_cmd ("replay-memory-access", no_class,
3184 replay_memory_access_types, &replay_memory_access, _("\
3185 Set what memory accesses are allowed during replay."), _("\
3186 Show what memory accesses are allowed during replay."),
3187 _("Default is READ-ONLY.\n\n\
3188 The btrace record target does not trace data.\n\
3189 The memory therefore corresponds to the live target and not \
3190 to the current replay position.\n\n\
3191 When READ-ONLY, allow accesses to read-only memory during replay.\n\
3192 When READ-WRITE, allow accesses to read-only and read-write memory during \
3194 NULL, cmd_show_replay_memory_access,
3195 &set_record_btrace_cmdlist,
3196 &show_record_btrace_cmdlist);
3198 add_prefix_cmd ("cpu", class_support, cmd_set_record_btrace_cpu,
3200 Set the cpu to be used for trace decode.\n\n\
3201 The format is \"VENDOR:IDENTIFIER\" or \"none\" or \"auto\" (default).\n\
3202 For vendor \"intel\" the format is \"FAMILY/MODEL[/STEPPING]\".\n\n\
3203 When decoding branch trace, enable errata workarounds for the specified cpu.\n\
3204 The default is \"auto\", which uses the cpu on which the trace was recorded.\n\
3205 When GDB does not support that cpu, this option can be used to enable\n\
3206 workarounds for a similar cpu that GDB supports.\n\n\
3207 When set to \"none\", errata workarounds are disabled."),
3208 &set_record_btrace_cpu_cmdlist,
3209 _("set record btrace cpu "), 1,
3210 &set_record_btrace_cmdlist);
3212 add_cmd ("auto", class_support, cmd_set_record_btrace_cpu_auto, _("\
3213 Automatically determine the cpu to be used for trace decode."),
3214 &set_record_btrace_cpu_cmdlist);
3216 add_cmd ("none", class_support, cmd_set_record_btrace_cpu_none, _("\
3217 Do not enable errata workarounds for trace decode."),
3218 &set_record_btrace_cpu_cmdlist);
3220 add_cmd ("cpu", class_support, cmd_show_record_btrace_cpu, _("\
3221 Show the cpu to be used for trace decode."),
3222 &show_record_btrace_cmdlist);
3224 add_prefix_cmd ("bts", class_support, cmd_set_record_btrace_bts,
3225 _("Set record btrace bts options"),
3226 &set_record_btrace_bts_cmdlist,
3227 "set record btrace bts ", 0, &set_record_btrace_cmdlist);
3229 add_prefix_cmd ("bts", class_support, cmd_show_record_btrace_bts,
3230 _("Show record btrace bts options"),
3231 &show_record_btrace_bts_cmdlist,
3232 "show record btrace bts ", 0, &show_record_btrace_cmdlist);
3234 add_setshow_uinteger_cmd ("buffer-size", no_class,
3235 &record_btrace_conf.bts.size,
3236 _("Set the record/replay bts buffer size."),
3237 _("Show the record/replay bts buffer size."), _("\
3238 When starting recording request a trace buffer of this size. \
3239 The actual buffer size may differ from the requested size. \
3240 Use \"info record\" to see the actual buffer size.\n\n\
3241 Bigger buffers allow longer recording but also take more time to process \
3242 the recorded execution trace.\n\n\
3243 The trace buffer size may not be changed while recording."), NULL,
3244 show_record_bts_buffer_size_value,
3245 &set_record_btrace_bts_cmdlist,
3246 &show_record_btrace_bts_cmdlist);
3248 add_prefix_cmd ("pt", class_support, cmd_set_record_btrace_pt,
3249 _("Set record btrace pt options"),
3250 &set_record_btrace_pt_cmdlist,
3251 "set record btrace pt ", 0, &set_record_btrace_cmdlist);
3253 add_prefix_cmd ("pt", class_support, cmd_show_record_btrace_pt,
3254 _("Show record btrace pt options"),
3255 &show_record_btrace_pt_cmdlist,
3256 "show record btrace pt ", 0, &show_record_btrace_cmdlist);
3258 add_setshow_uinteger_cmd ("buffer-size", no_class,
3259 &record_btrace_conf.pt.size,
3260 _("Set the record/replay pt buffer size."),
3261 _("Show the record/replay pt buffer size."), _("\
3262 Bigger buffers allow longer recording but also take more time to process \
3263 the recorded execution.\n\
3264 The actual buffer size may differ from the requested size. Use \"info record\" \
3265 to see the actual buffer size."), NULL, show_record_pt_buffer_size_value,
3266 &set_record_btrace_pt_cmdlist,
3267 &show_record_btrace_pt_cmdlist);
3269 add_target (record_btrace_target_info, record_btrace_target_open);
3271 bfcache = htab_create_alloc (50, bfcache_hash, bfcache_eq, NULL,
3274 record_btrace_conf.bts.size = 64 * 1024;
3275 record_btrace_conf.pt.size = 16 * 1024;