Revert "perf symbols: Demangle cloned functions"
authorIngo Molnar <mingo@kernel.org>
Sun, 29 Sep 2013 14:12:54 +0000 (16:12 +0200)
committerIngo Molnar <mingo@kernel.org>
Sun, 29 Sep 2013 14:12:54 +0000 (16:12 +0200)
This reverts commit de95ab53645a2f0015e0f68ee723f18dce2b8b51.

Markus Trippelsdorf reported that this commit broke 'perf top':

 > I just see a gray screen with no text at all. Sometimes the
 > following error messages are printed:
 >
 >  *** Error in `perf': invalid fastbin entry (free): 0x00000000029b18c0
 >  ***
 >  *** Error in `perf': malloc(): memory corruption (fast): 0x0000000000ee0b10 ***

While this code is fixable, the commit itself fails on several levels:

 - it should have been a separate helper function
 - why the heck does it do strchr() twice
 - it casts a const char * over into char *
 - sloppy style
 - it's not even a regression fix!

So lets revert it and re-try the patch in v3.13.

Reported-by: Markus Trippelsdorf <markus@trippelsdorf.de>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
tools/perf/util/symbol-elf.c

index d2a888e2e058051baadd90fc87215dcee96842e2..a9c829be52169eac5b9f00d9382fd9281152b9e6 100644 (file)
@@ -928,33 +928,8 @@ int dso__load_sym(struct dso *dso, struct map *map,
                 * to it...
                 */
                if (symbol_conf.demangle) {
-                       /*
-                        * 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,
+                       demangled = bfd_demangle(NULL, elf_name,
                                                 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;
                }