162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include "demangle-cxx.h" 362306a36Sopenharmony_ci#include <stdlib.h> 462306a36Sopenharmony_ci#include <string.h> 562306a36Sopenharmony_ci#include <linux/compiler.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifdef HAVE_LIBBFD_SUPPORT 862306a36Sopenharmony_ci#define PACKAGE 'perf' 962306a36Sopenharmony_ci#include <bfd.h> 1062306a36Sopenharmony_ci#endif 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifdef HAVE_CXA_DEMANGLE_SUPPORT 1362306a36Sopenharmony_ci#include <cxxabi.h> 1462306a36Sopenharmony_ci#endif 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#if defined(HAVE_LIBBFD_SUPPORT) || defined(HAVE_CPLUS_DEMANGLE_SUPPORT) 1762306a36Sopenharmony_ci#ifndef DMGL_PARAMS 1862306a36Sopenharmony_ci#define DMGL_PARAMS (1 << 0) /* Include function args */ 1962306a36Sopenharmony_ci#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ 2062306a36Sopenharmony_ci#endif 2162306a36Sopenharmony_ci#endif 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* 2462306a36Sopenharmony_ci * Demangle C++ function signature 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * Note: caller is responsible for freeing demangled string 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_ciextern "C" 2962306a36Sopenharmony_cichar *cxx_demangle_sym(const char *str, bool params __maybe_unused, 3062306a36Sopenharmony_ci bool modifiers __maybe_unused) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci#ifdef HAVE_LIBBFD_SUPPORT 3362306a36Sopenharmony_ci int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci return bfd_demangle(NULL, str, flags); 3662306a36Sopenharmony_ci#elif defined(HAVE_CPLUS_DEMANGLE_SUPPORT) 3762306a36Sopenharmony_ci int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci return cplus_demangle(str, flags); 4062306a36Sopenharmony_ci#elif defined(HAVE_CXA_DEMANGLE_SUPPORT) 4162306a36Sopenharmony_ci char *output; 4262306a36Sopenharmony_ci int status; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci output = abi::__cxa_demangle(str, /*output_buffer=*/NULL, /*length=*/NULL, &status); 4562306a36Sopenharmony_ci return output; 4662306a36Sopenharmony_ci#else 4762306a36Sopenharmony_ci return NULL; 4862306a36Sopenharmony_ci#endif 4962306a36Sopenharmony_ci} 50