[llvm] 8d38273 - [demangler] Fix unresolvedname demangling
Nathan Sidwell via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 7 07:52:01 PST 2022
Author: Nathan Sidwell
Date: 2022-02-07T07:49:30-08:00
New Revision: 8d38273a3dae41e8da381542a20fbd09d4ccedc2
URL: https://github.com/llvm/llvm-project/commit/8d38273a3dae41e8da381542a20fbd09d4ccedc2
DIFF: https://github.com/llvm/llvm-project/commit/8d38273a3dae41e8da381542a20fbd09d4ccedc2.diff
LOG: [demangler] Fix unresolvedname demangling
We were dropping the [gs] modifier by parsing it in parseExpr, but not
forwarding it on to parseUnresolvedName. This is the straightforwards
fix to forward that flag -- parseExpr must see past it.
Reviewed By: ChuanqiXu
Differential Revision: https://reviews.llvm.org/D118504
Added:
Modified:
libcxxabi/src/demangle/ItaniumDemangle.h
libcxxabi/test/test_demangle.pass.cpp
llvm/include/llvm/Demangle/ItaniumDemangle.h
Removed:
################################################################################
diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index b835345bed220..c8a77adc9fafd 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -2551,7 +2551,7 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
Node *parseAbiTags(Node *N);
/// Parse the <unresolved-name> production.
- Node *parseUnresolvedName();
+ Node *parseUnresolvedName(bool Global);
Node *parseSimpleId();
Node *parseBaseUnresolvedName();
Node *parseUnresolvedType();
@@ -3353,6 +3353,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() {
// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
// # A::x, N::y, A<T>::z; "gs" means leading "::"
+// [gs] has been parsed by caller.
// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
// # T::N::x /decltype(p)::N::x
@@ -3360,7 +3361,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() {
//
// <unresolved-qualifier-level> ::= <simple-id>
template <typename Derived, typename Alloc>
-Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() {
+Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName(bool Global) {
Node *SoFar = nullptr;
// srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
@@ -3394,8 +3395,6 @@ Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() {
return make<QualifiedName>(SoFar, Base);
}
- bool Global = consumeIf("gs");
-
// [gs] <base-unresolved-name> # x or (with "gs") ::x
if (!consumeIf("sr")) {
SoFar = getDerived().parseBaseUnresolvedName();
@@ -4695,7 +4694,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
return make<DeleteExpr>(E, Global, /*is_array=*/false);
}
case 'n':
- return getDerived().parseUnresolvedName();
+ return getDerived().parseUnresolvedName(Global);
case 's': {
First += 2;
Node *LHS = getDerived().parseExpr();
@@ -4840,7 +4839,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
case 'o':
switch (First[1]) {
case 'n':
- return getDerived().parseUnresolvedName();
+ return getDerived().parseUnresolvedName(Global);
case 'o':
First += 2;
return getDerived().parseBinaryExpr("||");
@@ -4951,7 +4950,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
return make<ParameterPackExpansion>(Child);
}
case 'r':
- return getDerived().parseUnresolvedName();
+ return getDerived().parseUnresolvedName(Global);
case 't': {
First += 2;
Node *Ty = getDerived().parseType();
@@ -5084,7 +5083,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
case '7':
case '8':
case '9':
- return getDerived().parseUnresolvedName();
+ return getDerived().parseUnresolvedName(Global);
}
return nullptr;
}
diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index 41ee1100d12d2..191b4b686969b 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -29856,6 +29856,8 @@ const char* cases[][2] =
// See https://llvm.org/PR51407
{"_Zcv1BIRT_EIS1_E", "operator B<><>"},
+ {"_ZN2FnIXgs4BaseEX4BaseEEEvv","void Fn<::Base, Base>()"},
+
{"_Z3TPLIiET_S0_", "int TPL<int>(int)"},
};
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index 6ac77124ed07c..4ffac53790d0d 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -2551,7 +2551,7 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
Node *parseAbiTags(Node *N);
/// Parse the <unresolved-name> production.
- Node *parseUnresolvedName();
+ Node *parseUnresolvedName(bool Global);
Node *parseSimpleId();
Node *parseBaseUnresolvedName();
Node *parseUnresolvedType();
@@ -3353,6 +3353,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() {
// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
// # A::x, N::y, A<T>::z; "gs" means leading "::"
+// [gs] has been parsed by caller.
// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
// # T::N::x /decltype(p)::N::x
@@ -3360,7 +3361,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseBaseUnresolvedName() {
//
// <unresolved-qualifier-level> ::= <simple-id>
template <typename Derived, typename Alloc>
-Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() {
+Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName(bool Global) {
Node *SoFar = nullptr;
// srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
@@ -3394,8 +3395,6 @@ Node *AbstractManglingParser<Derived, Alloc>::parseUnresolvedName() {
return make<QualifiedName>(SoFar, Base);
}
- bool Global = consumeIf("gs");
-
// [gs] <base-unresolved-name> # x or (with "gs") ::x
if (!consumeIf("sr")) {
SoFar = getDerived().parseBaseUnresolvedName();
@@ -4695,7 +4694,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
return make<DeleteExpr>(E, Global, /*is_array=*/false);
}
case 'n':
- return getDerived().parseUnresolvedName();
+ return getDerived().parseUnresolvedName(Global);
case 's': {
First += 2;
Node *LHS = getDerived().parseExpr();
@@ -4840,7 +4839,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
case 'o':
switch (First[1]) {
case 'n':
- return getDerived().parseUnresolvedName();
+ return getDerived().parseUnresolvedName(Global);
case 'o':
First += 2;
return getDerived().parseBinaryExpr("||");
@@ -4951,7 +4950,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
return make<ParameterPackExpansion>(Child);
}
case 'r':
- return getDerived().parseUnresolvedName();
+ return getDerived().parseUnresolvedName(Global);
case 't': {
First += 2;
Node *Ty = getDerived().parseType();
@@ -5084,7 +5083,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
case '7':
case '8':
case '9':
- return getDerived().parseUnresolvedName();
+ return getDerived().parseUnresolvedName(Global);
}
return nullptr;
}
More information about the llvm-commits
mailing list