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 */ 28extern "C" 29char *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