/* Branch trace support for GDB, the GNU debugger.
- Copyright (C) 2013-2019 Free Software Foundation, Inc.
+ Copyright (C) 2013-2021 Free Software Foundation, Inc.
Contributed by Intel Corp. <markus.t.metzger@intel.com>
do \
{ \
if (record_debug != 0) \
- fprintf_unfiltered (gdb_stdlog, \
+ fprintf_unfiltered (gdb_stdlog, \
"[btrace] " msg "\n", ##args); \
} \
while (0)
sym = bfun->sym;
if (sym != NULL)
- return SYMBOL_PRINT_NAME (sym);
+ return sym->print_name ();
if (msym != NULL)
- return MSYMBOL_PRINT_NAME (msym);
+ return msym->print_name ();
return "<unknown>";
}
/* If the minimal symbol changed, we certainly switched functions. */
if (mfun != NULL && msym != NULL
- && strcmp (MSYMBOL_LINKAGE_NAME (mfun), MSYMBOL_LINKAGE_NAME (msym)) != 0)
+ && strcmp (mfun->linkage_name (), msym->linkage_name ()) != 0)
return 1;
/* If the symbol changed, we certainly switched functions. */
const char *bfname, *fname;
/* Check the function name. */
- if (strcmp (SYMBOL_LINKAGE_NAME (fun), SYMBOL_LINKAGE_NAME (sym)) != 0)
+ if (strcmp (fun->linkage_name (), sym->linkage_name ()) != 0)
return 1;
/* Check the location of those functions, as well. */
static void
ftrace_update_caller (struct btrace_function *bfun,
struct btrace_function *caller,
- enum btrace_function_flag flags)
+ btrace_function_flags flags)
{
if (bfun->up != 0)
ftrace_debug (bfun, "updating caller");
ftrace_fixup_caller (struct btrace_thread_info *btinfo,
struct btrace_function *bfun,
struct btrace_function *caller,
- enum btrace_function_flag flags)
+ btrace_function_flags flags)
{
unsigned int prev, next;
best_r = NULL;
/* We search the back traces of LHS and RHS for valid connections and connect
- the two functon segments that give the longest combined back trace. */
+ the two function segments that give the longest combined back trace. */
for (cand_l = lhs; cand_l != NULL;
cand_l = ftrace_get_caller (btinfo, cand_l))
break;
case ptev_enabled:
+ if (event.status_update != 0)
+ break;
+
if (event.variant.enabled.resumed == 0 && !btinfo->functions.empty ())
{
bfun = ftrace_new_gap (btinfo, BDE_PT_DISABLED, gaps);
return;
}
- internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
+ internal_error (__FILE__, __LINE__, _("Unknown branch trace format."));
}
static void
btrace_enable (struct thread_info *tp, const struct btrace_config *conf)
{
if (tp->btrace.target != NULL)
- return;
+ error (_("Recording already enabled on thread %s (%s)."),
+ print_thread_id (tp), target_pid_to_str (tp->ptid).c_str ());
#if !defined (HAVE_LIBIPT)
if (conf->format == BTRACE_FORMAT_PT)
tp->btrace.target = target_enable_btrace (tp->ptid, conf);
- /* We're done if we failed to enable tracing. */
if (tp->btrace.target == NULL)
- return;
+ error (_("Failed to enable recording on thread %s (%s)."),
+ print_thread_id (tp), target_pid_to_str (tp->ptid).c_str ());
/* We need to undo the enable in case of errors. */
try
struct btrace_thread_info *btp = &tp->btrace;
if (btp->target == NULL)
- return;
+ error (_("Recording not enabled on thread %s (%s)."),
+ print_thread_id (tp), target_pid_to_str (tp->ptid).c_str ());
DEBUG ("disable thread %s (%s)", print_thread_id (tp),
target_pid_to_str (tp->ptid).c_str ());
return -1;
}
- internal_error (__FILE__, __LINE__, _("Unkown branch trace format."));
+ internal_error (__FILE__, __LINE__, _("Unknown branch trace format."));
}
/* Clear the branch trace histories in BTINFO. */
if (btinfo->replay != NULL)
return;
- /* With CLI usage, TP->PTID always equals INFERIOR_PTID here. Now that we
- can store a gdb.Record object in Python referring to a different thread
- than the current one, temporarily set INFERIOR_PTID. */
- scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
- inferior_ptid = tp->ptid;
+ /* With CLI usage, TP is always the current thread when we get here.
+ However, since we can also store a gdb.Record object in Python
+ referring to a different thread than the current one, we need to
+ temporarily set the current thread. */
+ scoped_restore_current_thread restore_thread;
+ switch_to_thread (tp);
/* We should not be called on running or exited threads. */
gdb_assert (can_access_registers_thread (tp));
struct btrace_thread_info *btinfo;
unsigned int size, begin, end, from, to;
- thread_info *tp = find_thread_ptid (inferior_ptid);
+ thread_info *tp = find_thread_ptid (current_inferior (), inferior_ptid);
if (tp == NULL)
error (_("No thread."));
btrace_clear (tp);
}
-/* The "maintenance btrace" command. */
-
-static void
-maint_btrace_cmd (const char *args, int from_tty)
-{
- help_list (maint_btrace_cmdlist, "maintenance btrace ", all_commands,
- gdb_stdout);
-}
-
-/* The "maintenance set btrace" command. */
-
-static void
-maint_btrace_set_cmd (const char *args, int from_tty)
-{
- help_list (maint_btrace_set_cmdlist, "maintenance set btrace ", all_commands,
- gdb_stdout);
-}
-
-/* The "maintenance show btrace" command. */
-
-static void
-maint_btrace_show_cmd (const char *args, int from_tty)
-{
- help_list (maint_btrace_show_cmdlist, "maintenance show btrace ",
- all_commands, gdb_stdout);
-}
-
-/* The "maintenance set btrace pt" command. */
-
-static void
-maint_btrace_pt_set_cmd (const char *args, int from_tty)
-{
- help_list (maint_btrace_pt_set_cmdlist, "maintenance set btrace pt ",
- all_commands, gdb_stdout);
-}
-
-/* The "maintenance show btrace pt" command. */
-
-static void
-maint_btrace_pt_show_cmd (const char *args, int from_tty)
-{
- help_list (maint_btrace_pt_show_cmdlist, "maintenance show btrace pt ",
- all_commands, gdb_stdout);
-}
-
/* The "maintenance info btrace" command. */
static void
/* Initialize btrace maintenance commands. */
+void _initialize_btrace ();
void
-_initialize_btrace (void)
+_initialize_btrace ()
{
add_cmd ("btrace", class_maintenance, maint_info_btrace_cmd,
_("Info about branch tracing data."), &maintenanceinfolist);
- add_prefix_cmd ("btrace", class_maintenance, maint_btrace_cmd,
- _("Branch tracing maintenance commands."),
- &maint_btrace_cmdlist, "maintenance btrace ",
- 0, &maintenancelist);
+ add_basic_prefix_cmd ("btrace", class_maintenance,
+ _("Branch tracing maintenance commands."),
+ &maint_btrace_cmdlist, 0, &maintenancelist);
- add_prefix_cmd ("btrace", class_maintenance, maint_btrace_set_cmd, _("\
+ add_basic_prefix_cmd ("btrace", class_maintenance, _("\
Set branch tracing specific variables."),
- &maint_btrace_set_cmdlist, "maintenance set btrace ",
- 0, &maintenance_set_cmdlist);
+ &maint_btrace_set_cmdlist,
+ 0, &maintenance_set_cmdlist);
- add_prefix_cmd ("pt", class_maintenance, maint_btrace_pt_set_cmd, _("\
+ add_basic_prefix_cmd ("pt", class_maintenance, _("\
Set Intel Processor Trace specific variables."),
- &maint_btrace_pt_set_cmdlist, "maintenance set btrace pt ",
- 0, &maint_btrace_set_cmdlist);
+ &maint_btrace_pt_set_cmdlist,
+ 0, &maint_btrace_set_cmdlist);
- add_prefix_cmd ("btrace", class_maintenance, maint_btrace_show_cmd, _("\
+ add_show_prefix_cmd ("btrace", class_maintenance, _("\
Show branch tracing specific variables."),
- &maint_btrace_show_cmdlist, "maintenance show btrace ",
- 0, &maintenance_show_cmdlist);
+ &maint_btrace_show_cmdlist,
+ 0, &maintenance_show_cmdlist);
- add_prefix_cmd ("pt", class_maintenance, maint_btrace_pt_show_cmd, _("\
+ add_show_prefix_cmd ("pt", class_maintenance, _("\
Show Intel Processor Trace specific variables."),
- &maint_btrace_pt_show_cmdlist, "maintenance show btrace pt ",
- 0, &maint_btrace_show_cmdlist);
+ &maint_btrace_pt_show_cmdlist,
+ 0, &maint_btrace_show_cmdlist);
add_setshow_boolean_cmd ("skip-pad", class_maintenance,
&maint_btrace_pt_skip_pad, _("\