diff options
author | Mark Mentovai <mark@chromium.org> | 2016-09-23 14:22:42 -0400 |
---|---|---|
committer | Mark Mentovai <mark@chromium.org> | 2016-09-23 14:22:42 -0400 |
commit | 7398ce15b79daf038cd07fbae4e37e183e99788d (patch) | |
tree | c6baf6108bf8de9d23f9f574a8102196621b98fd /src/common/language.h | |
parent | generate a repo manifest from the DEPS file (diff) | |
download | breakpad-7398ce15b79daf038cd07fbae4e37e183e99788d.tar.xz |
Initial support for dumping DWARF corresponding to Swift code
The DWARF data for Swift code has a top-level DW_TAG_module DIE as the
child of the DW_TAG_compile_unit DIE and the parent of the
DW_TAG_subprogram DIEs that dump_syms uses to locate functions.
dump_syms needs to process DW_TAG_module DIEs as introducing nested
scopes to make it work with Swift.
This also reworks demangling to be language-specific, so that the C++
demangler isn't invoked when processing Swift code. The DWARF data for
Swift code presents its mangled names in the same form as used for C++
(DW_AT_MIPS_linkage_name or DW_AT_linkage_name) but the mangling is
Swift-specific (beginning with _T instead of _Z). There is no
programmatic interface to a Swift name demangler as an analogue to C++'s
__cxa_demangle(), so mangled Swift names are exposed as-is. Xcode's
"xcrun swift-demangle" can be used to post-process these mangled Swift
names on macOS.
Support for mangled names presented in a DW_AT_linkage_name attribute,
as used by DWARF 4, is added. This supersedes the earlier use of
DW_AT_MIPS_linkage_name.
BUG=google-breakpad:702,google-breakpad:715
R=ted.mielczarek@gmail.com
Review URL: https://codereview.chromium.org/2147523005 .
Diffstat (limited to 'src/common/language.h')
-rw-r--r-- | src/common/language.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/common/language.h b/src/common/language.h index bbe30334..05786199 100644 --- a/src/common/language.h +++ b/src/common/language.h @@ -77,9 +77,25 @@ class Language { virtual string MakeQualifiedName (const string &parent_name, const string &name) const = 0; + enum DemangleResult { + // Demangling was not performed because it’s not appropriate to attempt. + kDontDemangle = -1, + + kDemangleSuccess, + kDemangleFailure, + }; + + // Wraps abi::__cxa_demangle() or similar for languages where appropriate. + virtual DemangleResult DemangleName(const string& mangled, + std::string* demangled) const { + demangled->clear(); + return kDontDemangle; + } + // Instances for specific languages. static const Language * const CPlusPlus, * const Java, + * const Swift, * const Assembler; }; |