diff options
-rw-r--r-- | libcxxabi/src/demangle/ItaniumDemangle.h | 4 | ||||
-rw-r--r-- | libcxxabi/test/test_demangle.pass.cpp | 4 | ||||
-rw-r--r-- | llvm/include/llvm/Demangle/ItaniumDemangle.h | 4 |
3 files changed, 8 insertions, 4 deletions
diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index 53107c9c8d9..9a54ff5d80d 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/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/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index 7c1fd2dd669..09ba0434841 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/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]); diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index 53107c9c8d9..9a54ff5d80d 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/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; |