diff options
Diffstat (limited to 'tools/perf/builtin-annotate.c')
| -rw-r--r-- | tools/perf/builtin-annotate.c | 69 | 
1 files changed, 31 insertions, 38 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 722c0f54e549..5f9eefecc574 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -10,9 +10,9 @@  #include "util/util.h"  #include "util/color.h" -#include "util/list.h" +#include <linux/list.h>  #include "util/cache.h" -#include "util/rbtree.h" +#include <linux/rbtree.h>  #include "util/symbol.h"  #include "util/string.h" @@ -25,10 +25,6 @@  #define SHOW_USER	2  #define SHOW_HV		4 -#define MIN_GREEN		0.5 -#define MIN_RED		5.0 - -  static char		const *input_name = "perf.data";  static char		*vmlinux = "vmlinux"; @@ -43,6 +39,10 @@ static int		dump_trace = 0;  static int		verbose; +static int		modules; + +static int		full_paths; +  static int		print_line;  static unsigned long	page_size; @@ -160,7 +160,7 @@ static void dsos__fprintf(FILE *fp)  static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)  { -	return dso__find_symbol(kernel_dso, ip); +	return dso__find_symbol(dso, ip);  }  static int load_kernel(void) @@ -171,8 +171,8 @@ static int load_kernel(void)  	if (!kernel_dso)  		return -1; -	err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose); -	if (err) { +	err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules); +	if (err <= 0) {  		dso__delete(kernel_dso);  		kernel_dso = NULL;  	} else @@ -203,7 +203,7 @@ static u64 map__map_ip(struct map *map, u64 ip)  	return ip - map->start + map->pgoff;  } -static u64 vdso__map_ip(struct map *map, u64 ip) +static u64 vdso__map_ip(struct map *map __used, u64 ip)  {  	return ip;  } @@ -600,7 +600,7 @@ static LIST_HEAD(hist_entry__sort_list);  static int sort_dimension__add(char *tok)  { -	int i; +	unsigned int i;  	for (i = 0; i < ARRAY_SIZE(sort_dimensions); i++) {  		struct sort_dimension *sd = &sort_dimensions[i]; @@ -1043,24 +1043,6 @@ process_event(event_t *event, unsigned long offset, unsigned long head)  	return 0;  } -static char *get_color(double percent) -{ -	char *color = PERF_COLOR_NORMAL; - -	/* -	 * We color high-overhead entries in red, mid-overhead -	 * entries in green - and keep the low overhead places -	 * normal: -	 */ -	if (percent >= MIN_RED) -		color = PERF_COLOR_RED; -	else { -		if (percent > MIN_GREEN) -			color = PERF_COLOR_GREEN; -	} -	return color; -} -  static int  parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)  { @@ -1069,7 +1051,7 @@ parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)  	static const char *prev_color;  	unsigned int offset;  	size_t line_len; -	u64 line_ip; +	s64 line_ip;  	int ret;  	char *c; @@ -1122,7 +1104,7 @@ parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)  		} else if (sym->hist_sum)  			percent = 100.0 * hits / sym->hist_sum; -		color = get_color(percent); +		color = get_percent_color(percent);  		/*  		 * Also color the filename and line if needed, with @@ -1258,7 +1240,7 @@ static void print_summary(char *filename)  		sym_ext = rb_entry(node, struct sym_ext, node);  		percent = sym_ext->percent; -		color = get_color(percent); +		color = get_percent_color(percent);  		path = sym_ext->path;  		color_fprintf(stdout, color, " %7.2f %s", percent, path); @@ -1268,19 +1250,25 @@ static void print_summary(char *filename)  static void annotate_sym(struct dso *dso, struct symbol *sym)  { -	char *filename = dso->name; +	char *filename = dso->name, *d_filename;  	u64 start, end, len;  	char command[PATH_MAX*2];  	FILE *file;  	if (!filename)  		return; -	if (dso == kernel_dso) +	if (sym->module) +		filename = sym->module->path; +	else if (dso == kernel_dso)  		filename = vmlinux;  	start = sym->obj_start;  	if (!start)  		start = sym->start; +	if (full_paths) +		d_filename = filename; +	else +		d_filename = basename(filename);  	end = start + sym->end - sym->start + 1;  	len = sym->end - sym->start; @@ -1291,13 +1279,14 @@ static void annotate_sym(struct dso *dso, struct symbol *sym)  	}  	printf("\n\n------------------------------------------------\n"); -	printf(" Percent |	Source code & Disassembly of %s\n", filename); +	printf(" Percent |	Source code & Disassembly of %s\n", d_filename);  	printf("------------------------------------------------\n");  	if (verbose >= 2)  		printf("annotating [%p] %30s : [%p] %30s\n", dso, dso->name, sym, sym->name); -	sprintf(command, "objdump --start-address=0x%016Lx --stop-address=0x%016Lx -dS %s", (u64)start, (u64)end, filename); +	sprintf(command, "objdump --start-address=0x%016Lx --stop-address=0x%016Lx -dS %s|grep -v %s", +			(u64)start, (u64)end, filename, filename);  	if (verbose >= 3)  		printf("doing: %s\n", command); @@ -1428,7 +1417,7 @@ more:  	head += size; -	if (offset + head < stat.st_size) +	if (offset + head < (unsigned long)stat.st_size)  		goto more;  	rc = EXIT_SUCCESS; @@ -1472,8 +1461,12 @@ static const struct option options[] = {  	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,  		    "dump raw trace in ASCII"),  	OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), +	OPT_BOOLEAN('m', "modules", &modules, +		    "load module symbols - WARNING: use only with -k and LIVE kernel"),  	OPT_BOOLEAN('l', "print-line", &print_line,  		    "print matching source lines (may be slow)"), +	OPT_BOOLEAN('P', "full-paths", &full_paths, +		    "Don't shorten the displayed pathnames"),  	OPT_END()  }; @@ -1492,7 +1485,7 @@ static void setup_sorting(void)  	free(str);  } -int cmd_annotate(int argc, const char **argv, const char *prefix) +int cmd_annotate(int argc, const char **argv, const char *prefix __used)  {  	symbol__init();  | 
