aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-report.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-report.c')
-rw-r--r--tools/perf/builtin-report.c31
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