// 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 }