perf symbols: Demangle cloned functions
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>
This commit is contained in:
parent
aa7fe3b0c4
commit
de95ab5364
@ -928,8 +928,33 @@ int dso__load_sym(struct dso *dso, struct map *map,
|
|||||||
* to it...
|
* to it...
|
||||||
*/
|
*/
|
||||||
if (symbol_conf.demangle) {
|
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);
|
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)
|
if (demangled != NULL)
|
||||||
elf_name = demangled;
|
elf_name = demangled;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user