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") && !defined(_LIBCPP_ABI_MICROSOFT) 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) demangle(const char * mangled_name)30inline std::string demangle(const char* mangled_name) { 31 return mangled_name; 32 } 33 #else 34 template <size_t N> struct Printer; demangle(const char * mangled_name)35inline std::string demangle(const char* mangled_name) { 36 int status = 0; 37 char* out = __cxxabiv1::__cxa_demangle(mangled_name, nullptr, nullptr, &status); 38 if (out != nullptr) { 39 std::string res(out); 40 std::free(out); 41 return res; 42 } 43 return mangled_name; 44 } 45 #endif 46 47 #endif // SUPPORT_DEMANGLE_H 48