xref: /linux/tools/perf/util/demangle-cxx.cpp (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
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