diff options
author | Ted Mielczarek <ted@mielczarek.org> | 2016-10-24 15:16:28 -0400 |
---|---|---|
committer | Ted Mielczarek <ted@mielczarek.org> | 2016-10-25 10:43:00 +0000 |
commit | 2ecb2baba829a7ed4fff4bc60edf0c1643dc129c (patch) | |
tree | 4106bbadd878c7148c9393e33d5bf5cbb3024f2b /src/common/language.cc | |
parent | Fix iterating over the MDXStateFeature entries on 32-bit hosts (diff) | |
download | breakpad-2ecb2baba829a7ed4fff4bc60edf0c1643dc129c.tar.xz |
Don't demangle Rust symbols by default, but allow linking to rust-demangle.
The Rust compiler uses GCC C++ name mangling, but it has another layer of
encoding so abi::cxa_demangle doesn't produce great results. This patch
changes dump_syms to dump unmangled names by default so that consumers can
demangle them after-the-fact.
It also adds a tiny bit of support for linking against a Rust library I wrote
that can demangle Rust symbols nicely:
https://github.com/luser/rust-demangle-capi
BUG=
Change-Id: I63a425035ebb7ac516f067fed2aa782849ea9604
Reviewed-on: https://chromium-review.googlesource.com/402308
Reviewed-by: Mark Mentovai <mark@chromium.org>
Diffstat (limited to 'src/common/language.cc')
-rw-r--r-- | src/common/language.cc | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/common/language.cc b/src/common/language.cc index 087395e9..09eaceb6 100644 --- a/src/common/language.cc +++ b/src/common/language.cc @@ -40,6 +40,10 @@ #include <cxxabi.h> #endif +#if defined(HAVE_RUST_DEMANGLE) +#include <rust_demangle.h> +#endif + #include <limits> namespace { @@ -136,6 +140,40 @@ class SwiftLanguage: public Language { SwiftLanguage SwiftLanguageSingleton; +// Rust language-specific operations. +class RustLanguage: public Language { + public: + RustLanguage() {} + + string MakeQualifiedName(const string &parent_name, + const string &name) const { + return MakeQualifiedNameWithSeparator(parent_name, ".", name); + } + + virtual DemangleResult DemangleName(const string& mangled, + std::string* demangled) const { + // Rust names use GCC C++ name mangling, but demangling them with + // abi_demangle doesn't produce stellar results due to them having + // another layer of encoding. + // If callers provide rustc-demangle, use that. +#if defined(HAVE_RUST_DEMANGLE) + char* rust_demangled = rust_demangle(mangled.c_str()); + if (rust_demangled == nullptr) { + return kDemangleFailure; + } + demangled->assign(rust_demangled); + free_rust_demangled_name(rust_demangled); +#else + // Otherwise, pass through the mangled name so callers can demangle + // after the fact. + demangled->assign(mangled); +#endif + return kDemangleSuccess; + } +}; + +RustLanguage RustLanguageSingleton; + // Assembler language-specific operations. class AssemblerLanguage: public Language { public: @@ -153,6 +191,7 @@ AssemblerLanguage AssemblerLanguageSingleton; const Language * const Language::CPlusPlus = &CPPLanguageSingleton; const Language * const Language::Java = &JavaLanguageSingleton; const Language * const Language::Swift = &SwiftLanguageSingleton; +const Language * const Language::Rust = &RustLanguageSingleton; const Language * const Language::Assembler = &AssemblerLanguageSingleton; } // namespace google_breakpad |