diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /tools/perf/builtin-report.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'tools/perf/builtin-report.c')
| -rw-r--r-- | tools/perf/builtin-report.c | 63 | 
1 files changed, 46 insertions, 17 deletions
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 2ee2ecca208e..92c6797e7cba 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -143,6 +143,10 @@ static int report__config(const char *var, const char *value, void *cb)  	if (!strcmp(var, "report.sort_order")) {  		default_sort_order = strdup(value); +		if (!default_sort_order) { +			pr_err("Not enough memory for report.sort_order\n"); +			return -1; +		}  		return 0;  	} @@ -151,6 +155,7 @@ static int report__config(const char *var, const char *value, void *cb)  		return 0;  	} +	pr_debug("%s variable unknown, ignoring...", var);  	return 0;  } @@ -314,7 +319,7 @@ static int process_sample_event(struct perf_tool *tool,  	}  	if (al.map != NULL) -		al.map->dso->hit = 1; +		map__dso(al.map)->hit = 1;  	if (ui__has_annotation() || rep->symbol_ipc || rep->total_cycles_mode) {  		hist__account_cycles(sample->branch_stack, &al, sample, @@ -603,7 +608,7 @@ static void report__warn_kptr_restrict(const struct report *rep)  		return;  	if (kernel_map == NULL || -	    (kernel_map->dso->hit && +	     (map__dso(kernel_map)->hit &&  	     (kernel_kmap->ref_reloc_sym == NULL ||  	      kernel_kmap->ref_reloc_sym->addr == 0))) {  		const char *desc = @@ -723,8 +728,7 @@ static int hists__resort_cb(struct hist_entry *he, void *arg)  	if (rep->symbol_ipc && sym && !sym->annotate2) {  		struct evsel *evsel = hists_to_evsel(he->hists); -		symbol__annotate2(&he->ms, evsel, -				  &annotation__default_options, NULL); +		symbol__annotate2(&he->ms, evsel, &rep->annotation_opts, NULL);  	}  	return 0; @@ -840,17 +844,21 @@ static struct task *tasks_list(struct task *task, struct machine *machine)  static size_t maps__fprintf_task(struct maps *maps, int indent, FILE *fp)  {  	size_t printed = 0; -	struct map *map; +	struct map_rb_node *rb_node; + +	maps__for_each_entry(maps, rb_node) { +		struct map *map = rb_node->map; +		const struct dso *dso = map__dso(map); +		u32 prot = map__prot(map); -	maps__for_each_entry(maps, map) {  		printed += fprintf(fp, "%*s  %" PRIx64 "-%" PRIx64 " %c%c%c%c %08" PRIx64 " %" PRIu64 " %s\n", -				   indent, "", map->start, map->end, -				   map->prot & PROT_READ ? 'r' : '-', -				   map->prot & PROT_WRITE ? 'w' : '-', -				   map->prot & PROT_EXEC ? 'x' : '-', -				   map->flags & MAP_SHARED ? 's' : 'p', -				   map->pgoff, -				   map->dso->id.ino, map->dso->name); +				   indent, "", map__start(map), map__end(map), +				   prot & PROT_READ ? 'r' : '-', +				   prot & PROT_WRITE ? 'w' : '-', +				   prot & PROT_EXEC ? 'x' : '-', +				   map__flags(map) ? 's' : 'p', +				   map__pgoff(map), +				   dso->id.ino, dso->name);  	}  	return printed; @@ -1218,11 +1226,11 @@ int cmd_report(int argc, const char **argv)  		.max_stack		 = PERF_MAX_STACK_DEPTH,  		.pretty_printing_style	 = "normal",  		.socket_filter		 = -1, -		.annotation_opts	 = annotation__default_options,  		.skip_empty		 = true,  	};  	char *sort_order_help = sort_help("sort by key(s):");  	char *field_order_help = sort_help("output field(s): overhead period sample "); +	const char *disassembler_style = NULL, *objdump_path = NULL, *addr2line_path = NULL;  	const struct option options[] = {  	OPT_STRING('i', "input", &input_name, "file",  		    "input file name"), @@ -1319,7 +1327,7 @@ int cmd_report(int argc, const char **argv)  		    "Interleave source code with assembly code (default)"),  	OPT_BOOLEAN(0, "asm-raw", &report.annotation_opts.show_asm_raw,  		    "Display raw encoding of assembly instructions (default)"), -	OPT_STRING('M', "disassembler-style", &report.annotation_opts.disassembler_style, "disassembler style", +	OPT_STRING('M', "disassembler-style", &disassembler_style, "disassembler style",  		   "Specify disassembler style (e.g. -M intel for intel syntax)"),  	OPT_STRING(0, "prefix", &report.annotation_opts.prefix, "prefix",  		    "Add prefix to source file path names in programs (with --prefix-strip)"), @@ -1338,8 +1346,10 @@ int cmd_report(int argc, const char **argv)  		    parse_branch_mode),  	OPT_BOOLEAN(0, "branch-history", &branch_call_mode,  		    "add last branch records to call history"), -	OPT_STRING(0, "objdump", &report.annotation_opts.objdump_path, "path", +	OPT_STRING(0, "objdump", &objdump_path, "path",  		   "objdump binary to use for disassembly and annotations"), +	OPT_STRING(0, "addr2line", &addr2line_path, "path", +		   "addr2line binary to use for line numbers"),  	OPT_BOOLEAN(0, "demangle", &symbol_conf.demangle,  		    "Disable symbol demangling"),  	OPT_BOOLEAN(0, "demangle-kernel", &symbol_conf.demangle_kernel, @@ -1398,6 +1408,8 @@ int cmd_report(int argc, const char **argv)  	if (ret < 0)  		goto exit; +	annotation_options__init(&report.annotation_opts); +  	ret = perf_config(report__config, &report);  	if (ret)  		goto exit; @@ -1414,6 +1426,22 @@ int cmd_report(int argc, const char **argv)  		report.symbol_filter_str = argv[0];  	} +	if (disassembler_style) { +		report.annotation_opts.disassembler_style = strdup(disassembler_style); +		if (!report.annotation_opts.disassembler_style) +			return -ENOMEM; +	} +	if (objdump_path) { +		report.annotation_opts.objdump_path = strdup(objdump_path); +		if (!report.annotation_opts.objdump_path) +			return -ENOMEM; +	} +	if (addr2line_path) { +		symbol_conf.addr2line_path = strdup(addr2line_path); +		if (!symbol_conf.addr2line_path) +			return -ENOMEM; +	} +  	if (annotate_check_args(&report.annotation_opts) < 0) {  		ret = -EINVAL;  		goto exit; @@ -1481,7 +1509,7 @@ repeat:  	setup_forced_leader(&report, session->evlist); -	if (symbol_conf.group_sort_idx && !session->evlist->core.nr_groups) { +	if (symbol_conf.group_sort_idx && evlist__nr_groups(session->evlist) == 0) {  		parse_options_usage(NULL, options, "group-sort-idx", 0);  		ret = -EINVAL;  		goto error; @@ -1701,6 +1729,7 @@ error:  	zstd_fini(&(session->zstd_data));  	perf_session__delete(session);  exit: +	annotation_options__exit(&report.annotation_opts);  	free(sort_order_help);  	free(field_order_help);  	return ret;  |