diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -544,6 +544,8 @@ template void match(Fn F) const { F(Base, Tag); } + StringView getBaseName() const override { return Base->getBaseName(); } + void printLeft(OutputBuffer &OB) const override { Base->printLeft(OB); OB += "[abi:"; diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -30112,6 +30112,8 @@ "::basic_ostream()"}, {"_ZNSsC1Ev", "std::basic_string," " std::allocator>::basic_string()"}, + {"_ZN1SB8ctor_tagC2Ev", "S[abi:ctor_tag]::S()"}, + {"_ZN1SB8ctor_tagD2Ev", "S[abi:ctor_tag]::~S()"}, }; const unsigned N = sizeof(cases) / sizeof(cases[0]); diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -537,6 +537,8 @@ template void match(Fn F) const { F(Base, Tag); } + StringView getBaseName() const override { return Base->getBaseName(); } + void printLeft(OutputBuffer &OB) const override { Base->printLeft(OB); OB += "[abi:"; diff --git a/llvm/test/tools/llvm-cxxfilt/abitag.test b/llvm/test/tools/llvm-cxxfilt/abitag.test --- a/llvm/test/tools/llvm-cxxfilt/abitag.test +++ b/llvm/test/tools/llvm-cxxfilt/abitag.test @@ -1,6 +1,7 @@ -RUN: llvm-cxxfilt -n _Z14returns_stringB5cxx11v _Z6globalB5cxx11 _Z6globalB12a_longer_tag | FileCheck %s +RUN: llvm-cxxfilt -n _Z14returns_stringB5cxx11v _Z6globalB5cxx11 _Z6globalB12a_longer_tag _ZN6globalB3TagC2Ev _ZN6globalB3TagD2Ev | FileCheck %s CHECK: returns_string[abi:cxx11]() CHECK-NEXT: global[abi:cxx11] CHECK-NEXT: global[abi:a_longer_tag] - +CHECK-NEXT: global[abi:Tag]::global() +CHECK-NEXT: global[abi:Tag]::~global()