| // SPDX-License-Identifier: GPL-2.0 |
| #include "demangle-cxx.h" |
| #include <stdlib.h> |
| #include <string.h> |
| #include <linux/compiler.h> |
| |
| #ifdef HAVE_LIBBFD_SUPPORT |
| #define PACKAGE 'perf' |
| #include <bfd.h> |
| #endif |
| |
| #ifdef HAVE_CXA_DEMANGLE_SUPPORT |
| #include <cxxabi.h> |
| #endif |
| |
| #if defined(HAVE_LIBBFD_SUPPORT) || defined(HAVE_CPLUS_DEMANGLE_SUPPORT) |
| #ifndef DMGL_PARAMS |
| #define DMGL_PARAMS (1 << 0) /* Include function args */ |
| #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ |
| #endif |
| #endif |
| |
| /* |
| * Demangle C++ function signature |
| * |
| * Note: caller is responsible for freeing demangled string |
| */ |
| extern "C" |
| char *cxx_demangle_sym(const char *str, bool params __maybe_unused, |
| bool modifiers __maybe_unused) |
| { |
| #ifdef HAVE_LIBBFD_SUPPORT |
| int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0); |
| |
| return bfd_demangle(NULL, str, flags); |
| #elif defined(HAVE_CPLUS_DEMANGLE_SUPPORT) |
| int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0); |
| |
| return cplus_demangle(str, flags); |
| #elif defined(HAVE_CXA_DEMANGLE_SUPPORT) |
| char *output; |
| int status; |
| |
| output = abi::__cxa_demangle(str, /*output_buffer=*/NULL, /*length=*/NULL, &status); |
| return output; |
| #else |
| return NULL; |
| #endif |
| } |