diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:18:58 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:18:58 +0000 |
commit | 53a420fba21cf1644972b34dcd811a43cdb8368d (patch) | |
tree | 66a19f6f8b65215772549a51d688492ab8addc0d /test/support/demangle.h | |
parent | b50f1549701eb950921e5d6f2e55ba1a1dadbb43 (diff) |
Notes
Diffstat (limited to 'test/support/demangle.h')
-rw-r--r-- | test/support/demangle.h | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/test/support/demangle.h b/test/support/demangle.h new file mode 100644 index 000000000000..2a9757d80454 --- /dev/null +++ b/test/support/demangle.h @@ -0,0 +1,49 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#ifndef SUPPORT_DEMANGLE_H +#define SUPPORT_DEMANGLE_H + +#include "test_macros.h" +#include <string> +#include <cstdlib> + +#if !defined(TEST_HAS_NO_DEMANGLE) +# if defined(__GNUC__) || defined(__clang__) +# if __has_include("cxxabi.h") +# include "cxxabi.h" +# else +# define TEST_HAS_NO_DEMANGLE +# endif +# else +# define TEST_HAS_NO_DEMANGLE +# endif +#endif + +#if defined(TEST_HAS_NO_DEMANGLE) +inline std::string demangle(const char* mangled_name) { + return mangled_name; +} +#else +template <size_t N> struct Printer; +inline std::string demangle(const char* mangled_name) { + int status = 0; + std::string input(mangled_name); + input.insert(0, "_Z"); + char* out = __cxxabiv1::__cxa_demangle(input.c_str(), nullptr, nullptr, &status); + if (out != nullptr) { + std::string res(out); + std::free(out); + return res; + } + return mangled_name; +} +#endif + +#endif // SUPPORT_DEMANGLE_H |