13b4e4efeSIan Rogers // SPDX-License-Identifier: GPL-2.0
23b4e4efeSIan Rogers #include "demangle-cxx.h"
33b4e4efeSIan Rogers #include <stdlib.h>
43b4e4efeSIan Rogers #include <string.h>
53b4e4efeSIan Rogers #include <linux/compiler.h>
63b4e4efeSIan Rogers
73b4e4efeSIan Rogers #ifdef HAVE_LIBBFD_SUPPORT
83b4e4efeSIan Rogers #define PACKAGE 'perf'
93b4e4efeSIan Rogers #include <bfd.h>
103b4e4efeSIan Rogers #endif
113b4e4efeSIan Rogers
123b4e4efeSIan Rogers #ifdef HAVE_CXA_DEMANGLE_SUPPORT
133b4e4efeSIan Rogers #include <cxxabi.h>
143b4e4efeSIan Rogers #endif
153b4e4efeSIan Rogers
163b4e4efeSIan Rogers #if defined(HAVE_LIBBFD_SUPPORT) || defined(HAVE_CPLUS_DEMANGLE_SUPPORT)
173b4e4efeSIan Rogers #ifndef DMGL_PARAMS
183b4e4efeSIan Rogers #define DMGL_PARAMS (1 << 0) /* Include function args */
193b4e4efeSIan Rogers #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */
203b4e4efeSIan Rogers #endif
213b4e4efeSIan Rogers #endif
223b4e4efeSIan Rogers
233b4e4efeSIan Rogers /*
243b4e4efeSIan Rogers * Demangle C++ function signature
253b4e4efeSIan Rogers *
263b4e4efeSIan Rogers * Note: caller is responsible for freeing demangled string
273b4e4efeSIan Rogers */
283b4e4efeSIan Rogers extern "C"
cxx_demangle_sym(const char * str,bool params __maybe_unused,bool modifiers __maybe_unused)293b4e4efeSIan Rogers char *cxx_demangle_sym(const char *str, bool params __maybe_unused,
303b4e4efeSIan Rogers bool modifiers __maybe_unused)
313b4e4efeSIan Rogers {
323b4e4efeSIan Rogers #ifdef HAVE_LIBBFD_SUPPORT
333b4e4efeSIan Rogers int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0);
343b4e4efeSIan Rogers
353b4e4efeSIan Rogers return bfd_demangle(NULL, str, flags);
363b4e4efeSIan Rogers #elif defined(HAVE_CPLUS_DEMANGLE_SUPPORT)
373b4e4efeSIan Rogers int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0);
383b4e4efeSIan Rogers
393b4e4efeSIan Rogers return cplus_demangle(str, flags);
403b4e4efeSIan Rogers #elif defined(HAVE_CXA_DEMANGLE_SUPPORT)
41*c9602aa0SIan Rogers char *output;
423b4e4efeSIan Rogers int status;
433b4e4efeSIan Rogers
44*c9602aa0SIan Rogers output = abi::__cxa_demangle(str, /*output_buffer=*/NULL, /*length=*/NULL, &status);
453b4e4efeSIan Rogers return output;
463b4e4efeSIan Rogers #else
473b4e4efeSIan Rogers return NULL;
483b4e4efeSIan Rogers #endif
493b4e4efeSIan Rogers }
50