| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- // SPDX-License-Identifier: GPL-2.0
- #include "demangle-cxx.h"
- #include <stdlib.h>
- #include <string.h>
- #include <linux/compiler.h>
- #ifdef HAVE_LIBBFD_SUPPORT
- #define PACKAGE 'perf'
- #include <bfd.h>
- #endif
- #ifdef HAVE_CXA_DEMANGLE_SUPPORT
- #include <cxxabi.h>
- #endif
- #if defined(HAVE_LIBBFD_SUPPORT) || defined(HAVE_CPLUS_DEMANGLE_SUPPORT)
- #ifndef DMGL_PARAMS
- #define DMGL_PARAMS (1 << 0) /* Include function args */
- #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */
- #endif
- #endif
- /*
- * Demangle C++ function signature
- *
- * Note: caller is responsible for freeing demangled string
- */
- extern "C"
- char *cxx_demangle_sym(const char *str, bool params __maybe_unused,
- bool modifiers __maybe_unused)
- {
- #ifdef HAVE_LIBBFD_SUPPORT
- int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0);
- return bfd_demangle(NULL, str, flags);
- #elif defined(HAVE_CPLUS_DEMANGLE_SUPPORT)
- int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0);
- return cplus_demangle(str, flags);
- #elif defined(HAVE_CXA_DEMANGLE_SUPPORT)
- char *output;
- int status;
- output = abi::__cxa_demangle(str, /*output_buffer=*/NULL, /*length=*/NULL, &status);
- return output;
- #else
- return NULL;
- #endif
- }
|