diff options
Diffstat (limited to 'tools/perf/ui/browsers/annotate.c')
| -rw-r--r-- | tools/perf/ui/browsers/annotate.c | 42 | 
1 files changed, 28 insertions, 14 deletions
| diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c index cc64d3f7fc36..f0697a3aede0 100644 --- a/tools/perf/ui/browsers/annotate.c +++ b/tools/perf/ui/browsers/annotate.c @@ -428,40 +428,52 @@ static void annotate_browser__init_asm_mode(struct annotate_browser *browser)  	browser->b.nr_entries = browser->nr_asm_entries;  } +#define SYM_TITLE_MAX_SIZE (PATH_MAX + 64) + +static int sym_title(struct symbol *sym, struct map *map, char *title, +		     size_t sz) +{ +	return snprintf(title, sz, "%s  %s", sym->name, map->dso->long_name); +} +  static bool annotate_browser__callq(struct annotate_browser *browser,  				    struct perf_evsel *evsel,  				    struct hist_browser_timer *hbt)  {  	struct map_symbol *ms = browser->b.priv;  	struct disasm_line *dl = browser->selection; -	struct symbol *sym = ms->sym;  	struct annotation *notes; -	struct symbol *target; -	u64 ip; +	struct addr_map_symbol target = { +		.map = ms->map, +		.addr = map__objdump_2mem(ms->map, dl->ops.target.addr), +	}; +	char title[SYM_TITLE_MAX_SIZE];  	if (!ins__is_call(dl->ins))  		return false; -	ip = ms->map->map_ip(ms->map, dl->ops.target.addr); -	target = map__find_symbol(ms->map, ip, NULL); -	if (target == NULL) { +	if (map_groups__find_ams(&target, NULL) || +	    map__rip_2objdump(target.map, target.map->map_ip(target.map, +							     target.addr)) != +	    dl->ops.target.addr) {  		ui_helpline__puts("The called function was not found.");  		return true;  	} -	notes = symbol__annotation(target); +	notes = symbol__annotation(target.sym);  	pthread_mutex_lock(¬es->lock); -	if (notes->src == NULL && symbol__alloc_hist(target) < 0) { +	if (notes->src == NULL && symbol__alloc_hist(target.sym) < 0) {  		pthread_mutex_unlock(¬es->lock);  		ui__warning("Not enough memory for annotating '%s' symbol!\n", -			    target->name); +			    target.sym->name);  		return true;  	}  	pthread_mutex_unlock(¬es->lock); -	symbol__tui_annotate(target, ms->map, evsel, hbt); -	ui_browser__show_title(&browser->b, sym->name); +	symbol__tui_annotate(target.sym, target.map, evsel, hbt); +	sym_title(ms->sym, ms->map, title, sizeof(title)); +	ui_browser__show_title(&browser->b, title);  	return true;  } @@ -495,7 +507,7 @@ static bool annotate_browser__jump(struct annotate_browser *browser)  	dl = annotate_browser__find_offset(browser, dl->ops.target.offset, &idx);  	if (dl == NULL) { -		ui_helpline__puts("Invallid jump offset"); +		ui_helpline__puts("Invalid jump offset");  		return true;  	} @@ -653,8 +665,10 @@ static int annotate_browser__run(struct annotate_browser *browser,  	const char *help = "Press 'h' for help on key bindings";  	int delay_secs = hbt ? hbt->refresh : 0;  	int key; +	char title[SYM_TITLE_MAX_SIZE]; -	if (ui_browser__show(&browser->b, sym->name, help) < 0) +	sym_title(sym, ms->map, title, sizeof(title)); +	if (ui_browser__show(&browser->b, title, help) < 0)  		return -1;  	annotate_browser__calc_percent(browser, evsel); @@ -720,7 +734,7 @@ static int annotate_browser__run(struct annotate_browser *browser,  		"s             Toggle source code view\n"  		"/             Search string\n"  		"r             Run available scripts\n" -		"?             Search previous string\n"); +		"?             Search string backwards\n");  			continue;  		case 'r':  			{ |