Skip to content

Commit

Permalink
[demangler] Add ItaniumPartialDemangler::isCtorOrDtor
Browse files Browse the repository at this point in the history
Reviewers: erik.pilkington, ruiu, echristo, pcc

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D47248

llvm-svn: 333159
  • Loading branch information
MaskRay committed May 24, 2018
1 parent 43bfe84 commit 79420ac
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 0 deletions.
3 changes: 3 additions & 0 deletions llvm/include/llvm/Demangle/Demangle.h
Expand Up @@ -63,6 +63,9 @@ struct ItaniumPartialDemangler {
/// the function is a non-static member function.
bool hasFunctionQualifiers() const;

/// If this symbol describes a constructor or destructor.
bool isCtorOrDtor() const;

/// If this symbol describes a function.
bool isFunction() const;

Expand Down
32 changes: 32 additions & 0 deletions llvm/lib/Demangle/ItaniumDemangle.cpp
Expand Up @@ -5264,6 +5264,38 @@ bool ItaniumPartialDemangler::hasFunctionQualifiers() const {
return E->getCVQuals() != QualNone || E->getRefQual() != FrefQualNone;
}

bool ItaniumPartialDemangler::isCtorOrDtor() const {
Node *N = static_cast<Node *>(RootNode);
while (N) {
switch (N->getKind()) {
default:
return false;
case Node::KCtorDtorName:
return true;

case Node::KAbiTagAttr:
N = static_cast<AbiTagAttr *>(N)->Base;
break;
case Node::KFunctionEncoding:
N = static_cast<FunctionEncoding *>(N)->getName();
break;
case Node::KLocalName:
N = static_cast<LocalName *>(N)->Entity;
break;
case Node::KNameWithTemplateArgs:
N = static_cast<NameWithTemplateArgs *>(N)->Name;
break;
case Node::KNestedName:
N = static_cast<NestedName *>(N)->Name;
break;
case Node::KStdQualifiedName:
N = static_cast<StdQualifiedName *>(N)->Child;
break;
}
}
return false;
}

bool ItaniumPartialDemangler::isFunction() const {
assert(RootNode != nullptr && "must call partialDemangle()");
return static_cast<Node *>(RootNode)->getKind() == Node::KFunctionEncoding;
Expand Down
26 changes: 26 additions & 0 deletions llvm/unittests/Demangle/PartialDemangleTest.cpp
Expand Up @@ -109,6 +109,32 @@ TEST(PartialDemangleTest, TestNameMeta) {
EXPECT_TRUE(Demangler.isData());
}

TEST(PartialDemanglerTest, TestCtorOrDtor) {
static const char *Pos[] = {
"_ZN1AC1Ev", // A::A()
"_ZN1AC1IiEET_", // A::A<int>(int)
"_ZN1AD2Ev", // A::~A()
"_ZN1BIiEC1IcEET_", // B<int>::B<char>(char)
"_ZN1AC1B1TEv", // A::A[abi:T]()
"_ZNSt1AD2Ev", // std::A::~A()
"_ZN2ns1AD1Ev", // ns::A::~A()
};
static const char *Neg[] = {
"_Z1fv",
"_ZN1A1gIiEEvT_", // void A::g<int>(int)
};

llvm::ItaniumPartialDemangler D;
for (const char *N : Pos) {
EXPECT_FALSE(D.partialDemangle(N));
EXPECT_TRUE(D.isCtorOrDtor());
}
for (const char *N : Neg) {
EXPECT_FALSE(D.partialDemangle(N));
EXPECT_FALSE(D.isCtorOrDtor());
}
}

TEST(PartialDemanglerTest, TestMisc) {
llvm::ItaniumPartialDemangler D1, D2;

Expand Down

0 comments on commit 79420ac

Please sign in to comment.