xref: /linux/tools/perf/util/demangle-cxx.cpp (revision 0526b56cbc3c489642bd6a5fe4b718dea7ef0ee8)
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         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