int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al, int left_alignment, unsigned int print_opts, struct callchain_cursor *cursor, FILE *fp) { int printed = 0; int print_ip = print_opts & EVSEL__PRINT_IP; int print_sym = print_opts & EVSEL__PRINT_SYM; int print_dso = print_opts & EVSEL__PRINT_DSO; int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR; if (cursor != NULL) { printed += sample__fprintf_callchain(sample, left_alignment, print_opts, cursor, fp); } else { printed += fprintf(fp, "%-*.*s", left_alignment, left_alignment, " "); if (print_ip) printed += fprintf(fp, "%16" PRIx64, sample->ip); if (print_sym) { printed += fprintf(fp, " "); if (print_symoffset) { printed += __symbol__fprintf_symname_offs(al->sym, al, print_unknown_as_addr, true, fp); } else { printed += __symbol__fprintf_symname(al->sym, al, print_unknown_as_addr, fp); } } if (print_dso) { printed += fprintf(fp, " ("); printed += map__fprintf_dsoname(al->map, fp); printed += fprintf(fp, ")"); } if (print_srcline) printed += map__fprintf_srcline(al->map, al->addr, "\n ", fp); } return printed; }
int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, unsigned int print_opts, struct callchain_cursor *cursor, FILE *fp) { int printed = 0; struct callchain_cursor_node *node; int print_ip = print_opts & EVSEL__PRINT_IP; int print_sym = print_opts & EVSEL__PRINT_SYM; int print_dso = print_opts & EVSEL__PRINT_DSO; int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; int print_oneline = print_opts & EVSEL__PRINT_ONELINE; int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR; char s = print_oneline ? ' ' : '\t'; if (sample->callchain) { struct addr_location node_al; callchain_cursor_commit(cursor); while (1) { u64 addr = 0; node = callchain_cursor_current(cursor); if (!node) break; if (node->sym && node->sym->ignore) goto next; printed += fprintf(fp, "%-*.*s", left_alignment, left_alignment, " "); if (print_ip) printed += fprintf(fp, "%c%16" PRIx64, s, node->ip); if (node->map) addr = node->map->map_ip(node->map, node->ip); if (print_sym) { printed += fprintf(fp, " "); node_al.addr = addr; node_al.map = node->map; if (print_symoffset) { printed += __symbol__fprintf_symname_offs(node->sym, &node_al, print_unknown_as_addr, fp); } else { printed += __symbol__fprintf_symname(node->sym, &node_al, print_unknown_as_addr, fp); } } if (print_dso) { printed += fprintf(fp, " ("); printed += map__fprintf_dsoname(node->map, fp); printed += fprintf(fp, ")"); } if (print_srcline) printed += map__fprintf_srcline(node->map, addr, "\n ", fp); if (!print_oneline) printed += fprintf(fp, "\n"); next: callchain_cursor_advance(cursor); } } return printed; }
int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, unsigned int print_opts, struct callchain_cursor *cursor, FILE *fp) { int printed = 0; struct callchain_cursor_node *node; int print_ip = print_opts & EVSEL__PRINT_IP; int print_sym = print_opts & EVSEL__PRINT_SYM; int print_dso = print_opts & EVSEL__PRINT_DSO; int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; int print_oneline = print_opts & EVSEL__PRINT_ONELINE; int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR; int print_arrow = print_opts & EVSEL__PRINT_CALLCHAIN_ARROW; int print_skip_ignored = print_opts & EVSEL__PRINT_SKIP_IGNORED; char s = print_oneline ? ' ' : '\t'; bool first = true; if (sample->callchain) { struct addr_location node_al; callchain_cursor_commit(cursor); while (1) { u64 addr = 0; node = callchain_cursor_current(cursor); if (!node) break; if (node->sym && node->sym->ignore && print_skip_ignored) goto next; printed += fprintf(fp, "%-*.*s", left_alignment, left_alignment, " "); if (print_arrow && !first) printed += fprintf(fp, " <-"); if (print_ip) printed += fprintf(fp, "%c%16" PRIx64, s, node->ip); if (node->map) addr = node->map->map_ip(node->map, node->ip); if (print_sym) { printed += fprintf(fp, " "); node_al.addr = addr; node_al.map = node->map; if (print_symoffset) { printed += __symbol__fprintf_symname_offs(node->sym, &node_al, print_unknown_as_addr, true, fp); } else { printed += __symbol__fprintf_symname(node->sym, &node_al, print_unknown_as_addr, fp); } } if (print_dso && (!node->sym || !node->sym->inlined)) { printed += fprintf(fp, " ("); printed += map__fprintf_dsoname(node->map, fp); printed += fprintf(fp, ")"); } if (print_srcline) printed += map__fprintf_srcline(node->map, addr, "\n ", fp); if (node->sym && node->sym->inlined) printed += fprintf(fp, " (inlined)"); if (!print_oneline) printed += fprintf(fp, "\n"); /* Add srccode here too? */ if (symbol_conf.bt_stop_list && node->sym && strlist__has_entry(symbol_conf.bt_stop_list, node->sym->name)) { break; } first = false; next: callchain_cursor_advance(cursor); } } return printed; }