diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2019-01-17 21:37:36 +0000 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2019-01-17 21:37:36 +0000 |
commit | 394048ed3592c116efa443326891e4afe226b534 (patch) | |
tree | f60fe99b6028bdadf499fde1b468a51a3ae94861 | |
parent | 5057ba8643a728cc8516af75a409d885c5e99b7c (diff) |
[demangler] Ignore leading underscores if present
On MacOS, symbols start with a leading underscore, so just parse and
ignore it if present.
git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@351481 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | src/demangle/ItaniumDemangle.h | 4 | ||||
-rw-r--r-- | test/test_demangle.pass.cpp | 4 |
2 files changed, 6 insertions, 2 deletions
diff --git a/src/demangle/ItaniumDemangle.h b/src/demangle/ItaniumDemangle.h index 53107c9..9a54ff5 100644 --- a/src/demangle/ItaniumDemangle.h +++ b/src/demangle/ItaniumDemangle.h @@ -5143,7 +5143,7 @@ AbstractManglingParser<Derived, Alloc>::parseTemplateArgs(bool TagTemplates) { // extension ::= ___Z <encoding> _block_invoke_<decimal-digit>+ template <typename Derived, typename Alloc> Node *AbstractManglingParser<Derived, Alloc>::parse() { - if (consumeIf("_Z")) { + if (consumeIf("_Z") || consumeIf("__Z")) { Node *Encoding = getDerived().parseEncoding(); if (Encoding == nullptr) return nullptr; @@ -5156,7 +5156,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parse() { return Encoding; } - if (consumeIf("___Z")) { + if (consumeIf("___Z") || consumeIf("____Z")) { Node *Encoding = getDerived().parseEncoding(); if (Encoding == nullptr || !consumeIf("_block_invoke")) return nullptr; diff --git a/test/test_demangle.pass.cpp b/test/test_demangle.pass.cpp index 7c1fd2d..09ba043 100644 --- a/test/test_demangle.pass.cpp +++ b/test/test_demangle.pass.cpp @@ -29755,6 +29755,10 @@ const char* cases[][2] = {"_Z1fIJR1SS0_EEiDpOT_", "int f<S&, S>(S&, S&&)"}, {"___Z3foo_block_invoke.25", "invocation function for block in foo"}, + + // Darwin adds leading underscores to symbols, just demangle them anyways. + {"____Z3foo_block_invoke.25", "invocation function for block in foo"}, + {"__Z1fv", "f()"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); |