// Copyright 2015 Klemens Morgenstern // // This file provides a demangling for function names, i.e. entry points of a dll. // // Distributed under the Boost Software License, Version 1.0. // See http://www.boost.org/LICENSE_1_0.txt #ifndef BOOST_DLL_DEMANGLE_SYMBOL_HPP_ #define BOOST_DLL_DEMANGLE_SYMBOL_HPP_ #include #include #include #include #if defined(_MSC_VER) // MSVC, Clang-cl, and ICC on Windows namespace boost { namespace dll { namespace detail { typedef void * (__cdecl * allocation_function)(std::size_t); typedef void (__cdecl * free_function)(void *); extern "C" char* __unDName( char* outputString, const char* name, int maxStringLength, // Note, COMMA is leading following optional arguments allocation_function pAlloc, free_function pFree, unsigned short disableFlags ); inline std::string demangle_symbol(const char *mangled_name) { allocation_function alloc = [](std::size_t size){return static_cast(new char[size]);}; free_function free_f = [](void* p){delete [] static_cast(p);}; std::unique_ptr name { __unDName( nullptr, mangled_name, 0, alloc, free_f, static_cast(0))}; return std::string(name.get()); } inline std::string demangle_symbol(const std::string& mangled_name) { return demangle_symbol(mangled_name.c_str()); } }}} #else #include namespace boost { namespace dll { namespace detail { inline std::string demangle_symbol(const char *mangled_name) { if (*mangled_name == '_') { //because it start's with an underline _ auto dm = boost::core::demangle(mangled_name); if (!dm.empty()) return dm; else return (mangled_name); } //could not demangled return ""; } //for my personal convenience inline std::string demangle_symbol(const std::string& mangled_name) { return demangle_symbol(mangled_name.c_str()); } } namespace experimental { using ::boost::dll::detail::demangle_symbol; } }} #endif #endif /* BOOST_DEMANGLE_HPP_ */