Skip to content

Commit

Permalink
perf symbols: Demangle cloned functions
Browse files Browse the repository at this point in the history
The libbfd C++ demangler doesn't seem to deal with cloned functions,
like symbol.clone.NUM.

Just strip the dot part before demangling and add it back later.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Link: http://lkml.kernel.org/r/1378998998-10802-1-git-send-email-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Andi Kleen authored and Arnaldo Carvalho de Melo committed Sep 25, 2013
1 parent aa7fe3b commit de95ab5
Showing 1 changed file with 26 additions and 1 deletion.
27 changes: 26 additions & 1 deletion tools/perf/util/symbol-elf.c
Original file line number Diff line number Diff line change
Expand Up @@ -928,8 +928,33 @@ int dso__load_sym(struct dso *dso, struct map *map,
* to it...
*/
if (symbol_conf.demangle) {
demangled = bfd_demangle(NULL, elf_name,
/*
* The demangler doesn't deal with cloned functions.
* XXXX.clone.NUM or similar
* Strip the dot part and readd it later.
*/
char *p = (char *)elf_name, *dot;
dot = strchr(elf_name, '.');
if (dot) {
p = strdup(elf_name);
if (!p)
goto new_symbol;
dot = strchr(p, '.');
*dot = 0;
}

demangled = bfd_demangle(NULL, p,
DMGL_PARAMS | DMGL_ANSI);
if (dot)
*dot = '.';
if (demangled && dot) {
demangled = realloc(demangled, strlen(demangled) + strlen(dot) + 1);
if (!demangled)
goto new_symbol;
strcpy(demangled + (dot - p), dot);
}
if (p != elf_name)
free(p);
if (demangled != NULL)
elf_name = demangled;
}
Expand Down

0 comments on commit de95ab5

Please sign in to comment.