xref: /aosp_15_r20/external/libcxx/test/support/demangle.h (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker // -*- C++ -*-
2*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
3*58b9f456SAndroid Build Coastguard Worker //
4*58b9f456SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
5*58b9f456SAndroid Build Coastguard Worker //
6*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
7*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
8*58b9f456SAndroid Build Coastguard Worker //
9*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
10*58b9f456SAndroid Build Coastguard Worker #ifndef SUPPORT_DEMANGLE_H
11*58b9f456SAndroid Build Coastguard Worker #define SUPPORT_DEMANGLE_H
12*58b9f456SAndroid Build Coastguard Worker 
13*58b9f456SAndroid Build Coastguard Worker #include "test_macros.h"
14*58b9f456SAndroid Build Coastguard Worker #include <string>
15*58b9f456SAndroid Build Coastguard Worker #include <cstdlib>
16*58b9f456SAndroid Build Coastguard Worker 
17*58b9f456SAndroid Build Coastguard Worker #if !defined(TEST_HAS_NO_DEMANGLE)
18*58b9f456SAndroid Build Coastguard Worker # if defined(__GNUC__) || defined(__clang__)
19*58b9f456SAndroid Build Coastguard Worker #   if __has_include("cxxabi.h") && !defined(_LIBCPP_ABI_MICROSOFT)
20*58b9f456SAndroid Build Coastguard Worker #     include "cxxabi.h"
21*58b9f456SAndroid Build Coastguard Worker #   else
22*58b9f456SAndroid Build Coastguard Worker #     define TEST_HAS_NO_DEMANGLE
23*58b9f456SAndroid Build Coastguard Worker #   endif
24*58b9f456SAndroid Build Coastguard Worker # else
25*58b9f456SAndroid Build Coastguard Worker #   define TEST_HAS_NO_DEMANGLE
26*58b9f456SAndroid Build Coastguard Worker # endif
27*58b9f456SAndroid Build Coastguard Worker #endif
28*58b9f456SAndroid Build Coastguard Worker 
29*58b9f456SAndroid Build Coastguard Worker #if defined(TEST_HAS_NO_DEMANGLE)
demangle(const char * mangled_name)30*58b9f456SAndroid Build Coastguard Worker inline std::string demangle(const char* mangled_name) {
31*58b9f456SAndroid Build Coastguard Worker   return mangled_name;
32*58b9f456SAndroid Build Coastguard Worker }
33*58b9f456SAndroid Build Coastguard Worker #else
34*58b9f456SAndroid Build Coastguard Worker template <size_t N> struct Printer;
demangle(const char * mangled_name)35*58b9f456SAndroid Build Coastguard Worker inline std::string demangle(const char* mangled_name) {
36*58b9f456SAndroid Build Coastguard Worker   int status = 0;
37*58b9f456SAndroid Build Coastguard Worker   char* out = __cxxabiv1::__cxa_demangle(mangled_name, nullptr, nullptr, &status);
38*58b9f456SAndroid Build Coastguard Worker   if (out != nullptr) {
39*58b9f456SAndroid Build Coastguard Worker     std::string res(out);
40*58b9f456SAndroid Build Coastguard Worker     std::free(out);
41*58b9f456SAndroid Build Coastguard Worker     return res;
42*58b9f456SAndroid Build Coastguard Worker   }
43*58b9f456SAndroid Build Coastguard Worker   return mangled_name;
44*58b9f456SAndroid Build Coastguard Worker }
45*58b9f456SAndroid Build Coastguard Worker #endif
46*58b9f456SAndroid Build Coastguard Worker 
47*58b9f456SAndroid Build Coastguard Worker #endif // SUPPORT_DEMANGLE_H
48