Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf tools: Fix fallback to cplus_demangle() when bfd_demangle() is not available

In old binutils we can't access bfd_demangle(), use
cplus_demangle() just like oprofile.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Luis Claudio R. Gonçalves <lclaudio@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
LKML-Reference: <20090811192211.GG18061@ghostprotocols.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by

Arnaldo Carvalho de Melo and committed by
Ingo Molnar
247648e3 94a24752

+42 -26
+18 -11
tools/perf/Makefile
··· 382 382 ifdef NO_DEMANGLE 383 383 BASIC_CFLAGS += -DNO_DEMANGLE 384 384 else 385 - 386 385 has_bfd := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd > /dev/null 2>&1 && echo y") 387 - 388 - has_bfd_iberty := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty > /dev/null 2>&1 && echo y") 389 - 390 - has_bfd_iberty_z := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty -lz > /dev/null 2>&1 && echo y") 391 386 392 387 ifeq ($(has_bfd),y) 393 388 EXTLIBS += -lbfd 394 - else ifeq ($(has_bfd_iberty),y) 395 - EXTLIBS += -lbfd -liberty 396 - else ifeq ($(has_bfd_iberty_z),y) 397 - EXTLIBS += -lbfd -liberty -lz 398 389 else 399 - msg := $(warning No bfd.h/libbfd found, install binutils-dev[el] to gain symbol demangling) 400 - BASIC_CFLAGS += -DNO_DEMANGLE 390 + has_bfd_iberty := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty > /dev/null 2>&1 && echo y") 391 + ifeq ($(has_bfd_iberty),y) 392 + EXTLIBS += -lbfd -liberty 393 + else 394 + has_bfd_iberty_z := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty -lz > /dev/null 2>&1 && echo y") 395 + ifeq ($(has_bfd_iberty_z),y) 396 + EXTLIBS += -lbfd -liberty -lz 397 + else 398 + has_cplus_demangle := $(shell sh -c "(echo 'extern char *cplus_demangle(const char *, int);'; echo 'int main(void) { cplus_demangle(0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -liberty > /dev/null 2>&1 && echo y") 399 + ifeq ($(has_cplus_demangle),y) 400 + EXTLIBS += -liberty 401 + BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE 402 + else 403 + msg := $(warning No bfd.h/libbfd found, install binutils-dev[el] to gain symbol demangling) 404 + BASIC_CFLAGS += -DNO_DEMANGLE 405 + endif 406 + endif 407 + endif 401 408 endif 402 409 endif 403 410
-15
tools/perf/util/symbol.c
··· 7 7 #include <gelf.h> 8 8 #include <elf.h> 9 9 10 - #ifndef NO_DEMANGLE 11 - #include <bfd.h> 12 - #else 13 - static inline 14 - char *bfd_demangle(void __used *v, const char __used *c, int __used i) 15 - { 16 - return NULL; 17 - } 18 - #endif 19 - 20 10 const char *sym_hist_filter; 21 - 22 - #ifndef DMGL_PARAMS 23 - #define DMGL_PARAMS (1 << 0) /* Include function args */ 24 - #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ 25 - #endif 26 11 27 12 enum dso_origin { 28 13 DSO__ORIG_KERNEL = 0,
+24
tools/perf/util/symbol.h
··· 7 7 #include <linux/rbtree.h> 8 8 #include "module.h" 9 9 10 + #ifdef HAVE_CPLUS_DEMANGLE 11 + extern char *cplus_demangle(const char *, int); 12 + 13 + static inline char *bfd_demangle(void __used *v, const char *c, int i) 14 + { 15 + return cplus_demangle(c, i); 16 + } 17 + #else 18 + #ifdef NO_DEMANGLE 19 + static inline char *bfd_demangle(void __used *v, const char __used *c, 20 + int __used i) 21 + { 22 + return NULL; 23 + } 24 + #else 25 + #include <bfd.h> 26 + #endif 27 + #endif 28 + 29 + #ifndef DMGL_PARAMS 30 + #define DMGL_PARAMS (1 << 0) /* Include function args */ 31 + #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ 32 + #endif 33 + 10 34 struct symbol { 11 35 struct rb_node rb_node; 12 36 u64 start;