diff options
| author | Andi Kleen <ak@linux.intel.com> | 2014-11-12 18:05:27 -0800 | 
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2014-11-24 18:03:47 -0300 | 
| commit | 85c116a6cb91a5c09b7a6c95ffc6a6cbd32cd237 (patch) | |
| tree | ed4727c432cd2cfbd26a7e27cbed070f112d1df5 | |
| parent | aaba4e12a99cc56fc8614a3f2a3ec6db4fcde76e (diff) | |
perf callchain: Make get_srcline fall back to sym+offset
When the source line is not found fall back to sym + offset.  This is
generally much more useful than a raw address.
For this we need to pass in the symbol from the caller.
For some callers it's awkward to compute, so we stay at the old
behaviour.
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/1415844328-4884-10-git-send-email-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
| -rw-r--r-- | tools/perf/util/annotate.c | 2 | ||||
| -rw-r--r-- | tools/perf/util/callchain.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/map.c | 2 | ||||
| -rw-r--r-- | tools/perf/util/sort.c | 6 | ||||
| -rw-r--r-- | tools/perf/util/srcline.c | 11 | ||||
| -rw-r--r-- | tools/perf/util/util.h | 4 | 
6 files changed, 20 insertions, 8 deletions
| diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index e5670f1af737..79999ceaf2be 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -1192,7 +1192,7 @@ static int symbol__get_source_line(struct symbol *sym, struct map *map,  			goto next;  		offset = start + i; -		src_line->path = get_srcline(map->dso, offset); +		src_line->path = get_srcline(map->dso, offset, NULL, false);  		insert_source_line(&tmp_root, src_line);  	next: diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index b6624aeaaca9..517ed84db97a 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c @@ -819,7 +819,8 @@ char *callchain_list__sym_name(struct callchain_list *cl,  		    cl->ms.map && !cl->srcline)  			cl->srcline = get_srcline(cl->ms.map->dso,  						  map__rip_2objdump(cl->ms.map, -								    cl->ip)); +								    cl->ip), +						  cl->ms.sym, false);  		if (cl->srcline)  			printed = scnprintf(bf, bfsize, "%s %s",  					cl->ms.sym->name, cl->srcline); diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 040a785c857b..62ca9f2607d5 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -360,7 +360,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,  	if (map && map->dso) {  		srcline = get_srcline(map->dso, -				      map__rip_2objdump(map, addr)); +				      map__rip_2objdump(map, addr), NULL, true);  		if (srcline != SRCLINE_UNKNOWN)  			ret = fprintf(fp, "%s%s", prefix, srcline);  		free_srcline(srcline); diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 82a5596241a7..9139dda9f9a3 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -291,7 +291,8 @@ sort__srcline_cmp(struct hist_entry *left, struct hist_entry *right)  		else {  			struct map *map = left->ms.map;  			left->srcline = get_srcline(map->dso, -					    map__rip_2objdump(map, left->ip)); +					   map__rip_2objdump(map, left->ip), +						    left->ms.sym, true);  		}  	}  	if (!right->srcline) { @@ -300,7 +301,8 @@ sort__srcline_cmp(struct hist_entry *left, struct hist_entry *right)  		else {  			struct map *map = right->ms.map;  			right->srcline = get_srcline(map->dso, -					    map__rip_2objdump(map, right->ip)); +					     map__rip_2objdump(map, right->ip), +						     right->ms.sym, true);  		}  	}  	return strcmp(right->srcline, left->srcline); diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index ac877f96fed7..e73b6a5c9e0f 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -8,6 +8,8 @@  #include "util/util.h"  #include "util/debug.h" +#include "symbol.h" +  #ifdef HAVE_LIBBFD_SUPPORT  /* @@ -250,7 +252,8 @@ void dso__free_a2l(struct dso *dso __maybe_unused)   */  #define A2L_FAIL_LIMIT 123 -char *get_srcline(struct dso *dso, unsigned long addr) +char *get_srcline(struct dso *dso, unsigned long addr, struct symbol *sym, +		  bool show_sym)  {  	char *file = NULL;  	unsigned line = 0; @@ -289,7 +292,11 @@ out:  		dso->has_srcline = 0;  		dso__free_a2l(dso);  	} -	if (asprintf(&srcline, "%s[%lx]", dso->short_name, addr) < 0) +	if (sym) { +		if (asprintf(&srcline, "%s+%ld", show_sym ? sym->name : "", +					addr - sym->start) < 0) +			return SRCLINE_UNKNOWN; +	} else if (asprintf(&srcline, "%s[%lx]", dso->short_name, addr) < 0)  		return SRCLINE_UNKNOWN;  	return srcline;  } diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 76d23d83eae5..419bee030f83 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -337,8 +337,10 @@ static inline int path__join3(char *bf, size_t size,  }  struct dso; +struct symbol; -char *get_srcline(struct dso *dso, unsigned long addr); +char *get_srcline(struct dso *dso, unsigned long addr, struct symbol *sym, +		  bool show_sym);  void free_srcline(char *srcline);  int filename__read_int(const char *filename, int *value); | 
