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 | ||
