diff options
Diffstat (limited to 'tools/perf/builtin-annotate.c')
| -rw-r--r-- | tools/perf/builtin-annotate.c | 47 | 
1 files changed, 39 insertions, 8 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 9ea38540b87..2e6961ea318 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -28,15 +28,16 @@  #include "util/hist.h"  #include "util/session.h"  #include "util/tool.h" +#include "arch/common.h"  #include <linux/bitmap.h>  struct perf_annotate {  	struct perf_tool tool; -	char const *input_name; -	bool	   force, use_tui, use_stdio; +	bool	   force, use_tui, use_stdio, use_gtk;  	bool	   full_paths;  	bool	   print_line; +	bool	   skip_missing;  	const char *sym_hist_filter;  	const char *cpu_list;  	DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS); @@ -138,9 +139,22 @@ find_next:  			continue;  		} -		if (use_browser > 0) { -			key = hist_entry__tui_annotate(he, evidx, NULL, NULL, 0); +		if (use_browser == 2) { +			int ret; + +			ret = hist_entry__gtk_annotate(he, evidx, NULL); +			if (!ret || !ann->skip_missing) +				return; + +			/* skip missing symbols */ +			nd = rb_next(nd); +		} else if (use_browser == 1) { +			key = hist_entry__tui_annotate(he, evidx, NULL);  			switch (key) { +			case -1: +				if (!ann->skip_missing) +					return; +				/* fall through */  			case K_RIGHT:  				next = rb_next(nd);  				break; @@ -174,7 +188,7 @@ static int __cmd_annotate(struct perf_annotate *ann)  	struct perf_evsel *pos;  	u64 total_nr_samples; -	session = perf_session__new(ann->input_name, O_RDONLY, +	session = perf_session__new(input_name, O_RDONLY,  				    ann->force, false, &ann->tool);  	if (session == NULL)  		return -ENOMEM; @@ -186,6 +200,12 @@ static int __cmd_annotate(struct perf_annotate *ann)  			goto out_delete;  	} +	if (!objdump_path) { +		ret = perf_session_env__lookup_objdump(&session->header.env); +		if (ret) +			goto out_delete; +	} +  	ret = perf_session__process_events(session, &ann->tool);  	if (ret)  		goto out_delete; @@ -218,6 +238,10 @@ static int __cmd_annotate(struct perf_annotate *ann)  		ui__error("The %s file has no samples!\n", session->filename);  		goto out_delete;  	} + +	if (use_browser == 2) +		perf_gtk__show_annotations(); +  out_delete:  	/*  	 * Speed up the exit process, for large files this can @@ -246,13 +270,14 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)  			.sample	= process_sample_event,  			.mmap	= perf_event__process_mmap,  			.comm	= perf_event__process_comm, -			.fork	= perf_event__process_task, +			.exit	= perf_event__process_exit, +			.fork	= perf_event__process_fork,  			.ordered_samples = true,  			.ordering_requires_timestamps = true,  		},  	};  	const struct option options[] = { -	OPT_STRING('i', "input", &annotate.input_name, "file", +	OPT_STRING('i', "input", &input_name, "file",  		    "input file name"),  	OPT_STRING('d', "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",  		   "only consider symbols in these dsos"), @@ -263,6 +288,7 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)  		    "be more verbose (show symbol address, etc)"),  	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,  		    "dump raw trace in ASCII"), +	OPT_BOOLEAN(0, "gtk", &annotate.use_gtk, "Use the GTK interface"),  	OPT_BOOLEAN(0, "tui", &annotate.use_tui, "Use the TUI interface"),  	OPT_BOOLEAN(0, "stdio", &annotate.use_stdio, "Use the stdio interface"),  	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name, @@ -273,6 +299,8 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)  		    "print matching source lines (may be slow)"),  	OPT_BOOLEAN('P', "full-paths", &annotate.full_paths,  		    "Don't shorten the displayed pathnames"), +	OPT_BOOLEAN(0, "skip-missing", &annotate.skip_missing, +		    "Skip symbols that cannot be annotated"),  	OPT_STRING('C', "cpu", &annotate.cpu_list, "cpu", "list of cpus to profile"),  	OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",  		   "Look for files with symbols relative to this directory"), @@ -293,6 +321,8 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)  		use_browser = 0;  	else if (annotate.use_tui)  		use_browser = 1; +	else if (annotate.use_gtk) +		use_browser = 2;  	setup_browser(true); @@ -302,7 +332,8 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)  	if (symbol__init() < 0)  		return -1; -	setup_sorting(annotate_usage, options); +	if (setup_sorting() < 0) +		usage_with_options(annotate_usage, options);  	if (argc) {  		/*  |