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 Workerinline 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 Workerinline 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