X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Frecord-btrace.c;h=3dfdf592dd516d2c8a42d433991555609c062caa;hb=7124770976d3f051532faf864013b76ab36249bf;hp=00affb85d22ea680b738a25f66b0ef8b2b5d8b99;hpb=5e84b7eefba5b4299b0ca80aecc5d4e99c195c1e;p=binutils-gdb.git diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 00affb85d22..3dfdf592dd5 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -1,6 +1,6 @@ /* Branch trace support for GDB, the GNU debugger. - Copyright (C) 2013-2021 Free Software Foundation, Inc. + Copyright (C) 2013-2022 Free Software Foundation, Inc. Contributed by Intel Corp. @@ -279,10 +279,10 @@ require_btrace (void) return &tp->btrace; } -/* Enable branch tracing for one thread. Warn on errors. */ +/* The new thread observer. */ static void -record_btrace_enable_warn (struct thread_info *tp) +record_btrace_on_new_thread (struct thread_info *tp) { /* Ignore this thread if its inferior is not recorded by us. */ target_ops *rec = tp->inf->target_at (record_stratum); @@ -306,7 +306,7 @@ record_btrace_auto_enable (void) { DEBUG ("attach thread observer"); - gdb::observers::new_thread.attach (record_btrace_enable_warn, + gdb::observers::new_thread.attach (record_btrace_on_new_thread, record_btrace_thread_observer_token, "record-btrace"); } @@ -506,7 +506,7 @@ record_btrace_print_bts_conf (const struct btrace_config_bts *conf) if (size > 0) { suffix = record_btrace_adjust_size (&size); - printf_unfiltered (_("Buffer size: %u%s.\n"), size, suffix); + printf_filtered (_("Buffer size: %u%s.\n"), size, suffix); } } @@ -522,7 +522,7 @@ record_btrace_print_pt_conf (const struct btrace_config_pt *conf) if (size > 0) { suffix = record_btrace_adjust_size (&size); - printf_unfiltered (_("Buffer size: %u%s.\n"), size, suffix); + printf_filtered (_("Buffer size: %u%s.\n"), size, suffix); } } @@ -531,8 +531,8 @@ record_btrace_print_pt_conf (const struct btrace_config_pt *conf) static void record_btrace_print_conf (const struct btrace_config *conf) { - printf_unfiltered (_("Recording format: %s.\n"), - btrace_format_string (conf->format)); + printf_filtered (_("Recording format: %s.\n"), + btrace_format_string (conf->format)); switch (conf->format) { @@ -602,14 +602,14 @@ record_btrace_target::info_record () gaps = btinfo->ngaps; } - printf_unfiltered (_("Recorded %u instructions in %u functions (%u gaps) " - "for thread %s (%s).\n"), insns, calls, gaps, - print_thread_id (tp), - target_pid_to_str (tp->ptid).c_str ()); + printf_filtered (_("Recorded %u instructions in %u functions (%u gaps) " + "for thread %s (%s).\n"), insns, calls, gaps, + print_thread_id (tp), + target_pid_to_str (tp->ptid).c_str ()); if (btrace_is_replaying (tp)) - printf_unfiltered (_("Replay in progress. At instruction %u.\n"), - btrace_insn_number (btinfo->replay)); + printf_filtered (_("Replay in progress. At instruction %u.\n"), + btrace_insn_number (btinfo->replay)); } /* Print a decode error. */ @@ -713,7 +713,7 @@ btrace_find_line_range (CORE_ADDR pc) if (symtab == NULL) return btrace_mk_line_range (NULL, 0, 0); - ltable = SYMTAB_LINETABLE (symtab); + ltable = symtab->linetable (); if (ltable == NULL) return btrace_mk_line_range (symtab, 0, 0); @@ -938,9 +938,9 @@ record_btrace_target::insn_history (int size, gdb_disassembly_flags flags) else { if (size < 0) - printf_unfiltered (_("At the start of the branch trace record.\n")); + printf_filtered (_("At the start of the branch trace record.\n")); else - printf_unfiltered (_("At the end of the branch trace record.\n")); + printf_filtered (_("At the end of the branch trace record.\n")); } btrace_set_insn_history (btinfo, &begin, &end); @@ -1295,9 +1295,9 @@ record_btrace_target::call_history (int size, record_print_flags flags) else { if (size < 0) - printf_unfiltered (_("At the start of the branch trace record.\n")); + printf_filtered (_("At the start of the branch trace record.\n")); else - printf_unfiltered (_("At the end of the branch trace record.\n")); + printf_filtered (_("At the end of the branch trace record.\n")); } btrace_set_call_history (btinfo, &begin, &end); @@ -1889,6 +1889,7 @@ record_btrace_frame_dealloc_cache (struct frame_info *self, void *this_cache) const struct frame_unwind record_btrace_frame_unwind = { + "record-btrace", NORMAL_FRAME, record_btrace_frame_unwind_stop_reason, record_btrace_frame_this_id, @@ -1900,6 +1901,7 @@ const struct frame_unwind record_btrace_frame_unwind = const struct frame_unwind record_btrace_tailcall_frame_unwind = { + "record-btrace tailcall", TAILCALL_FRAME, record_btrace_frame_unwind_stop_reason, record_btrace_frame_this_id, @@ -1960,7 +1962,7 @@ record_btrace_resume_thread (struct thread_info *tp, struct btrace_thread_info *btinfo; DEBUG ("resuming thread %s (%s): %x (%s)", print_thread_id (tp), - target_pid_to_str (tp->ptid).c_str (), flag, + tp->ptid.to_string ().c_str (), flag, btrace_thread_flag_to_str (flag)); btinfo = &tp->btrace; @@ -1978,9 +1980,6 @@ record_btrace_resume_thread (struct thread_info *tp, static struct frame_id get_thread_current_frame_id (struct thread_info *tp) { - struct frame_id id; - bool executing; - /* Set current thread, which is implicitly used by get_current_frame. */ scoped_restore_current_thread restore_thread; @@ -1996,26 +1995,13 @@ get_thread_current_frame_id (struct thread_info *tp) For the former, EXECUTING is true and we're in wait, about to move the thread. Since we need to recompute the stack, we temporarily set EXECUTING to false. */ - executing = tp->executing; + bool executing = tp->executing (); set_executing (proc_target, inferior_ptid, false); - - id = null_frame_id; - try - { - id = get_frame_id (get_current_frame ()); - } - catch (const gdb_exception &except) + SCOPE_EXIT { - /* Restore the previous execution state. */ set_executing (proc_target, inferior_ptid, executing); - - throw; - } - - /* Restore the previous execution state. */ - set_executing (proc_target, inferior_ptid, executing); - - return id; + }; + return get_frame_id (get_current_frame ()); } /* Start replaying a thread. */ @@ -2139,7 +2125,7 @@ record_btrace_target::resume (ptid_t ptid, int step, enum gdb_signal signal) { enum btrace_thread_flag flag, cflag; - DEBUG ("resume %s: %s%s", target_pid_to_str (ptid).c_str (), + DEBUG ("resume %s: %s%s", ptid.to_string ().c_str (), ::execution_direction == EXEC_REVERSE ? "reverse-" : "", step ? "step" : "cont"); @@ -2219,7 +2205,7 @@ record_btrace_cancel_resume (struct thread_info *tp) DEBUG ("cancel resume thread %s (%s): %x (%s)", print_thread_id (tp), - target_pid_to_str (tp->ptid).c_str (), flags.raw (), + tp->ptid.to_string ().c_str (), flags.raw (), btrace_thread_flag_to_str (flags)); tp->btrace.flags &= ~(BTHR_MOVE | BTHR_STOP); @@ -2233,7 +2219,7 @@ btrace_step_no_history (void) { struct target_waitstatus status; - status.kind = TARGET_WAITKIND_NO_HISTORY; + status.set_no_history (); return status; } @@ -2245,8 +2231,7 @@ btrace_step_stopped (void) { struct target_waitstatus status; - status.kind = TARGET_WAITKIND_STOPPED; - status.value.sig = GDB_SIGNAL_TRAP; + status.set_stopped (GDB_SIGNAL_TRAP); return status; } @@ -2259,8 +2244,7 @@ btrace_step_stopped_on_request (void) { struct target_waitstatus status; - status.kind = TARGET_WAITKIND_STOPPED; - status.value.sig = GDB_SIGNAL_0; + status.set_stopped (GDB_SIGNAL_0); return status; } @@ -2272,7 +2256,7 @@ btrace_step_spurious (void) { struct target_waitstatus status; - status.kind = TARGET_WAITKIND_SPURIOUS; + status.set_spurious (); return status; } @@ -2284,7 +2268,7 @@ btrace_step_no_resumed (void) { struct target_waitstatus status; - status.kind = TARGET_WAITKIND_NO_RESUMED; + status.set_no_resumed (); return status; } @@ -2296,7 +2280,7 @@ btrace_step_again (void) { struct target_waitstatus status; - status.kind = TARGET_WAITKIND_IGNORE; + status.set_ignore (); return status; } @@ -2447,7 +2431,7 @@ record_btrace_step_thread (struct thread_info *tp) btinfo->flags &= ~(BTHR_MOVE | BTHR_STOP); DEBUG ("stepping thread %s (%s): %x (%s)", print_thread_id (tp), - target_pid_to_str (tp->ptid).c_str (), flags.raw (), + tp->ptid.to_string ().c_str (), flags.raw (), btrace_thread_flag_to_str (flags)); /* We can't step without an execution history. */ @@ -2464,21 +2448,21 @@ record_btrace_step_thread (struct thread_info *tp) case BTHR_STEP: status = record_btrace_single_step_forward (tp); - if (status.kind != TARGET_WAITKIND_SPURIOUS) + if (status.kind () != TARGET_WAITKIND_SPURIOUS) break; return btrace_step_stopped (); case BTHR_RSTEP: status = record_btrace_single_step_backward (tp); - if (status.kind != TARGET_WAITKIND_SPURIOUS) + if (status.kind () != TARGET_WAITKIND_SPURIOUS) break; return btrace_step_stopped (); case BTHR_CONT: status = record_btrace_single_step_forward (tp); - if (status.kind != TARGET_WAITKIND_SPURIOUS) + if (status.kind () != TARGET_WAITKIND_SPURIOUS) break; btinfo->flags |= flags; @@ -2486,7 +2470,7 @@ record_btrace_step_thread (struct thread_info *tp) case BTHR_RCONT: status = record_btrace_single_step_backward (tp); - if (status.kind != TARGET_WAITKIND_SPURIOUS) + if (status.kind () != TARGET_WAITKIND_SPURIOUS) break; btinfo->flags |= flags; @@ -2495,7 +2479,7 @@ record_btrace_step_thread (struct thread_info *tp) /* We keep threads moving at the end of their execution history. The wait method will stop the thread for whom the event is reported. */ - if (status.kind == TARGET_WAITKIND_NO_HISTORY) + if (status.kind () == TARGET_WAITKIND_NO_HISTORY) btinfo->flags |= flags; return status; @@ -2535,7 +2519,7 @@ record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status, /* Clear this, if needed we'll re-mark it below. */ clear_async_event_handler (record_btrace_async_inferior_event_handler); - DEBUG ("wait %s (0x%x)", target_pid_to_str (ptid).c_str (), + DEBUG ("wait %s (0x%x)", ptid.to_string ().c_str (), (unsigned) options); /* As long as we're not replaying, just forward the request. */ @@ -2555,8 +2539,8 @@ record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status, { *status = btrace_step_no_resumed (); - DEBUG ("wait ended by %s: %s", target_pid_to_str (null_ptid).c_str (), - target_waitstatus_to_string (status).c_str ()); + DEBUG ("wait ended by %s: %s", null_ptid.to_string ().c_str (), + status->to_string ().c_str ()); return null_ptid; } @@ -2587,7 +2571,7 @@ record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status, *status = record_btrace_step_thread (tp); - switch (status->kind) + switch (status->kind ()) { case TARGET_WAITKIND_IGNORE: ix++; @@ -2646,8 +2630,8 @@ record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status, DEBUG ("wait ended by thread %s (%s): %s", print_thread_id (eventing), - target_pid_to_str (eventing->ptid).c_str (), - target_waitstatus_to_string (status).c_str ()); + eventing->ptid.to_string ().c_str (), + status->to_string ().c_str ()); return eventing->ptid; } @@ -2657,7 +2641,7 @@ record_btrace_target::wait (ptid_t ptid, struct target_waitstatus *status, void record_btrace_target::stop (ptid_t ptid) { - DEBUG ("stop %s", target_pid_to_str (ptid).c_str ()); + DEBUG ("stop %s", ptid.to_string ().c_str ()); /* As long as we're not replaying, just forward the request. */ if ((::execution_direction != EXEC_REVERSE) @@ -2793,8 +2777,7 @@ record_btrace_set_replay (struct thread_info *tp, /* Start anew from the new replay position. */ record_btrace_clear_histories (btinfo); - inferior_thread ()->suspend.stop_pc - = regcache_read_pc (get_current_regcache ()); + inferior_thread ()->set_stop_pc (regcache_read_pc (get_current_regcache ())); print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); } @@ -2973,7 +2956,7 @@ static void cmd_show_replay_memory_access (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - fprintf_filtered (gdb_stdout, _("Replay memory access is %s.\n"), + fprintf_filtered (file, _("Replay memory access is %s.\n"), replay_memory_access); } @@ -3054,11 +3037,11 @@ cmd_show_record_btrace_cpu (const char *args, int from_tty) switch (record_btrace_cpu_state) { case CS_AUTO: - printf_unfiltered (_("btrace cpu is 'auto'.\n")); + printf_filtered (_("btrace cpu is 'auto'.\n")); return; case CS_NONE: - printf_unfiltered (_("btrace cpu is 'none'.\n")); + printf_filtered (_("btrace cpu is 'none'.\n")); return; case CS_CPU: @@ -3066,14 +3049,14 @@ cmd_show_record_btrace_cpu (const char *args, int from_tty) { case CV_INTEL: if (record_btrace_cpu.stepping == 0) - printf_unfiltered (_("btrace cpu is 'intel: %u/%u'.\n"), - record_btrace_cpu.family, - record_btrace_cpu.model); + printf_filtered (_("btrace cpu is 'intel: %u/%u'.\n"), + record_btrace_cpu.family, + record_btrace_cpu.model); else - printf_unfiltered (_("btrace cpu is 'intel: %u/%u/%u'.\n"), - record_btrace_cpu.family, - record_btrace_cpu.model, - record_btrace_cpu.stepping); + printf_filtered (_("btrace cpu is 'intel: %u/%u/%u'.\n"), + record_btrace_cpu.family, + record_btrace_cpu.model, + record_btrace_cpu.stepping); return; } } @@ -3133,13 +3116,12 @@ This format may not be available on all processors."), &record_btrace_cmdlist); add_alias_cmd ("pt", record_btrace_pt_cmd, class_obscure, 1, &record_cmdlist); - add_basic_prefix_cmd ("btrace", class_support, - _("Set record options."), &set_record_btrace_cmdlist, - 0, &set_record_cmdlist); - - add_show_prefix_cmd ("btrace", class_support, - _("Show record options."), &show_record_btrace_cmdlist, - 0, &show_record_cmdlist); + add_setshow_prefix_cmd ("btrace", class_support, + _("Set record options."), + _("Show record options."), + &set_record_btrace_cmdlist, + &show_record_btrace_cmdlist, + &set_record_cmdlist, &show_record_cmdlist); add_setshow_enum_cmd ("replay-memory-access", no_class, replay_memory_access_types, &replay_memory_access, _("\ @@ -3182,17 +3164,13 @@ Do not enable errata workarounds for trace decode."), Show the cpu to be used for trace decode."), &show_record_btrace_cmdlist); - add_basic_prefix_cmd ("bts", class_support, - _("Set record btrace bts options."), - &set_record_btrace_bts_cmdlist, - 0, - &set_record_btrace_cmdlist); - - add_show_prefix_cmd ("bts", class_support, - _("Show record btrace bts options."), - &show_record_btrace_bts_cmdlist, - 0, - &show_record_btrace_cmdlist); + add_setshow_prefix_cmd ("bts", class_support, + _("Set record btrace bts options."), + _("Show record btrace bts options."), + &set_record_btrace_bts_cmdlist, + &show_record_btrace_bts_cmdlist, + &set_record_btrace_cmdlist, + &show_record_btrace_cmdlist); add_setshow_uinteger_cmd ("buffer-size", no_class, &record_btrace_conf.bts.size, @@ -3208,17 +3186,13 @@ The trace buffer size may not be changed while recording."), NULL, &set_record_btrace_bts_cmdlist, &show_record_btrace_bts_cmdlist); - add_basic_prefix_cmd ("pt", class_support, - _("Set record btrace pt options."), - &set_record_btrace_pt_cmdlist, - 0, - &set_record_btrace_cmdlist); - - add_show_prefix_cmd ("pt", class_support, - _("Show record btrace pt options."), - &show_record_btrace_pt_cmdlist, - 0, - &show_record_btrace_cmdlist); + add_setshow_prefix_cmd ("pt", class_support, + _("Set record btrace pt options."), + _("Show record btrace pt options."), + &set_record_btrace_pt_cmdlist, + &show_record_btrace_pt_cmdlist, + &set_record_btrace_cmdlist, + &show_record_btrace_cmdlist); add_setshow_uinteger_cmd ("buffer-size", no_class, &record_btrace_conf.pt.size,