diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-07-20 13:14:12 -0400 |
|---|---|---|
| committer | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-07-22 12:05:57 -0400 |
| commit | 28ac909b49a155856c957d080f8a796b3c1d1f3e (patch) | |
| tree | cdc46c36edc29c1847cabd98b7f5e35e2c39e778 | |
| parent | dfe5a50461db90fab901cb697eff0d3d2e9fd229 (diff) | |
perf symbol: C++ demangling
[acme@doppio ~]$ perf report -s comm,dso,symbol -C firefox -d /usr/lib64/xulrunner-1.9.1/libxul.so | grep :: | head
2.21% [.] nsDeque::Push(void*)
1.78% [.] GraphWalker::DoWalk(nsDeque&)
1.30% [.] GCGraphBuilder::AddNode(void*, nsCycleCollectionParticipant*)
1.27% [.] XPCWrappedNative::CallMethod(XPCCallContext&, XPCWrappedNative::CallMode)
1.18% [.] imgContainer::DrawFrameTo(gfxIImageFrame*, gfxIImageFrame*, nsRect&)
1.13% [.] nsDeque::PopFront()
1.11% [.] nsGlobalWindow::RunTimeout(nsTimeout*)
0.97% [.] nsXPConnect::Traverse(void*, nsCycleCollectionTraversalCallback&)
0.95% [.] nsJSEventListener::cycleCollection::Traverse(void*, nsCycleCollectionTraversalCallback&)
0.95% [.] nsCOMPtr_base::~nsCOMPtr_base()
[acme@doppio ~]$
Cc: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Vegard Nossum <vegard.nossum@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Suggested-by: Clark Williams <williams@redhat.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <20090720171412.GB10410@ghostprotocols.net>
| -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 7822b3d6bac..a5e9b876ca0 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 f40266b4845..98aee922acc 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 | ||
