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