1// SPDX-License-Identifier: GPL-2.0
2#include "demangle-cxx.h"
3#include <stdlib.h>
4#include <string.h>
5#include <linux/compiler.h>
6
7#ifdef HAVE_LIBBFD_SUPPORT
8#define PACKAGE 'perf'
9#include <bfd.h>
10#endif
11
12#ifdef HAVE_CXA_DEMANGLE_SUPPORT
13#include <cxxabi.h>
14#endif
15
16#if defined(HAVE_LIBBFD_SUPPORT) || defined(HAVE_CPLUS_DEMANGLE_SUPPORT)
17#ifndef DMGL_PARAMS
18#define DMGL_PARAMS     (1 << 0)  /* Include function args */
19#define DMGL_ANSI       (1 << 1)  /* Include const, volatile, etc */
20#endif
21#endif
22
23/*
24 * Demangle C++ function signature
25 *
26 * Note: caller is responsible for freeing demangled string
27 */
28extern "C"
29char *cxx_demangle_sym(const char *str, bool params __maybe_unused,
30                       bool modifiers __maybe_unused)
31{
32#ifdef HAVE_LIBBFD_SUPPORT
33        int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0);
34
35        return bfd_demangle(NULL, str, flags);
36#elif defined(HAVE_CPLUS_DEMANGLE_SUPPORT)
37        int flags = (params ? DMGL_PARAMS : 0) | (modifiers ? DMGL_ANSI : 0);
38
39        return cplus_demangle(str, flags);
40#elif defined(HAVE_CXA_DEMANGLE_SUPPORT)
41        char *output;
42        int status;
43
44        output = abi::__cxa_demangle(str, /*output_buffer=*/NULL, /*length=*/NULL, &status);
45        return output;
46#else
47        return NULL;
48#endif
49}
50