summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Pilkington <erik.pilkington@gmail.com>2019-01-17 21:37:36 +0000
committerErik Pilkington <erik.pilkington@gmail.com>2019-01-17 21:37:36 +0000
commit394048ed3592c116efa443326891e4afe226b534 (patch)
treef60fe99b6028bdadf499fde1b468a51a3ae94861
parent5057ba8643a728cc8516af75a409d885c5e99b7c (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.h4
-rw-r--r--test/test_demangle.pass.cpp4
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]);