1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker 15*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_DEBUGGING_INTERNAL_DEMANGLE_H_ 16*9356374aSAndroid Build Coastguard Worker #define ABSL_DEBUGGING_INTERNAL_DEMANGLE_H_ 17*9356374aSAndroid Build Coastguard Worker 18*9356374aSAndroid Build Coastguard Worker #include <string> 19*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h" 20*9356374aSAndroid Build Coastguard Worker 21*9356374aSAndroid Build Coastguard Worker namespace absl { 22*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN 23*9356374aSAndroid Build Coastguard Worker namespace debugging_internal { 24*9356374aSAndroid Build Coastguard Worker 25*9356374aSAndroid Build Coastguard Worker // Demangle `mangled`. On success, return true and write the 26*9356374aSAndroid Build Coastguard Worker // demangled symbol name to `out`. Otherwise, return false. 27*9356374aSAndroid Build Coastguard Worker // `out` is modified even if demangling is unsuccessful. 28*9356374aSAndroid Build Coastguard Worker // 29*9356374aSAndroid Build Coastguard Worker // This function provides an alternative to libstdc++'s abi::__cxa_demangle, 30*9356374aSAndroid Build Coastguard Worker // which is not async signal safe (it uses malloc internally). It's intended to 31*9356374aSAndroid Build Coastguard Worker // be used in async signal handlers to symbolize stack traces. 32*9356374aSAndroid Build Coastguard Worker // 33*9356374aSAndroid Build Coastguard Worker // Note that this demangler doesn't support full demangling. More 34*9356374aSAndroid Build Coastguard Worker // specifically, it doesn't print types of function parameters and 35*9356374aSAndroid Build Coastguard Worker // types of template arguments. It just skips them. However, it's 36*9356374aSAndroid Build Coastguard Worker // still very useful to extract basic information such as class, 37*9356374aSAndroid Build Coastguard Worker // function, constructor, destructor, and operator names. 38*9356374aSAndroid Build Coastguard Worker // 39*9356374aSAndroid Build Coastguard Worker // See the implementation note in demangle.cc if you are interested. 40*9356374aSAndroid Build Coastguard Worker // 41*9356374aSAndroid Build Coastguard Worker // Example: 42*9356374aSAndroid Build Coastguard Worker // 43*9356374aSAndroid Build Coastguard Worker // | Mangled Name | Demangle | DemangleString 44*9356374aSAndroid Build Coastguard Worker // |---------------|-------------|----------------------- 45*9356374aSAndroid Build Coastguard Worker // | _Z1fv | f() | f() 46*9356374aSAndroid Build Coastguard Worker // | _Z1fi | f() | f(int) 47*9356374aSAndroid Build Coastguard Worker // | _Z3foo3bar | foo() | foo(bar) 48*9356374aSAndroid Build Coastguard Worker // | _Z1fIiEvi | f<>() | void f<int>(int) 49*9356374aSAndroid Build Coastguard Worker // | _ZN1N1fE | N::f | N::f 50*9356374aSAndroid Build Coastguard Worker // | _ZN3Foo3BarEv | Foo::Bar() | Foo::Bar() 51*9356374aSAndroid Build Coastguard Worker // | _Zrm1XS_" | operator%() | operator%(X, X) 52*9356374aSAndroid Build Coastguard Worker // | _ZN3FooC1Ev | Foo::Foo() | Foo::Foo() 53*9356374aSAndroid Build Coastguard Worker // | _Z1fSs | f() | f(std::basic_string<char, 54*9356374aSAndroid Build Coastguard Worker // | | | std::char_traits<char>, 55*9356374aSAndroid Build Coastguard Worker // | | | std::allocator<char> >) 56*9356374aSAndroid Build Coastguard Worker // 57*9356374aSAndroid Build Coastguard Worker // See the unit test for more examples. 58*9356374aSAndroid Build Coastguard Worker // 59*9356374aSAndroid Build Coastguard Worker // Demangle also recognizes Rust mangled names by delegating the parsing of 60*9356374aSAndroid Build Coastguard Worker // anything that starts with _R to DemangleRustSymbolEncoding (demangle_rust.h). 61*9356374aSAndroid Build Coastguard Worker // 62*9356374aSAndroid Build Coastguard Worker // Note: we might want to write demanglers for ABIs other than Itanium 63*9356374aSAndroid Build Coastguard Worker // C++ ABI in the future. 64*9356374aSAndroid Build Coastguard Worker bool Demangle(const char* mangled, char* out, size_t out_size); 65*9356374aSAndroid Build Coastguard Worker 66*9356374aSAndroid Build Coastguard Worker // A wrapper around `abi::__cxa_demangle()`. On success, returns the demangled 67*9356374aSAndroid Build Coastguard Worker // name. On failure, returns the input mangled name. 68*9356374aSAndroid Build Coastguard Worker // 69*9356374aSAndroid Build Coastguard Worker // This function is not async-signal-safe. 70*9356374aSAndroid Build Coastguard Worker std::string DemangleString(const char* mangled); 71*9356374aSAndroid Build Coastguard Worker 72*9356374aSAndroid Build Coastguard Worker } // namespace debugging_internal 73*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END 74*9356374aSAndroid Build Coastguard Worker } // namespace absl 75*9356374aSAndroid Build Coastguard Worker 76*9356374aSAndroid Build Coastguard Worker #endif // ABSL_DEBUGGING_INTERNAL_DEMANGLE_H_ 77