diff options
author | Abseil Team <absl-team@google.com> | 2023-09-26 15:27:07 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2023-09-26 15:27:47 -0700 |
commit | 6ab667fd8deba75443fdc0d5c5bbf4588431f1b4 (patch) | |
tree | 1e001cba5a64ac395b77fa561333487729683baa /absl/debugging/internal/demangle.h | |
parent | cced061b3e68da386aaadca0d87e03538ce2bc72 (diff) | |
download | abseil-6ab667fd8deba75443fdc0d5c5bbf4588431f1b4.tar.gz abseil-6ab667fd8deba75443fdc0d5c5bbf4588431f1b4.tar.bz2 abseil-6ab667fd8deba75443fdc0d5c5bbf4588431f1b4.zip |
Add an internal wrapper for `abi::__cxa_demangle()`.
PiperOrigin-RevId: 568665135
Change-Id: I42ec9bc6cfe923777f7b60ea032c7b64428493c9
Diffstat (limited to 'absl/debugging/internal/demangle.h')
-rw-r--r-- | absl/debugging/internal/demangle.h | 68 |
1 files changed, 33 insertions, 35 deletions
diff --git a/absl/debugging/internal/demangle.h b/absl/debugging/internal/demangle.h index 146d1150..e1f15698 100644 --- a/absl/debugging/internal/demangle.h +++ b/absl/debugging/internal/demangle.h @@ -12,23 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef ABSL_DEBUGGING_INTERNAL_DEMANGLE_H_ -#define ABSL_DEBUGGING_INTERNAL_DEMANGLE_H_ - -#include <string> -#include "absl/base/config.h" - -namespace absl { -ABSL_NAMESPACE_BEGIN -namespace debugging_internal { - -// Demangle `mangled`. On success, return true and write the -// demangled symbol name to `out`. Otherwise, return false. -// `out` is modified even if demangling is unsuccessful. +// An async-signal-safe and thread-safe demangler for Itanium C++ ABI +// (aka G++ V3 ABI). // -// This function provides an alternative to libstdc++'s abi::__cxa_demangle, -// which is not async signal safe (it uses malloc internally). It's intended to -// be used in async signal handlers to symbolize stack traces. +// The demangler is implemented to be used in async signal handlers to +// symbolize stack traces. We cannot use libstdc++'s +// abi::__cxa_demangle() in such signal handlers since it's not async +// signal safe (it uses malloc() internally). // // Note that this demangler doesn't support full demangling. More // specifically, it doesn't print types of function parameters and @@ -40,31 +30,39 @@ namespace debugging_internal { // // Example: // -// | Mangled Name | Demangle | DemangleString -// |---------------|-------------|----------------------- -// | _Z1fv | f() | f() -// | _Z1fi | f() | f(int) -// | _Z3foo3bar | foo() | foo(bar) -// | _Z1fIiEvi | f<>() | void f<int>(int) -// | _ZN1N1fE | N::f | N::f -// | _ZN3Foo3BarEv | Foo::Bar() | Foo::Bar() -// | _Zrm1XS_" | operator%() | operator%(X, X) -// | _ZN3FooC1Ev | Foo::Foo() | Foo::Foo() -// | _Z1fSs | f() | f(std::basic_string<char, -// | | | std::char_traits<char>, -// | | | std::allocator<char> >) +// | Mangled Name | The Demangler | abi::__cxa_demangle() +// |---------------|---------------|----------------------- +// | _Z1fv | f() | f() +// | _Z1fi | f() | f(int) +// | _Z3foo3bar | foo() | foo(bar) +// | _Z1fIiEvi | f<>() | void f<int>(int) +// | _ZN1N1fE | N::f | N::f +// | _ZN3Foo3BarEv | Foo::Bar() | Foo::Bar() +// | _Zrm1XS_" | operator%() | operator%(X, X) +// | _ZN3FooC1Ev | Foo::Foo() | Foo::Foo() +// | _Z1fSs | f() | f(std::basic_string<char, +// | | | std::char_traits<char>, +// | | | std::allocator<char> >) // // See the unit test for more examples. // // Note: we might want to write demanglers for ABIs other than Itanium // C++ ABI in the future. -bool Demangle(const char* mangled, char* out, size_t out_size); - -// A wrapper around `abi::__cxa_demangle()`. On success, returns the demangled -// name. On failure, returns the input mangled name. // -// This function is not async-signal-safe. -std::string DemangleString(const char* mangled); + +#ifndef ABSL_DEBUGGING_INTERNAL_DEMANGLE_H_ +#define ABSL_DEBUGGING_INTERNAL_DEMANGLE_H_ + +#include "absl/base/config.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace debugging_internal { + +// Demangle `mangled`. On success, return true and write the +// demangled symbol name to `out`. Otherwise, return false. +// `out` is modified even if demangling is unsuccessful. +bool Demangle(const char* mangled, char* out, size_t out_size); } // namespace debugging_internal ABSL_NAMESPACE_END |