github.com/searKing/golang/go@v1.2.117/runtime/cgosymbolizer/include/boost/core/demangle.hpp (about)

     1  #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED
     2  #define BOOST_CORE_DEMANGLE_HPP_INCLUDED
     3  
     4  // core::demangle
     5  //
     6  // Copyright 2014 Peter Dimov
     7  // Copyright 2014 Andrey Semashev
     8  //
     9  // Distributed under the Boost Software License, Version 1.0.
    10  // See accompanying file LICENSE_1_0.txt or copy at
    11  // http://www.boost.org/LICENSE_1_0.txt
    12  
    13  #include <boost/config.hpp>
    14  #include <string>
    15  
    16  #if defined(BOOST_HAS_PRAGMA_ONCE)
    17  # pragma once
    18  #endif
    19  
    20  // __has_include is currently supported by GCC and Clang. However GCC 4.9 may have issues and
    21  // returns 1 for 'defined( __has_include )', while '__has_include' is actually not supported:
    22  // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63662
    23  #if defined( __has_include ) && (!defined( BOOST_GCC ) || (__GNUC__ + 0) >= 5)
    24  # if __has_include(<cxxabi.h>)
    25  #  define BOOST_CORE_HAS_CXXABI_H
    26  # endif
    27  #elif defined( __GLIBCXX__ ) || defined( __GLIBCPP__ )
    28  # define BOOST_CORE_HAS_CXXABI_H
    29  #endif
    30  
    31  #if defined( BOOST_CORE_HAS_CXXABI_H )
    32  # include <cxxabi.h>
    33  // For some archtectures (mips, mips64, x86, x86_64) cxxabi.h in Android NDK is implemented by gabi++ library
    34  // (https://android.googlesource.com/platform/ndk/+/master/sources/cxx-stl/gabi++/), which does not implement
    35  // abi::__cxa_demangle(). We detect this implementation by checking the include guard here.
    36  # if defined( __GABIXX_CXXABI_H__ )
    37  #  undef BOOST_CORE_HAS_CXXABI_H
    38  # else
    39  #  include <cstdlib>
    40  #  include <cstddef>
    41  # endif
    42  #endif
    43  
    44  namespace boost
    45  {
    46  
    47  namespace core
    48  {
    49  
    50  inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT;
    51  inline void demangle_free( char const * name ) BOOST_NOEXCEPT;
    52  
    53  class scoped_demangled_name
    54  {
    55  private:
    56      char const * m_p;
    57  
    58  public:
    59      explicit scoped_demangled_name( char const * name ) BOOST_NOEXCEPT :
    60          m_p( demangle_alloc( name ) )
    61      {
    62      }
    63  
    64      ~scoped_demangled_name() BOOST_NOEXCEPT
    65      {
    66          demangle_free( m_p );
    67      }
    68  
    69      char const * get() const BOOST_NOEXCEPT
    70      {
    71          return m_p;
    72      }
    73  
    74      BOOST_DELETED_FUNCTION(scoped_demangled_name( scoped_demangled_name const& ))
    75      BOOST_DELETED_FUNCTION(scoped_demangled_name& operator= ( scoped_demangled_name const& ))
    76  };
    77  
    78  
    79  #if defined( BOOST_CORE_HAS_CXXABI_H )
    80  
    81  inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
    82  {
    83      int status = 0;
    84      std::size_t size = 0;
    85      return abi::__cxa_demangle( name, NULL, &size, &status );
    86  }
    87  
    88  inline void demangle_free( char const * name ) BOOST_NOEXCEPT
    89  {
    90      std::free( const_cast< char* >( name ) );
    91  }
    92  
    93  inline std::string demangle( char const * name )
    94  {
    95      scoped_demangled_name demangled_name( name );
    96      char const * p = demangled_name.get();
    97      if( !p )
    98          p = name;
    99      return p;
   100  }
   101  
   102  #else
   103  
   104  inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
   105  {
   106      return name;
   107  }
   108  
   109  inline void demangle_free( char const * ) BOOST_NOEXCEPT
   110  {
   111  }
   112  
   113  inline std::string demangle( char const * name )
   114  {
   115      return name;
   116  }
   117  
   118  #endif
   119  
   120  } // namespace core
   121  
   122  } // namespace boost
   123  
   124  #undef BOOST_CORE_HAS_CXXABI_H
   125  
   126  #endif // #ifndef BOOST_CORE_DEMANGLE_HPP_INCLUDED