summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/perf/util/dso.c1
-rw-r--r--tools/perf/util/dso.h1
-rw-r--r--tools/perf/util/srcline.c7
-rw-r--r--tools/perf/util/symbol.c2
4 files changed, 10 insertions, 1 deletions
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
index 68aa55aa5c17..49da9684f635 100644
--- a/tools/perf/util/dso.c
+++ b/tools/perf/util/dso.c
@@ -470,6 +470,7 @@ void dso__delete(struct dso *dso)
free(dso->long_name);
dso_cache__free(&dso->cache);
dso__free_a2l(dso);
+ free(dso->symsrc_filename);
free(dso);
}
diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h
index d8613dc3ca8f..7142e5261266 100644
--- a/tools/perf/util/dso.h
+++ b/tools/perf/util/dso.h
@@ -78,6 +78,7 @@ struct dso {
struct rb_root symbol_names[MAP__NR_TYPES];
struct rb_root cache;
void *a2l;
+ char *symsrc_filename;
enum dso_kernel_type kernel;
enum dso_swap_type needs_swap;
enum dso_binary_type symtab_type;
diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
index 25b85b28301b..93795f9c2480 100644
--- a/tools/perf/util/srcline.c
+++ b/tools/perf/util/srcline.c
@@ -249,11 +249,16 @@ char *get_srcline(struct dso *dso, unsigned long addr)
char *file = NULL;
unsigned line = 0;
char *srcline;
- char *dso_name = dso->long_name;
+ char *dso_name;
if (!dso->has_srcline)
return SRCLINE_UNKNOWN;
+ if (dso->symsrc_filename)
+ dso_name = dso->symsrc_filename;
+ else
+ dso_name = dso->long_name;
+
if (dso_name[0] == '[')
goto out;
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 360eefecb81d..de87dbac50a0 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1336,6 +1336,8 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
if (!syms_ss && symsrc__has_symtab(ss)) {
syms_ss = ss;
next_slot = true;
+ if (!dso->symsrc_filename)
+ dso->symsrc_filename = strdup(name);
}
if (!runtime_ss && symsrc__possibly_runtime(ss)) {