33#include "gdbsupport/rsp-low.h"
60#define DEBUG(msg, args...) \
63 if (record_debug != 0) \
64 gdb_printf (gdb_stdlog, \
65 "[btrace] " msg "\n", ##args); \
69#define DEBUG_FTRACE(msg, args...) DEBUG ("[ftrace] " msg, ##args)
106 filename =
"<unknown>";
120 return core_addr_to_string_nz (insn->
pc);
128 const char *fun, *file;
129 unsigned int ibegin, iend;
137 iend = ibegin + bfun->
insn.size ();
139 DEBUG_FTRACE (
"%s: fun = %s, file = %s, level = %d, insn = [%u; %u)",
140 prefix, fun, file, level, ibegin, iend);
155 return bfun->
insn.size ();
198 if (mfun != NULL && msym != NULL
203 if (fun != NULL && sym != NULL)
205 const char *bfname, *fname;
214 if (filename_cmp (fname, bfname) != 0)
219 if (!(msym == NULL && sym == NULL) && mfun == NULL && fun == NULL)
223 if (msym == NULL && sym == NULL && !(mfun == NULL && fun == NULL))
267 btrace_function_flags
flags)
285 btrace_function_flags
flags)
300 for (; next != 0; next = bfun->
next)
316 const unsigned int length = btinfo->
functions.size ();
336 const unsigned int length = btinfo->
functions.size ();
432 gdb_assert (caller->
next == 0);
441 bfun->
up = caller->
up;
461 while (
prev->up != 0)
522 std::vector<unsigned int> &gaps)
537 gaps.push_back (bfun->
number);
563 if (fun == NULL && mfun == NULL)
564 DEBUG_FTRACE (
"no symbol at %s", core_addr_to_string_nz (pc));
579 if (!bfun->
insn.empty ())
580 last = &bfun->
insn.back ();
600 if (strcmp (fname,
"_dl_runtime_resolve") == 0)
608 if (last->
pc + last->
size == pc)
628 if (strncmp (fname,
"_Unwind_", strlen (
"_Unwind_")) == 0)
690 catch (
const gdb_exception_error &error)
708 for (matches = 0; lhs != NULL && rhs != NULL; ++matches)
735 bfun->
level += adjustment;
754 unsigned int length = btinfo->
functions.size() - 1;
755 for (
unsigned int i = 0; i < length; ++i)
762 if (last->
insn.size () != 1)
783 gdb_assert (
prev->next == 0);
784 gdb_assert (next->prev == 0);
786 prev->next = next->number;
787 next->prev =
prev->number;
795 const btrace_function_flags
flags = next->flags;
804 else if (next->up == 0)
806 const btrace_function_flags
flags =
prev->flags;
830 btrace_function_flags next_flags, prev_flags;
834 next_flags = next->flags;
835 prev_flags =
prev->flags;
889 while (lhs != NULL && rhs != NULL)
920 DEBUG_FTRACE (
"checking gap at insn %u (req matches: %d)",
930 for (cand_l = lhs; cand_l != NULL;
932 for (cand_r = rhs; cand_r != NULL;
938 if (best_matches < matches)
940 best_matches = matches;
947 gdb_assert (min_matches > 0);
948 if (best_matches < min_matches)
976 std::vector<unsigned int> remaining;
979 DEBUG (
"bridge gaps");
987 for (min_matches = 5; min_matches > 0; --min_matches)
991 while (!gaps.empty ())
993 for (
const unsigned int number : gaps)
1006 if (lhs == NULL || lhs->
errcode != 0)
1011 while (rhs != NULL && rhs->
errcode != 0)
1024 remaining.push_back (
number);
1028 if (remaining.size () == gaps.size ())
1032 gaps.swap (remaining);
1051 const struct btrace_data_bts *btrace,
1052 std::vector<unsigned int> &gaps)
1067 blk = btrace->blocks->size ();
1072 level = -btinfo->
level;
1080 const btrace_block &
block = btrace->blocks->at (blk);
1095 warning (_(
"Recorded trace may be corrupted at instruction "
1097 core_addr_to_string_nz (
pc));
1107 level = std::min (level, bfun->
level);
1114 catch (
const gdb_exception_error &error)
1136 warning (_(
"Recorded trace may be incomplete at instruction %u "
1138 core_addr_to_string_nz (
pc));
1152 level = std::min (level, bfun->
level);
1159 btinfo->
level = -level;
1162#if defined (HAVE_LIBIPT)
1165pt_reclassify_insn (
enum pt_insn_class
iclass)
1185static btrace_insn_flags
1186pt_btrace_insn_flags (
const struct pt_insn &insn)
1188 btrace_insn_flags
flags = 0;
1190 if (insn.speculative)
1199pt_btrace_insn (
const struct pt_insn &insn)
1201 return {(CORE_ADDR) insn.ip, (gdb_byte) insn.
size,
1202 pt_reclassify_insn (insn.iclass),
1203 pt_btrace_insn_flags (insn)};
1210 struct pt_insn_decoder *decoder,
1211 std::vector<unsigned int> &gaps,
int status)
1213#if defined (HAVE_PT_INSN_EVENT)
1214 while (
status & pts_event_pending)
1217 struct pt_event event;
1220 status = pt_insn_event (decoder, &event,
sizeof (event));
1230 if (event.status_update != 0)
1233 if (event.variant.enabled.resumed == 0 && !btinfo->
functions.empty ())
1237 pt_insn_get_offset (decoder, &offset);
1239 warning (_(
"Non-contiguous trace at instruction %u (offset = 0x%"
1248 pt_insn_get_offset (decoder, &offset);
1250 warning (_(
"Overflow at instruction %u (offset = 0x%" PRIx64
")."),
1265 struct pt_insn_decoder *decoder,
1266 const struct pt_insn &insn,
1267 std::vector<unsigned int> &gaps)
1269#if defined (HAVE_STRUCT_PT_INSN_ENABLED)
1275 if (insn.enabled && !btinfo->
functions.empty ())
1282 pt_insn_get_offset (decoder, &offset);
1284 warning (_(
"Non-contiguous trace at instruction %u (offset = 0x%" PRIx64
1285 ", pc = 0x%" PRIx64
")."), bfun->
insn_offset - 1, offset,
1290#if defined (HAVE_STRUCT_PT_INSN_RESYNCED)
1299 pt_insn_get_offset (decoder, &offset);
1301 warning (_(
"Overflow at instruction %u (offset = 0x%" PRIx64
", pc = 0x%"
1311 struct pt_insn_decoder *decoder,
1313 std::vector<unsigned int> &gaps)
1321 struct pt_insn insn;
1323 status = pt_insn_sync_forward (decoder);
1327 warning (_(
"Failed to synchronize onto the Intel Processor "
1328 "Trace stream: %s."), pt_errstr (pt_errcode (
status)));
1335 status = handle_pt_insn_events (btinfo, decoder, gaps,
status);
1339 status = pt_insn_next (decoder, &insn,
sizeof(insn));
1344 handle_pt_insn_event_flags (btinfo, decoder, insn, gaps);
1349 *plevel = std::min (*plevel, bfun->
level);
1360 pt_insn_get_offset (decoder, &offset);
1362 warning (_(
"Decode error (%d) at instruction %u (offset = 0x%" PRIx64
1364 offset, insn.ip, pt_errstr (pt_errcode (
status)));
1372btrace_pt_readmem_callback (gdb_byte *buffer,
size_t size,
1373 const struct pt_asid *asid, uint64_t pc,
1376 int result, errcode;
1378 result = (int)
size;
1383 result = -pte_nomap;
1385 catch (
const gdb_exception_error &error)
1387 result = -pte_nomap;
1395static enum pt_cpu_vendor
1396pt_translate_cpu_vendor (
enum btrace_cpu_vendor vendor)
1410static void btrace_finalize_ftrace_pt (
struct pt_insn_decoder *decoder,
1413 pt_insn_free_decoder (decoder);
1418 tp->
btrace.level = -level;
1432 const struct btrace_data_pt *btrace,
1433 std::vector<unsigned int> &gaps)
1442 struct pt_insn_decoder *decoder;
1443 struct pt_config config;
1446 if (btrace->size == 0)
1453 level = -btinfo->
level;
1455 pt_config_init(&config);
1456 config.begin = btrace->data;
1457 config.end = btrace->data + btrace->size;
1460 if (btrace->config.cpu.vendor != CV_UNKNOWN)
1463 = pt_translate_cpu_vendor (btrace->config.cpu.vendor);
1464 config.cpu.family = btrace->config.cpu.family;
1465 config.cpu.model = btrace->config.cpu.model;
1466 config.cpu.stepping = btrace->config.cpu.stepping;
1468 errcode = pt_cpu_errata (&config.errata, &config.cpu);
1470 error (_(
"Failed to configure the Intel Processor Trace "
1471 "decoder: %s."), pt_errstr (pt_errcode (errcode)));
1474 decoder = pt_insn_alloc_decoder (&config);
1475 if (decoder == NULL)
1476 error (_(
"Failed to allocate the Intel Processor Trace decoder."));
1480 struct pt_image *image;
1482 image = pt_insn_get_image(decoder);
1484 error (_(
"Failed to configure the Intel Processor Trace decoder."));
1486 errcode = pt_image_set_callback(image, btrace_pt_readmem_callback, NULL);
1488 error (_(
"Failed to configure the Intel Processor Trace decoder: "
1489 "%s."), pt_errstr (pt_errcode (errcode)));
1491 ftrace_add_pt (btinfo, decoder, &level, gaps);
1493 catch (
const gdb_exception &error)
1496 if (error.reason == RETURN_QUIT && !btinfo->
functions.empty ())
1499 btrace_finalize_ftrace_pt (decoder, tp, level);
1504 btrace_finalize_ftrace_pt (decoder, tp, level);
1511 const struct btrace_data_pt *btrace,
1512 std::vector<unsigned int> &gaps)
1514 internal_error (_(
"Unexpected branch trace format."));
1526 struct btrace_data *btrace,
1527 const struct btrace_cpu *cpu,
1528 std::vector<unsigned int> &gaps)
1530 DEBUG (
"compute ftrace");
1532 switch (btrace->format)
1534 case BTRACE_FORMAT_NONE:
1537 case BTRACE_FORMAT_BTS:
1541 case BTRACE_FORMAT_PT:
1544 btrace->variant.pt.config.cpu = *cpu;
1550 internal_error (_(
"Unknown branch trace format."));
1558 tp->
btrace.ngaps += gaps.size ();
1565 const struct btrace_cpu *cpu)
1567 std::vector<unsigned int> gaps;
1573 catch (
const gdb_exception &error)
1588 struct btrace_data btrace;
1595 btrace.format = BTRACE_FORMAT_BTS;
1596 btrace.variant.bts.blocks =
new std::vector<btrace_block>;
1598 btrace.variant.bts.blocks->emplace_back (pc, pc);
1608 if (tp->
btrace.target != NULL)
1609 error (_(
"Recording already enabled on thread %s (%s)."),
1612#if !defined (HAVE_LIBIPT)
1613 if (conf->format == BTRACE_FORMAT_PT)
1614 error (_(
"Intel Processor Trace support was disabled at compile time."));
1618 tp->
ptid.to_string ().c_str ());
1622 if (tp->
btrace.target == NULL)
1623 error (_(
"Failed to enable recording on thread %s (%s)."),
1638 if (conf->format != BTRACE_FORMAT_PT
1642 catch (
const gdb_exception &exception)
1652const struct btrace_config *
1655 if (btinfo->
target == NULL)
1669 error (_(
"Recording not enabled on thread %s (%s)."),
1673 tp->
ptid.to_string ().c_str ());
1692 tp->
ptid.to_string ().c_str ());
1707 btrace_block *first_new_block;
1710 gdb_assert (!btinfo->
functions.empty ());
1711 gdb_assert (!btrace->blocks->empty ());
1718 if (last_bfun->
insn.empty ())
1720 btrace->blocks->pop_back ();
1727 first_new_block = &btrace->blocks->back ();
1738 if (first_new_block->end == last_insn.
pc && btrace->blocks->size () == 1)
1740 btrace->blocks->pop_back ();
1745 core_addr_to_string_nz (first_new_block->end));
1749 if (first_new_block->end < last_insn.
pc)
1751 warning (_(
"Error while trying to read delta trace. Falling back to "
1757 gdb_assert (first_new_block->begin == 0);
1758 first_new_block->begin = last_insn.
pc;
1764 DEBUG (
"pruning insn at %s for stitching",
1767 last_bfun->
insn.pop_back ();
1778 if (last_bfun->
number == 1 && last_bfun->
insn.empty ())
1794 if (btrace->empty ())
1797 switch (btrace->format)
1799 case BTRACE_FORMAT_NONE:
1802 case BTRACE_FORMAT_BTS:
1805 case BTRACE_FORMAT_PT:
1810 internal_error (_(
"Unknown branch trace format."));
1832 switch (btinfo->
data.format)
1837 case BTRACE_FORMAT_BTS:
1842#if defined (HAVE_LIBIPT)
1843 case BTRACE_FORMAT_PT:
1861 case BTRACE_FORMAT_BTS:
1865 return _(
"instruction overflow");
1868 return _(
"unknown instruction");
1875#if defined (HAVE_LIBIPT)
1876 case BTRACE_FORMAT_PT:
1880 return _(
"trace decode cancelled");
1883 return _(
"disabled");
1886 return _(
"overflow");
1890 return pt_errstr (pt_errcode (
errcode));
1900 return _(
"unknown");
1909 struct btrace_target_info *tinfo;
1910 struct btrace_data btrace;
1914 tp->
ptid.to_string ().c_str ());
1924 if (btinfo->
replay != NULL)
1952 if (errcode == 0 && !btrace.empty ())
1968 error (_(
"Failed to read branch trace."));
1971 if (!btrace.empty ())
1975 btrace_data_append (&btinfo->
data, &btrace);
1991 tp->
ptid.to_string ().c_str ());
2004 btinfo->
data.clear ();
2013 DEBUG (
"free objfile");
2025 unsigned int index, end;
2035 end = bfun->
insn.size ();
2036 gdb_assert (0 < end);
2037 gdb_assert (index < end);
2039 return &bfun->
insn[index];
2065 error (_(
"No trace."));
2079 unsigned int length;
2082 error (_(
"No trace."));
2085 length = bfun->
insn.size ();
2104 unsigned int index, steps;
2112 unsigned int end, space, adv;
2114 end = bfun->
insn.size ();
2135 gdb_assert (0 < end);
2136 gdb_assert (index < end);
2139 space = end - index;
2142 adv = std::min (space, stride);
2170 gdb_assert (adv > 0);
2186 unsigned int index, steps;
2207 index = bfun->
insn.size ();
2221 adv = std::min (index, stride);
2228 gdb_assert (adv > 0);
2260 unsigned int upper, lower;
2278 const unsigned int average = lower + (upper - lower) / 2;
2284 upper = average - 1;
2290 lower = average + 1;
2344 return it->
index + 1;
2354 error (_(
"No trace."));
2367 error (_(
"No trace."));
2380 if (it->
index + stride < length - 1)
2382 it->
index += stride;
2383 else if (it->
index + stride == length - 1)
2391 it->
index = length - 1;
2399 stride = length - it->
index - 1;
2401 stride = length - it->
index;
2417 gdb_assert (it->
index <= length);
2419 if (stride == 0 || it->
index == 0)
2426 if ((it->
index == length) && (length > 1))
2429 it->
index = length - 2;
2431 it->
index = length - 1;
2437 stride = std::min (stride, it->
index);
2439 it->
index -= stride;
2440 return steps + stride;
2460 const unsigned int length = btinfo->
functions.size ();
2505 return tp->
btrace.replay != NULL;
2527#if defined (HAVE_LIBIPT)
2532pt_print_packet (
const struct pt_packet *packet)
2534 switch (packet->type)
2554 packet->payload.ip.ipc,
2555 packet->payload.ip.ip);
2560 packet->payload.ip.ipc,
2561 packet->payload.ip.ip);
2566 packet->payload.ip.ipc,
2567 packet->payload.ip.ip);
2572 packet->payload.ip.ipc,
2573 packet->payload.ip.ip);
2578 packet->payload.tnt.bit_size,
2579 packet->payload.tnt.payload);
2584 packet->payload.tnt.bit_size,
2585 packet->payload.tnt.payload);
2589 gdb_printf ((
"pip %" PRIx64
"%s"), packet->payload.pip.cr3,
2590 packet->payload.pip.nr ? (
" nr") : (
""));
2594 gdb_printf ((
"tsc %" PRIx64
""), packet->payload.tsc.tsc);
2598 gdb_printf ((
"cbr %u"), packet->payload.cbr.ratio);
2602 switch (packet->payload.mode.leaf)
2605 gdb_printf ((
"mode %u"), packet->payload.mode.leaf);
2610 packet->payload.mode.bits.exec.csl
2612 packet->payload.mode.
bits.exec.csd
2613 ? (
" cs.d") : (
""));
2618 packet->payload.mode.bits.tsx.intx
2620 packet->payload.mode.
bits.tsx.abrt
2621 ? (
" abrt") : (
""));
2635 gdb_printf ((
"vmcs %" PRIx64
""), packet->payload.vmcs.base);
2639 gdb_printf ((
"tma %x %x"), packet->payload.tma.ctc,
2640 packet->payload.tma.fc);
2644 gdb_printf ((
"mtc %x"), packet->payload.mtc.ctc);
2648 gdb_printf ((
"cyc %" PRIx64
""), packet->payload.cyc.value);
2652 gdb_printf ((
"mnt %" PRIx64
""), packet->payload.mnt.payload);
2661 struct pt_packet_decoder *decoder)
2666 maint->
variant.pt.packets =
new std::vector<btrace_pt_packet>;
2670 struct btrace_pt_packet packet;
2672 errcode = pt_pkt_sync_forward (decoder);
2678 pt_pkt_get_offset (decoder, &packet.offset);
2680 errcode = pt_pkt_next (decoder, &packet.packet,
2681 sizeof(packet.packet));
2687 packet.errcode = pt_errcode (errcode);
2688 maint->
variant.pt.packets->push_back (packet);
2692 if (errcode == -pte_eos)
2695 packet.errcode = pt_errcode (errcode);
2696 maint->
variant.pt.packets->push_back (packet);
2698 warning (_(
"Error at trace offset 0x%" PRIx64
": %s."),
2699 packet.offset, pt_errstr (packet.errcode));
2702 if (errcode != -pte_eos)
2703 warning (_(
"Failed to synchronize onto the Intel Processor Trace "
2704 "stream: %s."), pt_errstr (pt_errcode (errcode)));
2712 struct pt_packet_decoder *decoder;
2713 const struct btrace_cpu *cpu;
2714 struct btrace_data_pt *pt;
2715 struct pt_config config;
2718 pt = &btinfo->
data.variant.pt;
2724 memset (&config, 0,
sizeof(config));
2726 config.size =
sizeof (config);
2727 config.begin = pt->data;
2728 config.end = pt->data + pt->size;
2732 cpu = &pt->config.cpu;
2735 if (cpu->vendor != CV_UNKNOWN)
2737 config.cpu.vendor = pt_translate_cpu_vendor (cpu->vendor);
2738 config.cpu.family = cpu->family;
2739 config.cpu.model = cpu->model;
2740 config.cpu.stepping = cpu->stepping;
2742 errcode = pt_cpu_errata (&config.errata, &config.cpu);
2744 error (_(
"Failed to configure the Intel Processor Trace "
2745 "decoder: %s."), pt_errstr (pt_errcode (errcode)));
2748 decoder = pt_pkt_alloc_decoder (&config);
2749 if (decoder == NULL)
2750 error (_(
"Failed to allocate the Intel Processor Trace decoder."));
2754 btrace_maint_decode_pt (&btinfo->
maint, decoder);
2756 catch (
const gdb_exception &except)
2758 pt_pkt_free_decoder (decoder);
2760 if (except.reason < 0)
2764 pt_pkt_free_decoder (decoder);
2775 unsigned int *begin,
unsigned int *end,
2776 unsigned int *from,
unsigned int *to)
2778 switch (btinfo->
data.format)
2787 case BTRACE_FORMAT_BTS:
2790 *end = btinfo->
data.variant.bts.blocks->size ();
2795#if defined (HAVE_LIBIPT)
2796 case BTRACE_FORMAT_PT:
2798 btinfo->
maint.
variant.pt.packets =
new std::vector<btrace_pt_packet>;
2801 btrace_maint_update_pt_packets (btinfo);
2817 unsigned int begin,
unsigned int end)
2819 switch (btinfo->
data.format)
2824 case BTRACE_FORMAT_BTS:
2826 const std::vector<btrace_block> &blocks
2827 = *btinfo->
data.variant.bts.blocks;
2830 for (blk = begin; blk < end; ++blk)
2832 const btrace_block &
block = blocks.at (blk);
2835 core_addr_to_string_nz (
block.begin),
2836 core_addr_to_string_nz (
block.
end));
2844#if defined (HAVE_LIBIPT)
2845 case BTRACE_FORMAT_PT:
2847 const std::vector<btrace_pt_packet> &packets
2851 for (pkt = begin; pkt < end; ++pkt)
2853 const struct btrace_pt_packet &packet = packets.at (pkt);
2856 gdb_printf (
"0x%" PRIx64
"\t", packet.offset);
2858 if (packet.errcode == pte_ok)
2859 pt_print_packet (&packet.packet);
2861 gdb_printf (
"[error: %s]", pt_errstr (packet.errcode));
2879 const char *begin, *pos;
2881 unsigned long number;
2884 pos = skip_spaces (begin);
2886 if (!isdigit (*pos))
2887 error (_(
"Expected positive number, got: %s."), pos);
2889 number = strtoul (pos, &end, 10);
2890 if (number > UINT_MAX)
2891 error (_(
"Number too big."));
2893 *arg += (end - begin);
2895 return (
unsigned int) number;
2903 const char *pos = skip_spaces (*arg);
2905 if (!isdigit (*pos))
2906 error (_(
"Expected positive number, got: %s."), pos);
2909 long result = strtol (pos, &end, 10);
2920 error (_(
"Junk after argument: %s."), arg);
2929 unsigned int size, begin, end, from, to;
2933 error (_(
"No thread."));
2945 if (arg == NULL || *arg == 0 || strcmp (arg,
"+") == 0)
2949 if (end - from <
size)
2953 else if (strcmp (arg,
"-") == 0)
2957 if (to - begin <
size)
2965 error (_(
"'%u' is out of range."), from);
2967 arg = skip_spaces (arg);
2970 arg = skip_spaces (++arg);
2979 if (end - from <
size)
2983 else if (*arg ==
'-')
2994 if (to - begin <
size)
3016 if (end - from <
size)
3032 if (args != NULL && *args != 0)
3033 error (_(
"Invalid argument."));
3036 error (_(
"No thread."));
3043 btinfo->
data.clear ();
3051 if (args != NULL && *args != 0)
3052 error (_(
"Invalid argument."));
3055 error (_(
"No thread."));
3067 const struct btrace_config *conf;
3069 if (args != NULL && *args != 0)
3070 error (_(
"Invalid argument."));
3073 error (_(
"No thread."));
3081 error (_(
"No btrace configuration."));
3084 btrace_format_string (conf->format));
3086 switch (conf->format)
3091 case BTRACE_FORMAT_BTS:
3093 btinfo->
data.variant.bts.blocks->size ());
3096#if defined (HAVE_LIBIPT)
3097 case BTRACE_FORMAT_PT:
3101 version = pt_library_version ();
3106 btrace_maint_update_pt_packets (btinfo);
3137 _(
"Branch tracing maintenance commands."),
3141 _(
"Set branch tracing specific variables."),
3142 _(
"Show branch tracing specific variables."),
3149 _(
"Set Intel Processor Trace specific variables."),
3150 _(
"Show Intel Processor Trace specific variables."),
3158Set whether PAD packets should be skipped in the btrace packet history."), _(
"\
3159Show whether PAD packets should be skipped in the btrace packet history."),_(
"\
3160When enabled, PAD packets are ignored in the btrace packet history."),
3166 _(
"Print the raw branch tracing data.\n\
3167With no argument, print ten more packets after the previous ten-line print.\n\
3168With '-' as argument print ten packets before a previous ten-line print.\n\
3169One argument specifies the starting packet of a ten-line print.\n\
3170Two arguments with comma between specify starting and ending packets to \
3172Preceded with '+'/'-' the second argument specifies the distance from the \
3178 _(
"Clears the branch tracing packet history.\n\
3179Discards the raw branch tracing data but not the execution history data."),
3183 _(
"Clears the branch tracing data.\n\
3184Discards the raw branch tracing data and the execution history data.\n\
3185The next 'record' command will fetch the branch tracing data anew."),
#define bits(obj, st, fn)
struct gdbarch * target_gdbarch(void)
struct symbol * find_pc_function(CORE_ADDR pc)
CORE_ADDR get_pc_function_start(CORE_ADDR pc)
void btrace_enable(struct thread_info *tp, const struct btrace_config *conf)
static void show_maint_btrace_pt_skip_pad(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
static int btrace_stitch_bts(struct btrace_data_bts *btrace, struct thread_info *tp)
static struct btrace_function * ftrace_update_function(struct btrace_thread_info *btinfo, CORE_ADDR pc)
const struct btrace_function * btrace_call_get(const struct btrace_call_iterator *it)
unsigned int btrace_call_prev(struct btrace_call_iterator *it, unsigned int stride)
void _initialize_btrace()
static void no_chunk(const char *arg)
unsigned int btrace_call_next(struct btrace_call_iterator *it, unsigned int stride)
unsigned int btrace_call_number(const struct btrace_call_iterator *it)
static struct cmd_list_element * maint_btrace_show_cmdlist
static enum btrace_insn_class ftrace_classify_insn(struct gdbarch *gdbarch, CORE_ADDR pc)
static int ftrace_bridge_gap(struct btrace_thread_info *btinfo, struct btrace_function *lhs, struct btrace_function *rhs, int min_matches)
void btrace_insn_end(struct btrace_insn_iterator *it, const struct btrace_thread_info *btinfo)
static struct btrace_function * ftrace_new_function(struct btrace_thread_info *btinfo, struct minimal_symbol *mfun, struct symbol *fun)
static struct btrace_function * ftrace_new_switch(struct btrace_thread_info *btinfo, struct minimal_symbol *mfun, struct symbol *fun)
int btrace_insn_cmp(const struct btrace_insn_iterator *lhs, const struct btrace_insn_iterator *rhs)
static bool btrace_ends_with_single_insn(const struct btrace_thread_info *btinfo)
static void btrace_compute_ftrace(struct thread_info *tp, struct btrace_data *btrace, const struct btrace_cpu *cpu)
static struct cmd_list_element * maint_btrace_cmdlist
static void btrace_add_pc(struct thread_info *tp)
static unsigned int ftrace_call_num_insn(const struct btrace_function *bfun)
static void ftrace_fixup_level(struct btrace_thread_info *btinfo, struct btrace_function *bfun, int adjustment)
static struct btrace_function * ftrace_find_call(struct btrace_thread_info *btinfo, struct btrace_function *bfun)
static void maint_btrace_clear_cmd(const char *args, int from_tty)
static void btrace_finalize_ftrace(struct thread_info *tp, std::vector< unsigned int > &gaps)
static const char * ftrace_print_insn_addr(const struct btrace_insn *insn)
static void ftrace_debug(const struct btrace_function *bfun, const char *prefix)
int btrace_find_insn_by_number(struct btrace_insn_iterator *it, const struct btrace_thread_info *btinfo, unsigned int number)
void btrace_free_objfile(struct objfile *objfile)
unsigned int btrace_insn_prev(struct btrace_insn_iterator *it, unsigned int stride)
static int btrace_stitch_trace(struct btrace_data *btrace, struct thread_info *tp)
void btrace_call_begin(struct btrace_call_iterator *it, const struct btrace_thread_info *btinfo)
static void btrace_compute_ftrace_pt(struct thread_info *tp, const struct btrace_data_pt *btrace, std::vector< unsigned int > &gaps)
const char * btrace_decode_error(enum btrace_format format, int errcode)
static void btrace_bridge_gaps(struct thread_info *tp, std::vector< unsigned int > &gaps)
static void ftrace_update_insns(struct btrace_function *bfun, const btrace_insn &insn)
#define DEBUG(msg, args...)
static struct btrace_function * ftrace_new_tailcall(struct btrace_thread_info *btinfo, struct minimal_symbol *mfun, struct symbol *fun)
static int ftrace_match_backtrace(struct btrace_thread_info *btinfo, struct btrace_function *lhs, struct btrace_function *rhs)
static void btrace_compute_ftrace_1(struct thread_info *tp, struct btrace_data *btrace, const struct btrace_cpu *cpu, std::vector< unsigned int > &gaps)
static struct btrace_function * ftrace_get_caller(struct btrace_thread_info *btinfo, struct btrace_function *bfun)
int btrace_find_call_by_number(struct btrace_call_iterator *it, const struct btrace_thread_info *btinfo, unsigned int number)
static void ftrace_update_caller(struct btrace_function *bfun, struct btrace_function *caller, btrace_function_flags flags)
void btrace_set_insn_history(struct btrace_thread_info *btinfo, const struct btrace_insn_iterator *begin, const struct btrace_insn_iterator *end)
void btrace_disable(struct thread_info *tp)
static struct btrace_function * ftrace_new_call(struct btrace_thread_info *btinfo, struct minimal_symbol *mfun, struct symbol *fun)
void btrace_fetch(struct thread_info *tp, const struct btrace_cpu *cpu)
static const char * ftrace_print_filename(const struct btrace_function *bfun)
static struct cmd_list_element * maint_btrace_pt_set_cmdlist
void btrace_set_call_history(struct btrace_thread_info *btinfo, const struct btrace_call_iterator *begin, const struct btrace_call_iterator *end)
static void btrace_clear_history(struct btrace_thread_info *btinfo)
const struct btrace_config * btrace_conf(const struct btrace_thread_info *btinfo)
static int get_context_size(const char **arg)
static void ftrace_connect_backtrace(struct btrace_thread_info *btinfo, struct btrace_function *lhs, struct btrace_function *rhs)
unsigned int btrace_insn_next(struct btrace_insn_iterator *it, unsigned int stride)
static struct btrace_function * ftrace_new_gap(struct btrace_thread_info *btinfo, int errcode, std::vector< unsigned int > &gaps)
static void btrace_maint_print_packets(struct btrace_thread_info *btinfo, unsigned int begin, unsigned int end)
static struct cmd_list_element * maint_btrace_pt_show_cmdlist
static const char * ftrace_print_function_name(const struct btrace_function *bfun)
static void maint_btrace_packet_history_cmd(const char *arg, int from_tty)
static void maint_info_btrace_cmd(const char *args, int from_tty)
static bool maint_btrace_pt_skip_pad
#define DEBUG_FTRACE(msg, args...)
static void ftrace_fixup_caller(struct btrace_thread_info *btinfo, struct btrace_function *bfun, struct btrace_function *caller, btrace_function_flags flags)
const struct btrace_insn * btrace_insn_get(const struct btrace_insn_iterator *it)
static void maint_btrace_clear_packet_history_cmd(const char *args, int from_tty)
void btrace_teardown(struct thread_info *tp)
static struct btrace_function * ftrace_new_return(struct btrace_thread_info *btinfo, struct minimal_symbol *mfun, struct symbol *fun)
static void ftrace_compute_global_level_offset(struct btrace_thread_info *btinfo)
static struct cmd_list_element * maint_btrace_set_cmdlist
static struct btrace_function * ftrace_find_call_by_number(struct btrace_thread_info *btinfo, unsigned int number)
unsigned int btrace_insn_number(const struct btrace_insn_iterator *it)
static struct btrace_function * ftrace_find_caller(struct btrace_thread_info *btinfo, struct btrace_function *bfun, struct minimal_symbol *mfun, struct symbol *fun)
int btrace_insn_get_error(const struct btrace_insn_iterator *it)
static int ftrace_function_switched(const struct btrace_function *bfun, const struct minimal_symbol *mfun, const struct symbol *fun)
static void ftrace_connect_bfun(struct btrace_thread_info *btinfo, struct btrace_function *prev, struct btrace_function *next)
static void btrace_compute_ftrace_bts(struct thread_info *tp, const struct btrace_data_bts *btrace, std::vector< unsigned int > &gaps)
static unsigned int get_uint(const char **arg)
int btrace_is_empty(struct thread_info *tp)
void btrace_insn_begin(struct btrace_insn_iterator *it, const struct btrace_thread_info *btinfo)
void btrace_clear(struct thread_info *tp)
static void btrace_maint_update_packets(struct btrace_thread_info *btinfo, unsigned int *begin, unsigned int *end, unsigned int *from, unsigned int *to)
void btrace_call_end(struct btrace_call_iterator *it, const struct btrace_thread_info *btinfo)
int btrace_is_replaying(struct thread_info *tp)
int btrace_call_cmp(const struct btrace_call_iterator *lhs, const struct btrace_call_iterator *rhs)
static void btrace_maint_clear(struct btrace_thread_info *btinfo)
@ BFUN_UP_LINKS_TO_TAILCALL
@ BTRACE_INSN_FLAG_SPECULATIVE
thread_info * find_thread(ptid_t ptid)
struct cmd_list_element * maintenancelist
struct cmd_list_element * maintenanceinfolist
struct cmd_list_element * maintenance_show_cmdlist
struct cmd_list_element * maintenance_set_cmdlist
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, const char *doc, struct cmd_list_element **list)
set_show_commands add_setshow_prefix_cmd(const char *name, command_class theclass, const char *set_doc, const char *show_doc, cmd_list_element **set_subcommands_list, cmd_list_element **show_subcommands_list, cmd_list_element **set_list, cmd_list_element **show_list)
set_show_commands add_setshow_boolean_cmd(const char *name, enum command_class theclass, bool *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
struct cmd_list_element * add_basic_prefix_cmd(const char *name, enum command_class theclass, const char *doc, struct cmd_list_element **subcommands, int allow_unknown, struct cmd_list_element **list)
int gdb_insn_length(struct gdbarch *gdbarch, CORE_ADDR addr)
void reinit_frame_cache(void)
int gdbarch_insn_is_call(struct gdbarch *gdbarch, CORE_ADDR addr)
int gdbarch_insn_is_ret(struct gdbarch *gdbarch, CORE_ADDR addr)
int gdbarch_insn_is_jump(struct gdbarch *gdbarch, CORE_ADDR addr)
all_non_exited_threads_range all_non_exited_threads(process_stratum_target *proc_target=nullptr, ptid_t filter_ptid=minus_one_ptid)
struct thread_info * inferior_thread(void)
void switch_to_thread(struct thread_info *thr)
bool can_access_registers_thread(struct thread_info *thread)
const char * print_thread_id(struct thread_info *thr)
mach_port_t kern_return_t mach_port_t mach_msg_type_name_t msgportsPoly mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
struct inferior * current_inferior(void)
struct bound_minimal_symbol lookup_minimal_symbol_by_pc(CORE_ADDR pc)
#define prefix(a, b, R, do)
const struct btrace_cpu * record_btrace_get_cpu(void)
unsigned int record_debug
CORE_ADDR regcache_read_pc(struct regcache *regcache)
struct regcache * get_thread_regcache(process_stratum_target *target, ptid_t ptid)
const char * symtab_to_fullname(struct symtab *s)
const char * symtab_to_filename_for_display(struct symtab *symtab)
struct minimal_symbol * minsym
struct btrace_call_iterator begin
struct btrace_call_iterator end
const struct btrace_thread_info * btinfo
btrace_function_flags flags
struct minimal_symbol * msym
std::vector< btrace_insn > insn
struct btrace_insn_iterator begin
struct btrace_insn_iterator end
const struct btrace_thread_info * btinfo
enum btrace_insn_class iclass
union btrace_maint_info::@22 variant
struct btrace_maint_info::@22::@23 bts
struct btrace_maint_packet_history packet_history
struct btrace_target_info * target
std::vector< btrace_function > functions
struct btrace_insn_iterator * replay
struct btrace_maint_info maint
struct btrace_call_history * call_history
struct btrace_insn_history * insn_history
const char * print_name() const
const char * linkage_name() const
int target_read_code(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
void target_disable_btrace(struct btrace_target_info *btinfo)
struct btrace_target_info * target_enable_btrace(thread_info *tp, const struct btrace_config *conf)
void target_teardown_btrace(struct btrace_target_info *btinfo)
std::string target_pid_to_str(ptid_t ptid)
enum btrace_error target_read_btrace(struct btrace_data *btrace, struct btrace_target_info *btinfo, enum btrace_read_type type)
const struct btrace_config * target_btrace_conf(const struct btrace_target_info *btinfo)
void gdb_printf(struct ui_file *stream, const char *format,...)