diff options
-rw-r--r-- | tools/perf/Makefile | 2 | ||||
-rw-r--r-- | tools/perf/util/symbol.c | 21 |
2 files changed, 20 insertions, 3 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 7822b3d6baca..a5e9b876ca09 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
@@ -345,7 +345,7 @@ BUILTIN_OBJS += builtin-stat.o | |||
345 | BUILTIN_OBJS += builtin-top.o | 345 | BUILTIN_OBJS += builtin-top.o |
346 | 346 | ||
347 | PERFLIBS = $(LIB_FILE) | 347 | PERFLIBS = $(LIB_FILE) |
348 | EXTLIBS = | 348 | EXTLIBS = -lbfd |
349 | 349 | ||
350 | # | 350 | # |
351 | # Platform specific tweaks | 351 | # Platform specific tweaks |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index f40266b4845d..98aee922acca 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -6,9 +6,15 @@ | |||
6 | #include <libelf.h> | 6 | #include <libelf.h> |
7 | #include <gelf.h> | 7 | #include <gelf.h> |
8 | #include <elf.h> | 8 | #include <elf.h> |
9 | #include <bfd.h> | ||
9 | 10 | ||
10 | const char *sym_hist_filter; | 11 | const char *sym_hist_filter; |
11 | 12 | ||
13 | #ifndef DMGL_PARAMS | ||
14 | #define DMGL_PARAMS (1 << 0) /* Include function args */ | ||
15 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ | ||
16 | #endif | ||
17 | |||
12 | static struct symbol *symbol__new(u64 start, u64 len, | 18 | static struct symbol *symbol__new(u64 start, u64 len, |
13 | const char *name, unsigned int priv_size, | 19 | const char *name, unsigned int priv_size, |
14 | u64 obj_start, int verbose) | 20 | u64 obj_start, int verbose) |
@@ -571,6 +577,8 @@ static int dso__load_sym(struct dso *self, int fd, const char *name, | |||
571 | NULL) != NULL); | 577 | NULL) != NULL); |
572 | elf_symtab__for_each_symbol(syms, nr_syms, index, sym) { | 578 | elf_symtab__for_each_symbol(syms, nr_syms, index, sym) { |
573 | struct symbol *f; | 579 | struct symbol *f; |
580 | const char *name; | ||
581 | char *demangled; | ||
574 | u64 obj_start; | 582 | u64 obj_start; |
575 | struct section *section = NULL; | 583 | struct section *section = NULL; |
576 | int is_label = elf_sym__is_label(&sym); | 584 | int is_label = elf_sym__is_label(&sym); |
@@ -609,10 +617,19 @@ static int dso__load_sym(struct dso *self, int fd, const char *name, | |||
609 | goto out_elf_end; | 617 | goto out_elf_end; |
610 | } | 618 | } |
611 | } | 619 | } |
620 | /* | ||
621 | * We need to figure out if the object was created from C++ sources | ||
622 | * DWARF DW_compile_unit has this, but we don't always have access | ||
623 | * to it... | ||
624 | */ | ||
625 | name = elf_sym__name(&sym, symstrs); | ||
626 | demangled = bfd_demangle(NULL, name, DMGL_PARAMS | DMGL_ANSI); | ||
627 | if (demangled != NULL) | ||
628 | name = demangled; | ||
612 | 629 | ||
613 | f = symbol__new(sym.st_value, sym.st_size, | 630 | f = symbol__new(sym.st_value, sym.st_size, name, |
614 | elf_sym__name(&sym, symstrs), | ||
615 | self->sym_priv_size, obj_start, verbose); | 631 | self->sym_priv_size, obj_start, verbose); |
632 | free(demangled); | ||
616 | if (!f) | 633 | if (!f) |
617 | goto out_elf_end; | 634 | goto out_elf_end; |
618 | 635 | ||