diff options
Diffstat (limited to 'tools/perf/builtin-report.c')
-rw-r--r-- | tools/perf/builtin-report.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index ac145fae0521..140a6cd88351 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -257,6 +257,13 @@ static int report__setup_sample_type(struct report *rep) | |||
257 | } | 257 | } |
258 | } | 258 | } |
259 | 259 | ||
260 | if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) { | ||
261 | if ((sample_type & PERF_SAMPLE_REGS_USER) && | ||
262 | (sample_type & PERF_SAMPLE_STACK_USER)) | ||
263 | callchain_param.record_mode = CALLCHAIN_DWARF; | ||
264 | else | ||
265 | callchain_param.record_mode = CALLCHAIN_FP; | ||
266 | } | ||
260 | return 0; | 267 | return 0; |
261 | } | 268 | } |
262 | 269 | ||
@@ -288,12 +295,14 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report | |||
288 | evname = buf; | 295 | evname = buf; |
289 | 296 | ||
290 | for_each_group_member(pos, evsel) { | 297 | for_each_group_member(pos, evsel) { |
298 | const struct hists *pos_hists = evsel__hists(pos); | ||
299 | |||
291 | if (symbol_conf.filter_relative) { | 300 | if (symbol_conf.filter_relative) { |
292 | nr_samples += pos->hists.stats.nr_non_filtered_samples; | 301 | nr_samples += pos_hists->stats.nr_non_filtered_samples; |
293 | nr_events += pos->hists.stats.total_non_filtered_period; | 302 | nr_events += pos_hists->stats.total_non_filtered_period; |
294 | } else { | 303 | } else { |
295 | nr_samples += pos->hists.stats.nr_events[PERF_RECORD_SAMPLE]; | 304 | nr_samples += pos_hists->stats.nr_events[PERF_RECORD_SAMPLE]; |
296 | nr_events += pos->hists.stats.total_period; | 305 | nr_events += pos_hists->stats.total_period; |
297 | } | 306 | } |
298 | } | 307 | } |
299 | } | 308 | } |
@@ -318,7 +327,7 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist, | |||
318 | struct perf_evsel *pos; | 327 | struct perf_evsel *pos; |
319 | 328 | ||
320 | evlist__for_each(evlist, pos) { | 329 | evlist__for_each(evlist, pos) { |
321 | struct hists *hists = &pos->hists; | 330 | struct hists *hists = evsel__hists(pos); |
322 | const char *evname = perf_evsel__name(pos); | 331 | const char *evname = perf_evsel__name(pos); |
323 | 332 | ||
324 | if (symbol_conf.event_group && | 333 | if (symbol_conf.event_group && |
@@ -427,7 +436,7 @@ static void report__collapse_hists(struct report *rep) | |||
427 | ui_progress__init(&prog, rep->nr_entries, "Merging related events..."); | 436 | ui_progress__init(&prog, rep->nr_entries, "Merging related events..."); |
428 | 437 | ||
429 | evlist__for_each(rep->session->evlist, pos) { | 438 | evlist__for_each(rep->session->evlist, pos) { |
430 | struct hists *hists = &pos->hists; | 439 | struct hists *hists = evsel__hists(pos); |
431 | 440 | ||
432 | if (pos->idx == 0) | 441 | if (pos->idx == 0) |
433 | hists->symbol_filter_str = rep->symbol_filter_str; | 442 | hists->symbol_filter_str = rep->symbol_filter_str; |
@@ -437,7 +446,7 @@ static void report__collapse_hists(struct report *rep) | |||
437 | /* Non-group events are considered as leader */ | 446 | /* Non-group events are considered as leader */ |
438 | if (symbol_conf.event_group && | 447 | if (symbol_conf.event_group && |
439 | !perf_evsel__is_group_leader(pos)) { | 448 | !perf_evsel__is_group_leader(pos)) { |
440 | struct hists *leader_hists = &pos->leader->hists; | 449 | struct hists *leader_hists = evsel__hists(pos->leader); |
441 | 450 | ||
442 | hists__match(leader_hists, hists); | 451 | hists__match(leader_hists, hists); |
443 | hists__link(leader_hists, hists); | 452 | hists__link(leader_hists, hists); |
@@ -485,6 +494,7 @@ static int __cmd_report(struct report *rep) | |||
485 | 494 | ||
486 | if (dump_trace) { | 495 | if (dump_trace) { |
487 | perf_session__fprintf_nr_events(session, stdout); | 496 | perf_session__fprintf_nr_events(session, stdout); |
497 | perf_evlist__fprintf_nr_events(session->evlist, stdout); | ||
488 | return 0; | 498 | return 0; |
489 | } | 499 | } |
490 | } | 500 | } |
@@ -500,7 +510,7 @@ static int __cmd_report(struct report *rep) | |||
500 | } | 510 | } |
501 | 511 | ||
502 | evlist__for_each(session->evlist, pos) | 512 | evlist__for_each(session->evlist, pos) |
503 | hists__output_resort(&pos->hists); | 513 | hists__output_resort(evsel__hists(pos)); |
504 | 514 | ||
505 | return report__browse_hists(rep); | 515 | return report__browse_hists(rep); |
506 | } | 516 | } |
@@ -565,7 +575,6 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) | |||
565 | struct stat st; | 575 | struct stat st; |
566 | bool has_br_stack = false; | 576 | bool has_br_stack = false; |
567 | int branch_mode = -1; | 577 | int branch_mode = -1; |
568 | int ret = -1; | ||
569 | char callchain_default_opt[] = "fractal,0.5,callee"; | 578 | char callchain_default_opt[] = "fractal,0.5,callee"; |
570 | const char * const report_usage[] = { | 579 | const char * const report_usage[] = { |
571 | "perf report [<options>]", | 580 | "perf report [<options>]", |
@@ -692,6 +701,10 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) | |||
692 | struct perf_data_file file = { | 701 | struct perf_data_file file = { |
693 | .mode = PERF_DATA_MODE_READ, | 702 | .mode = PERF_DATA_MODE_READ, |
694 | }; | 703 | }; |
704 | int ret = hists__init(); | ||
705 | |||
706 | if (ret < 0) | ||
707 | return ret; | ||
695 | 708 | ||
696 | perf_config(report__config, &report); | 709 | perf_config(report__config, &report); |
697 | 710 | ||