diff options
Diffstat (limited to 'tools/perf/builtin-annotate.c')
| -rw-r--r-- | tools/perf/builtin-annotate.c | 68 | 
1 files changed, 42 insertions, 26 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 5ebd0c3b71b..1ec429fef2b 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -28,8 +28,10 @@  #include "util/hist.h"  #include "util/session.h"  #include "util/tool.h" +#include "util/data.h"  #include "arch/common.h" +#include <dlfcn.h>  #include <linux/bitmap.h>  struct perf_annotate { @@ -44,7 +46,7 @@ struct perf_annotate {  };  static int perf_evsel__add_sample(struct perf_evsel *evsel, -				  struct perf_sample *sample, +				  struct perf_sample *sample __maybe_unused,  				  struct addr_location *al,  				  struct perf_annotate *ann)  { @@ -63,21 +65,13 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel,  		return 0;  	} -	he = __hists__add_entry(&evsel->hists, al, NULL, 1, 1); +	he = __hists__add_entry(&evsel->hists, al, NULL, NULL, NULL, 1, 1, 0, +				true);  	if (he == NULL)  		return -ENOMEM; -	ret = 0; -	if (he->ms.sym != NULL) { -		struct annotation *notes = symbol__annotation(he->ms.sym); -		if (notes->src == NULL && symbol__alloc_hist(he->ms.sym) < 0) -			return -ENOMEM; - -		ret = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); -	} - -	evsel->hists.stats.total_period += sample->period; -	hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE); +	ret = hist_entry__inc_addr_samples(he, evsel->idx, al->addr); +	hists__inc_nr_samples(&evsel->hists, true);  	return ret;  } @@ -116,11 +110,11 @@ static int hist_entry__tty_annotate(struct hist_entry *he,  				    ann->print_line, ann->full_paths, 0, 0);  } -static void hists__find_annotations(struct hists *self, +static void hists__find_annotations(struct hists *hists,  				    struct perf_evsel *evsel,  				    struct perf_annotate *ann)  { -	struct rb_node *nd = rb_first(&self->entries), *next; +	struct rb_node *nd = rb_first(&hists->entries), *next;  	int key = K_RIGHT;  	while (nd) { @@ -142,8 +136,18 @@ find_next:  		if (use_browser == 2) {  			int ret; +			int (*annotate)(struct hist_entry *he, +					struct perf_evsel *evsel, +					struct hist_browser_timer *hbt); + +			annotate = dlsym(perf_gtk_handle, +					 "hist_entry__gtk_annotate"); +			if (annotate == NULL) { +				ui__error("GTK browser not found!\n"); +				return; +			} -			ret = hist_entry__gtk_annotate(he, evsel, NULL); +			ret = annotate(he, evsel, NULL);  			if (!ret || !ann->skip_missing)  				return; @@ -176,8 +180,7 @@ find_next:  			 * symbol, free he->ms.sym->src to signal we already  			 * processed this symbol.  			 */ -			free(notes->src); -			notes->src = NULL; +			zfree(¬es->src);  		}  	}  } @@ -188,9 +191,13 @@ static int __cmd_annotate(struct perf_annotate *ann)  	struct perf_session *session;  	struct perf_evsel *pos;  	u64 total_nr_samples; +	struct perf_data_file file = { +		.path  = input_name, +		.mode  = PERF_DATA_MODE_READ, +		.force = ann->force, +	}; -	session = perf_session__new(input_name, O_RDONLY, -				    ann->force, false, &ann->tool); +	session = perf_session__new(&file, false, &ann->tool);  	if (session == NULL)  		return -ENOMEM; @@ -225,13 +232,13 @@ static int __cmd_annotate(struct perf_annotate *ann)  		perf_session__fprintf_dsos(session, stdout);  	total_nr_samples = 0; -	list_for_each_entry(pos, &session->evlist->entries, node) { +	evlist__for_each(session->evlist, pos) {  		struct hists *hists = &pos->hists;  		u32 nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE];  		if (nr_samples > 0) {  			total_nr_samples += nr_samples; -			hists__collapse_resort(hists); +			hists__collapse_resort(hists, NULL);  			hists__output_resort(hists);  			if (symbol_conf.event_group && @@ -243,12 +250,21 @@ static int __cmd_annotate(struct perf_annotate *ann)  	}  	if (total_nr_samples == 0) { -		ui__error("The %s file has no samples!\n", session->filename); +		ui__error("The %s file has no samples!\n", file.path);  		goto out_delete;  	} -	if (use_browser == 2) -		perf_gtk__show_annotations(); +	if (use_browser == 2) { +		void (*show_annotations)(void); + +		show_annotations = dlsym(perf_gtk_handle, +					 "perf_gtk__show_annotations"); +		if (show_annotations == NULL) { +			ui__error("GTK browser not found!\n"); +			goto out_delete; +		} +		show_annotations(); +	}  out_delete:  	/* @@ -348,7 +364,7 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)  	if (argc) {  		/* -		 * Special case: if there's an argument left then assume tha +		 * Special case: if there's an argument left then assume that  		 * it's a symbol filter:  		 */  		if (argc > 1)  | 
