xref: /openbmc/linux/tools/perf/util/demangle-cxx.cpp (revision 3b4e4efe88f615f160a6c9319a9392d8410f742c)
1 // SPDX-License-Identifier: GPL-2.0
2 #include "demangle-cxx.h"
3 #include <stdlib.h>
4 #include <string.h>
5 #include <linux/compiler.h>
6 
7 #ifdef HAVE_LIBBFD_SUPPORT
8 #define PACKAGE 'perf'
9 #include <bfd.h>
10 #endif
11 
12 #ifdef HAVE_CXA_DEMANGLE_SUPPORT
13 #include <cxxabi.h>
14 #endif
15 
16 #if defined(HAVE_LIBBFD_SUPPORT) || defined(HAVE_CPLUS_DEMANGLE_SUPPORT)
17 #ifndef DMGL_PARAMS
18 #define DMGL_PARAMS     (1 << 0)  /* Include function args */
19 #define DMGL_ANSI       (1 << 1)  /* Include const, volatile, etc */
20 #endif
21 #endif
22 
23 /*
24  * Demangle C++ function signature
25  *
26  * Note: caller is responsible for freeing demangled string
27  */
28 extern "C"
29 char *cxx_demangle_sym(const char *str, bool params __maybe_unused,
30                        bool modifiers __maybe_unused)
31 {
32 #ifdef HAVE_LIBBFD_SUPPORT
33         int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0);
34 
35         return bfd_demangle(NULL, str, flags);
36 #elif defined(HAVE_CPLUS_DEMANGLE_SUPPORT)
37         int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0);
38 
39         return cplus_demangle(str, flags);
40 #elif defined(HAVE_CXA_DEMANGLE_SUPPORT)
41         size_t len = strlen(str);
42         char *output = (char*)malloc(len);
43         int status;
44 
45         output = abi::__cxa_demangle(str, output, &len, &status);
46         return output;
47 #else
48         return NULL;
49 #endif
50 }
51