Chris@102
|
1 #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
|
Chris@102
|
2 #define BOOST_CORE_DEMANGLE_HPP_INCLUDED
|
Chris@102
|
3
|
Chris@102
|
4 // core::demangle
|
Chris@102
|
5 //
|
Chris@102
|
6 // Copyright 2014 Peter Dimov
|
Chris@102
|
7 // Copyright 2014 Andrey Semashev
|
Chris@102
|
8 //
|
Chris@102
|
9 // Distributed under the Boost Software License, Version 1.0.
|
Chris@102
|
10 // See accompanying file LICENSE_1_0.txt or copy at
|
Chris@102
|
11 // http://www.boost.org/LICENSE_1_0.txt
|
Chris@102
|
12
|
Chris@102
|
13 #include <boost/config.hpp>
|
Chris@102
|
14 #include <string>
|
Chris@102
|
15
|
Chris@102
|
16 #if defined(BOOST_HAS_PRAGMA_ONCE)
|
Chris@102
|
17 # pragma once
|
Chris@102
|
18 #endif
|
Chris@102
|
19
|
Chris@102
|
20 #if defined( __clang__ ) && defined( __has_include )
|
Chris@102
|
21 # if __has_include(<cxxabi.h>)
|
Chris@102
|
22 # define BOOST_CORE_HAS_CXXABI_H
|
Chris@102
|
23 # endif
|
Chris@102
|
24 #elif defined( __GLIBCXX__ ) || defined( __GLIBCPP__ )
|
Chris@102
|
25 # define BOOST_CORE_HAS_CXXABI_H
|
Chris@102
|
26 #endif
|
Chris@102
|
27
|
Chris@102
|
28 #if defined( BOOST_CORE_HAS_CXXABI_H )
|
Chris@102
|
29 # include <cxxabi.h>
|
Chris@102
|
30 # include <cstdlib>
|
Chris@102
|
31 # include <cstddef>
|
Chris@102
|
32 #endif
|
Chris@102
|
33
|
Chris@102
|
34 namespace boost
|
Chris@102
|
35 {
|
Chris@102
|
36
|
Chris@102
|
37 namespace core
|
Chris@102
|
38 {
|
Chris@102
|
39
|
Chris@102
|
40 inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT;
|
Chris@102
|
41 inline void demangle_free( char const * name ) BOOST_NOEXCEPT;
|
Chris@102
|
42
|
Chris@102
|
43 class scoped_demangled_name
|
Chris@102
|
44 {
|
Chris@102
|
45 private:
|
Chris@102
|
46 char const * m_p;
|
Chris@102
|
47
|
Chris@102
|
48 public:
|
Chris@102
|
49 explicit scoped_demangled_name( char const * name ) BOOST_NOEXCEPT :
|
Chris@102
|
50 m_p( demangle_alloc( name ) )
|
Chris@102
|
51 {
|
Chris@102
|
52 }
|
Chris@102
|
53
|
Chris@102
|
54 ~scoped_demangled_name() BOOST_NOEXCEPT
|
Chris@102
|
55 {
|
Chris@102
|
56 demangle_free( m_p );
|
Chris@102
|
57 }
|
Chris@102
|
58
|
Chris@102
|
59 char const * get() const BOOST_NOEXCEPT
|
Chris@102
|
60 {
|
Chris@102
|
61 return m_p;
|
Chris@102
|
62 }
|
Chris@102
|
63
|
Chris@102
|
64 BOOST_DELETED_FUNCTION(scoped_demangled_name( scoped_demangled_name const& ))
|
Chris@102
|
65 BOOST_DELETED_FUNCTION(scoped_demangled_name& operator= ( scoped_demangled_name const& ))
|
Chris@102
|
66 };
|
Chris@102
|
67
|
Chris@102
|
68
|
Chris@102
|
69 #if defined( BOOST_CORE_HAS_CXXABI_H )
|
Chris@102
|
70
|
Chris@102
|
71 inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
|
Chris@102
|
72 {
|
Chris@102
|
73 int status = 0;
|
Chris@102
|
74 std::size_t size = 0;
|
Chris@102
|
75 return abi::__cxa_demangle( name, NULL, &size, &status );
|
Chris@102
|
76 }
|
Chris@102
|
77
|
Chris@102
|
78 inline void demangle_free( char const * name ) BOOST_NOEXCEPT
|
Chris@102
|
79 {
|
Chris@102
|
80 std::free( const_cast< char* >( name ) );
|
Chris@102
|
81 }
|
Chris@102
|
82
|
Chris@102
|
83 inline std::string demangle( char const * name )
|
Chris@102
|
84 {
|
Chris@102
|
85 scoped_demangled_name demangled_name( name );
|
Chris@102
|
86 char const * const p = demangled_name.get();
|
Chris@102
|
87 if( p )
|
Chris@102
|
88 {
|
Chris@102
|
89 return p;
|
Chris@102
|
90 }
|
Chris@102
|
91 else
|
Chris@102
|
92 {
|
Chris@102
|
93 return name;
|
Chris@102
|
94 }
|
Chris@102
|
95 }
|
Chris@102
|
96
|
Chris@102
|
97 #else
|
Chris@102
|
98
|
Chris@102
|
99 inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
|
Chris@102
|
100 {
|
Chris@102
|
101 return name;
|
Chris@102
|
102 }
|
Chris@102
|
103
|
Chris@102
|
104 inline void demangle_free( char const * ) BOOST_NOEXCEPT
|
Chris@102
|
105 {
|
Chris@102
|
106 }
|
Chris@102
|
107
|
Chris@102
|
108 inline std::string demangle( char const * name )
|
Chris@102
|
109 {
|
Chris@102
|
110 return name;
|
Chris@102
|
111 }
|
Chris@102
|
112
|
Chris@102
|
113 #endif
|
Chris@102
|
114
|
Chris@102
|
115 } // namespace core
|
Chris@102
|
116
|
Chris@102
|
117 } // namespace boost
|
Chris@102
|
118
|
Chris@102
|
119 #undef BOOST_CORE_HAS_CXXABI_H
|
Chris@102
|
120
|
Chris@102
|
121 #endif // #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
|