blob: 2a9757d8045416074ee67ab6b8d2b460319f8016 [file] [log] [blame]
Eric Fiselier0ef3b1b2016-12-09 09:31:01 +00001// -*- 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)
30inline std::string demangle(const char* mangled_name) {
31 return mangled_name;
32}
33#else
34template <size_t N> struct Printer;
35inline 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