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