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