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"
cxx_demangle_sym(const char * str,bool params __maybe_unused,bool modifiers __maybe_unused)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 char *output;
42 int status;
43
44 output = abi::__cxa_demangle(str, /*output_buffer=*/NULL, /*length=*/NULL, &status);
45 return output;
46 #else
47 return NULL;
48 #endif
49 }
50