[libcxxabi][Demangle] Don't drop ctor/dtor name for abi-tagged structures

Before this patch we would demangle abi-tagged structures as follows:
```
$ c++filt -n _ZN1SB5OuterC2Ev
S[abi:Outer]:()

$ c++filt -n _ZN1SB5OuterD2Ev
S[abi:Outer]::~()
```

This is because `Node::getBaseName` was unimplemented for the
`AbiTagAttr` node, which meant that when we tried printing `CtorDtorName`
where its `Basename` `Node` was an `AbiTagAttr`, we'd drop the
name.

Addresses https://github.com/llvm/llvm-project/issues/61213

Differential Revision: https://reviews.llvm.org/D145492
This commit is contained in:
Michael Buch
2023-03-07 13:18:07 +00:00
parent 50b58e89a1
commit 4601bcdb7e
4 changed files with 9 additions and 2 deletions

View File

@@ -544,6 +544,8 @@ struct AbiTagAttr : Node {
template<typename Fn> 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:";

View File

@@ -30112,6 +30112,8 @@ const char* cases[][2] =
"::basic_ostream()"},
{"_ZNSsC1Ev", "std::basic_string<char, std::char_traits<char>,"
" std::allocator<char>>::basic_string()"},
{"_ZN1SB8ctor_tagC2Ev", "S[abi:ctor_tag]::S()"},
{"_ZN1SB8ctor_tagD2Ev", "S[abi:ctor_tag]::~S()"},
};
const unsigned N = sizeof(cases) / sizeof(cases[0]);

View File

@@ -537,6 +537,8 @@ struct AbiTagAttr : Node {
template<typename Fn> 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:";

View File

@@ -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()